Unbegrenzter Ressourcenverbrauch
Eine Anfrage, eine Viertelmillion Datensätze, keine Obergrenze in Sicht.
Was ist Unbegrenzter Ressourcenverbrauch?
Bei einigen Endpunkten gibt es keine Begrenzung dafür, wie viel Arbeit eine Anfrage erfordern kann. Ein Listenendpunkt übernimmt seine Seitengröße direkt aus der Anfrage und übergibt sie ohne serverseitiges Maximum an die Datenbank, sodass ein Aufrufer die gesamte Tabelle anfordern kann. Sie erfassen den vom Anrufer gesteuerten Grenzwertparameter, erstellen die Anfrage neu und fragen nach allem und beobachten, wie eine Antwort den gesamten Katalog durchsucht, während sie die Datenbank anheftet. Der Fix legt die Seitengröße serverseitig fest und koppelt sie mit der Cursor-Paginierung. Eine erneute Prüfung gibt einen begrenzten Wert von 200 OK zurück.
Was Sie lernen in Unbegrenzter Ressourcenverbrauch
- Unbegrenzten Ressourcenverbrauch erkennen: Ein Endpunkt begrenzt nicht, wie viel eine einzelne Anfrage verbrauchen darf, sodass ein einziger Aufruf beliebig viel Arbeit erzwingen kann
- Verstehen, dass eine vom Aufrufer gelieferte Seitengröße (oder Anzahl, Größe oder Tiefe) ohne serverseitiges Maximum dazu führt, dass eine einzige Anfrage den gesamten Datenbestand auf einmal zurückgibt
- Nachvollziehen, dass eine Seitengröße ohne Obergrenze zugleich ein Vektor für den Massenabgriff und ein Hebel für einen Denial-of-Service ist, weil eine einzige überdimensionierte Anfrage den Arbeitsspeicher erschöpft und eine Datenbankverbindung blockiert
- Diese Schwachstelle von Zugriffsfehlern auf Objektebene, von der Über-Serialisierung einzelner Felder und von Lücken in der Authentifizierung unterscheiden; hier ist die Authentifizierung in Ordnung, und was fehlt, ist eine Ressourcengrenze pro Anfrage
- Die Lösung anwenden: die angeforderte Seitengröße auf ein serverseitiges Maximum begrenzen, die Obergrenze auf dem Server halten, große Ergebnismengen per Cursor in Seiten aufteilen und ein Rate Limit pro Client und Zeitfenster ergänzen
Unbegrenzter Ressourcenverbrauch — Trainingsschritte
-
Ein öffentlicher Inserate-Feed
Vendlo ist eine App für einen Gebrauchtwaren-Marktplatz: Mitglieder stellen ein, was sie verkaufen wollen, und im Katalog stöbern darf jeder. Heute hat Bob es auf Vendlo abgesehen. Zwei Dinge will er: den kompletten Live-Katalog samt Preisen, um ihn an einen Wettbewerber weiterzuverkaufen, und einen billigen Weg, die API umzukippen, falls er sich dafür entscheidet. Er hat sich als ganz normales Mitglied registriert und öffnet den öffentlichen Inserate-Feed, um zu sehen, wie er lädt.
-
Die Anfrage beobachten
Das Raster, das Bob vor sich hat, ist aus Daten aufgebaut, die die App über die API geholt hat. Es zeigt 24 Inserate und den Hinweis, dass dahinter noch weit mehr stecken. Bob öffnet die Netzwerk-Tools des Browsers und lädt die Seite einmal neu, um den Aufruf mitzuschneiden, mit dem die App den Feed zusammenbaut.
-
Die Seitengröße bestimmt der Aufrufer
Das Neuladen ist mitgeschnitten, und die Anfrage liegt im Netzwerk-Panel. Bob liest nach, wie die App ihre Seite mit Inseraten angefordert hat.
-
Eine Viertelmillion hinter der Seite
Bob öffnet die Antwort des Endpunkts und liest nach, was sie über die Größe des Katalogs verrät.
-
Alles auf einmal anfordern
Bob baut denselben Aufruf im API Tester nach und ändert genau eine Sache: Statt einer Seite mit 24 fordert er 250.000 Inserate in einer einzigen Anfrage an. Wenn der Server das bedient, liefert ihm ein einziger Aufruf den kompletten Katalog.
-
Eine Anfrage, der ganze Katalog
Der Server hat genau das getan, worum er gebeten wurde. Was das gekostet hat, erzählt die Antwort.
-
Der Shop geht in die Knie
Diese eine Anfrage läuft immer noch, arbeitet sich durch eine Viertelmillion Zeilen und belegt dabei ununterbrochen eine Datenbankverbindung. Vendlos Connection Pool ist klein: Solange diese Abfrage eine Verbindung bindet, bekommt der öffentliche Shop keine eigene ab. Bob lädt Vendlos Seite neu, um zu sehen, was ein echter Käufer in diesem Moment zu sehen bekäme.
-
Echte Käufer, ausgesperrt
Derselbe Endpunkt, der Bob gerade den kompletten Katalog ausgehändigt hat, schafft es jetzt nicht mehr, einen gewöhnlichen Käufer zu bedienen. Im API Tester steht weiterhin sein 200 mit dem vollständigen Katalog; die Shop-Seite daneben zeigt, was alle anderen bekommen.
-
Wissenscheck
Sie haben gerade gesehen, wie eine einzige Anfrage eine Viertelmillion Datensätze abholt und die Datenbank lahmlegt. Prägen Sie sich ein, warum das möglich war.
-
Der Alarm trifft ein
Sie verantworten Vendlos Katalog-API. Über Nacht ist dem Monitoring eine einzelne Anfrage aufgefallen, die den kompletten Katalog zurückgegeben und neun Sekunden lang eine Datenbankverbindung offen gehalten hat — währenddessen schoss die Latenz über sämtliche Endpunkte der API hinweg nach oben. Security Operations hat Ihnen eine E-Mail geschickt.
Abdeckung der Sicherheits-Frameworks
OWASP API Top 10
- API4:2023 Unrestricted Resource Consumption
CWE
- CWE-770 Allocation of Resources Without Limits or Throttling
- CWE-400 Uncontrolled Resource Consumption
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security