Unbegrenzter Ressourcenverbrauch
Eine Anfrage, eine Viertelmillion Datensätze, keine Obergrenze in Sicht.
Was ist Unbegrenzter Ressourcenverbrauch?
Manche Endpunkte begrenzen nicht, wie viel Arbeit eine einzelne Anfrage auslösen kann. Ein Listenendpunkt übernimmt die Seitengröße direkt aus der Anfrage und reicht sie ohne serverseitige Obergrenze an die Datenbank weiter. So kann ein Aufrufer die ganze Tabelle auf einmal anfordern. Sie untersuchen den vom Aufrufer gesetzten limit-Parameter, wiederholen die Anfrage mit einem übergroßen Wert und sehen, wie eine einzige Antwort den gesamten Katalog preisgibt und dabei die Datenbank blockiert. Die Lösung begrenzt die Seitengröße auf ein serverseitiges Maximum. Eine erneute Anfrage liefert weiterhin 200 OK, aber nur eine begrenzte Zahl von Datensätzen.
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
Neun Sekunden sind lang, um eine Datenbankverbindung zu halten. Bob setzt dieselbe Anfrage erneut ab, mehrere Kopien gleichzeitig, und jede arbeitet sich durch eine Viertelmillion Zeilen und belegt dabei ununterbrochen eine Verbindung. Vendlos Connection Pool ist klein: Solange diese Abfragen die Verbindungen binden, bekommt der öffentliche Shop keine eigene ab. Während sie laufen, lädt Bob 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
-
Der Alarm trifft ein
Sie verantworten Vendlos Katalog-API. Über Nacht ist dem Monitoring ein einzelnes Mitgliedskonto aufgefallen, dessen Anfragen jeweils den kompletten Katalog zurückgegeben und neun Sekunden lang eine Datenbankverbindung offen gehalten haben — 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