Massenzuweisung
Zwei zusätzliche JSON-Schlüssel, und der Rest liegt bei Ihnen.
Was ist Massenzuweisung?
Eine API kopiert jedes Feld in einem Anforderungstext in ein internes Objekt, ohne Liste der Felder, die ein Client festlegen darf. Der Token ist ehrlich und die Aufzeichnung gehört dem Anrufer. Was fehlt, ist eine Steuerung auf Feldebene. Sie senden ein normales Profilupdate, dann dasselbe Update mit zwei zusätzlichen JSON-Schlüsseln und der Server schreibt beide. Der Fix liest nur die Felder, die durch eine Profilbearbeitung geändert werden sollen. Eine Besitzüberprüfung oder ein Rollenschutz können eine Lücke auf Feldebene nicht schließen.
Was Sie lernen in Massenzuweisung
- Mass Assignment erkennen: Eine API bindet jedes Feld aus dem Body der Client-Anfrage an ein gespeichertes Objekt — ein Client kann damit Felder setzen, die er nie kontrollieren sollte, indem er sie der Anfrage hinzufügt
- Es von der fehlerhaften Autorisierung auf Objektebene (ein fremdes Objekt erreichen) und von einer Rechteausweitung durch Token-Fälschung (Manipulation der eigenen Zugangsdaten) unterscheiden; hier ist das Token ehrlich und das Objekt korrekterweise das des Aufrufers, und es fehlt die Kontrolle auf Feldebene
- Nachvollziehen, wie aus einer legitimen Selbstbedienungs-Änderung Betrug wird, sobald der Handler vom Client gelieferte Felder schreibt, die nur ein interner Prozess setzen sollte — etwa einen Punktestand oder eine Kontostufe
- Den Fix anwenden: das blinde Binden des kompletten Bodys durch eine ausdrückliche Allowlist der Felder ersetzen, die eine Operation schreiben darf — und jeden anderen Schlüssel ignorieren
- Verstehen, warum eine Allowlist besser ist als eine Denylist und warum der gepatchte Endpunkt mit 200 durchgeht und dabei die nicht beschreibbaren Felder verwirft — und jeden Handler zum Anlegen und Ändern auf dasselbe blinde Binden prüfen
Massenzuweisung — Trainingsschritte
-
Ein ganz normales Mitglied
Perklane ist eine Prämien-App für den Einzelhandel: Mitglieder sammeln Punkte für ihre Einkäufe und lösen sie in der App gegen Geschenkkarten ein. Bob hat sich mit einer Wegwerf-Identität als ganz normales Mitglied registriert, um auszuloten, wie weit ein gewöhnliches Konto kommt. Sein Konto ist nichts Besonderes: ein einfacher Mitglieds-Zugang mit einem Token, das sein eigenes Profil lesen und ändern darf. Er öffnet die Entwicklerkonsole, um zu sehen, was ihm die Konto-API liefert.
-
Ein Objekt, zwei Arten von Feldern
Bobs Profilkarte zeigt die Felder, die er ändern darf, und direkt daneben die Werte, die die App über ihn führt. Die API-Referenz zeigt, wie die App dieses Profil liest und speichert.
-
Das eigene Profil lesen
Zuerst ruft Bob den Endpunkt genau so auf, wie er gedacht ist: Er fragt bei der API sein eigenes Profil ab und schickt dabei sein eigenes Mitglieds-Token im Authorization-Header mit — exakt so, wie es auch die App tut.
-
Sein Profil, jedes Feld
Der Server liefert genau das, was er soll: Bobs eigenes Profil — er hat schließlich mit seinem eigenen Token seinen eigenen Datensatz angefragt. Daran ist nichts falsch. Der Zuschnitt dieses Datensatzes lohnt allerdings einen genaueren Blick.
-
Eine ganz normale Änderung vornehmen
Bob nutzt die Funktion zunächst so, wie sie gedacht ist: eine schlichte Profiländerung. Er stellt die Anfrage auf die Speichermethode um und schickt einen neuen Anzeigenamen und einen neuen Avatar — genau die beiden Felder, die das Profilformular tatsächlich anbietet.
-
Die Änderung greift
Das Speichern hat funktioniert. Anzeigename und Avatar sind geändert, alles andere ist unverändert geblieben.
-
Die Änderung im Profil sehen
Bevor er weitergeht, macht Bob das, was jedes Mitglied nach dem Speichern tun würde: Er lädt seine Kontoseite neu. Die Seite liest genau das zurück, was das Speichern in seinen Datensatz geschrieben hat.
-
Die Felder ergänzen, die das Formular nie zeigt
Gleiche Anfrage, gleiches Token, gleicher Endpunkt. Bob lässt Anzeigenamen und Avatar im Body stehen und ergänzt zwei weitere Schlüssel — exakt die Feldnamen, die ihm der Leseaufruf geliefert hat: den Punktestand und die Stufe. Wenn das Speichern alles einarbeitet, was ankommt, schreibt es auch diese beiden.
-
Der Punktestand, den er nie verdient hat
Alles davon ist durchgegangen. In Bobs eigenem Profil stehen jetzt eine halbe Million Punkte und die Stufe Platinum — gesetzt durch nichts weiter als zwei zusätzliche Schlüssel in einer Profiländerung.
-
Das Ergebnis im Profil sehen
Die API hat mit 200 geantwortet, doch Bob will es so sehen, wie es jedes Mitglied sehen würde. Er lädt seine eigene Konto-Konsole neu: Die Seite liest genau das zurück, was das Speichern in seinen Datensatz geschrieben hat.
Abdeckung der Sicherheits-Frameworks
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