Onbeperkt hulpbronnenverbruik
Eén verzoek, een kwart miljoen records, geen limiet in zicht.
Wat is Onbeperkt hulpbronnenverbruik?
Sommige eindpunten stellen geen grenzen aan de hoeveelheid werk die een verzoek kan vergen. Een lijsteindpunt haalt zijn paginagrootte rechtstreeks uit het verzoek en geeft deze door aan de database zonder maximum aan de serverzijde, zodat een beller om de hele tabel kan vragen. Je legt de door de beller bestuurde limietparameter vast, bouwt het verzoek opnieuw op waarin om alles wordt gevraagd, en ziet hoe één antwoord de hele catalogus doorzoekt terwijl je de database vastzet. De oplossing beperkt de paginagrootte aan de serverzijde en koppelt deze aan cursorpaginering. Een nieuwe probe retourneert een begrensde 200 OK.
Wat je leert in Onbeperkt hulpbronnenverbruik
- Herken het onbeperkte verbruik van hulpbronnen waarbij een eindpunt geen grenzen stelt aan hoeveel een enkel verzoek kan verbruiken, zodat één oproep onbeperkt werk kan afdwingen
- Begrijp dat een door de beller opgegeven paginagrootte (of aantal, grootte of diepte) zonder maximum aan de serverzijde ervoor zorgt dat één enkel verzoek een volledige dataset in één keer kan retourneren
- Zie dat een onbeperkte paginagrootte zowel een massaschrapende vector als een denial-of-service-hefboom is, omdat één te groot verzoek geheugen uitput en een databaseverbinding tot stand brengt
- Maak onderscheid tussen toegangsfouten op objectniveau, over-serialisatie van velden en gaten in de authenticatie; hier is de authenticatie prima en is de ontbrekende controle een resource gebonden per verzoek
- Pas de oplossing toe: beperk de gevraagde paginagrootte tot een maximum aan de serverzijde, houd de limiet op de server, pagineer grote resultatensets met een cursor en voeg snelheidslimieten toe per client en tijdvenster
Onbeperkt hulpbronnenverbruik — Trainingsstappen
-
Een openbare browsefeed
Vendlo is een tweedehandsmarktplaats-app: leden geven een lijst van dingen die ze willen verkopen en iedereen kan door de catalogus bladeren. Vandaag richt Bob zich op Vendlo. Hij wil er twee dingen van: de volledige livecatalogus en de prijzen ervan, om door te verkopen aan een concurrent, en een goedkope manier om de API omver te werpen als hij besluit dat te doen. Hij heeft zich aangemeld als gewoon lid en opent de openbare browsefeed om te zien hoe deze wordt geladen.
-
Bekijk het verzoek
Het raster waar Bob naar kijkt, is afgeleid van gegevens die de app via de API heeft opgehaald. Het toont 24 vermeldingen en een opmerking dat er nog veel meer achter zitten. Bob opent de netwerktools van de browser en laadt de pagina één keer opnieuw om de oproep vast te leggen die de app maakt om de feed te bouwen.
-
Het paginaformaat is dat van de beller
Het herladen is vastgelegd en het verzoek staat in het netwerkpaneel. Bob leest hoe de app om de pagina met vermeldingen vroeg.
-
Een kwart miljoen achter de pagina
Bob opent het antwoord dat het eindpunt heeft geretourneerd en leest wat het zegt over de grootte van de catalogus.
-
Vraag alles
Bob bouwt dezelfde aanroep opnieuw op in de API-tester en verandert één ding: in plaats van een pagina van 24 vraagt hij om 250.000 vermeldingen in één verzoek. Als de server het respecteert, krijgt hij met één telefoontje de hele catalogus.
-
Eén aanvraag, de hele catalogus
De server deed precies wat hem werd gevraagd. Het antwoord vertelt het verhaal van wat dat heeft gekost.
-
De winkelpui sluit
Dat ene verzoek loopt nog steeds, doorzoekt een kwart miljoen rijen en houdt de hele tijd een databaseverbinding in stand. De verbindingspool van Vendlo is klein, dus hoewel die vraag een verbinding verbindt, kan de openbare winkel er geen eigen krijgen. Bob herlaadt Vendlo's pagina om te zien wat een echte shopper nu zou zien.
-
Echte shoppers, buitengesloten
Hetzelfde eindpunt dat Bob zojuist de hele catalogus heeft overhandigd, kan een gewone klant niet bedienen. De API-tester toont nog steeds zijn 200 met de volledige catalogus; de winkelpui ernaast laat zien wat alle anderen krijgen.
-
Kennis check
Je hebt zojuist gezien hoe één verzoek een kwart miljoen records ophaalde en de database stopte. Leg vast waarom.
-
De waarschuwing komt binnen
U bent eigenaar van de catalogus-API van Vendlo. Van de ene op de andere dag markeerde de monitoring één enkel verzoek dat de hele catalogus retourneerde en een databaseverbinding negen seconden open hield, waarbij de API-latentie op elk eindpunt toenam terwijl deze actief was. Beveiligingsoperaties hebben u een e-mail gestuurd.
Dekking van beveiligingsframeworks
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