Massale opdracht
Twee extra JSON-sleutels, en de balans kun je zelf bepalen.
Wat is Massale opdracht?
Een API kopieert elk veld in de hoofdtekst van een verzoek naar een intern object, zonder lijst van welke velden een klant kan instellen. Het token is eerlijk en het record is van de beller. Wat ontbreekt is een controle op veldniveau. U verzendt een normale profielupdate en vervolgens dezelfde update met twee extra JSON-sleutels, en de server schrijft beide. De oplossing leest alleen de velden die een profielbewerking moet wijzigen. Een eigendomscontrole of een rolbewaker kan een gat op veldniveau niet dichten.
Wat je leert in Massale opdracht
- Herken massatoewijzing: een API bindt elk veld in de verzoektekst van een klant aan een opgeslagen object, zodat een klant velden kan instellen die hij nooit mag controleren door ze aan het verzoek toe te voegen
- Onderscheid het van verbroken autorisatie op objectniveau (het bereiken van een object dat niet van jou is) en escalatie van token-forging privileges (knoeien met je eigen inloggegevens); hier is het token eerlijk en is het object correct eigendom van de beller, en is het ontbrekende besturingselement op veldniveau
- Zie hoe een legitieme selfservice-bewerking fraude wordt wanneer de handler door de klant aangeleverde velden schrijft die alleen door een intern proces mogen worden ingesteld, zoals een puntensaldo of een accountniveau
- Pas de oplossing toe: vervang een blinde binding van het hele lichaam door een expliciete toelatingslijst van de velden die een bewerking mag schrijven, en negeer elke andere sleutel
- Begrijp waarom een toelatingslijst beter is dan een blokkeerlijst, waarom het gepatchte eindpunt slaagt met 200 terwijl niet-schrijfbare velden worden verwijderd, en controleer elke aanmaak- en update-handler op dezelfde blinde binding
Massale opdracht — Trainingsstappen
-
Een gewoon lid
Perklane is een beloningsapp voor de detailhandel: leden verdienen punten bij aankopen en wisselen deze in voor cadeaubonnen in de app. Bob heeft zich aangemeld als een normaal lid, met een wegwerpidentiteit, om te zien hoe ver een gewoon account kan gaan. Zijn account is niets bijzonders: een gewone ledenzetel met een token dat zijn eigen profiel leest en bewerkt. Hij opent de ontwikkelaarsconsole om te zien wat de account-API hem geeft.
-
Eén object, twee soorten velden
Op de profielkaart van Bob worden de velden weergegeven die de app hem laat bewerken, en daarnaast de waarden die de app over hem bijhoudt. De API-referentie laat zien hoe de app dat profiel leest en opslaat.
-
Lees zijn eigen profiel
Eerst roept Bob het eindpunt aan zoals het bedoeld is: hij vraagt de API om zijn eigen profiel, met zijn eigen membertoken in een Authorization header, precies zoals de app dat doet.
-
Zijn profiel, elk vakgebied
De server retourneert precies wat hij zou moeten teruggeven: Bob's eigen profiel, omdat hij om zijn eigen record vroeg met zijn eigen token. Er is hier niets mis. Maar de vorm van de plaat is het bekijken waard.
-
Voer een normale bewerking uit
Bob gebruikt de functie eerst zoals bedoeld: een eenvoudige profielbewerking. Hij schakelt het verzoek om naar de opslagmethode en stuurt een nieuwe weergavenaam en avatar, de twee velden die het profielformulier daadwerkelijk biedt.
-
De bewerking duurt
De redding werkte. De weergavenaam en avatar veranderden en al het andere bleef staan.
-
Zie de bewerking op zijn profiel
Voordat hij verder gaat, doet Bob wat elk lid zou doen na het opslaan: hij laadt zijn accountpagina opnieuw. Wat de save ook naar zijn record schreef, is wat de pagina terugleest.
-
Voeg de velden toe die het formulier nooit toont
Hetzelfde verzoek, hetzelfde token, hetzelfde eindpunt. Bob bewaart zijn weergavenaam en avatar in de hoofdtekst en voegt nog twee sleutels toe, de exacte veldnamen die de leesoproep hem heeft gegeven: het puntensaldo en het niveau. Als de opslag alles wat het ontvangt samenvoegt, zal het deze ook schrijven.
-
Het saldo dat hij nooit heeft verdiend
Het kostte alles. Bobs eigen profiel zegt nu dat hij een half miljoen punten en een platina-niveau heeft, bepaald door niets meer dan twee extra sleutels in een profielbewerking.
-
Zie het op zijn profiel
De API heeft 200 geretourneerd, maar Bob wil het zien zoals elk lid dat zou doen. Hij herlaadt zijn eigen accountconsole: wat de opgeslagen gegevens ook naar zijn record hebben geschreven, is wat de pagina zal teruglezen.
Dekking van beveiligingsframeworks
OWASP API Top 10
- API6:2019 Mass Assignment
CWE
- CWE-915 Improperly Controlled Modification of Dynamically-Determined Object Attributes
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