Wat is een mass assignment aanval?

Mass-assignment, soms ook wel over-posting aanval genoemd, is een aanval op (web)applicaties waarbij een aanvaller willekeurig elementen van een object aan kan passen. Met name applicatie die gebruik maken van model-binding bij een request kunnen kwetsbaar zijn voor deze aanval. Bij model-binding hoeft een developer geen code te schrijven welke velden binnen een formulier binnen komen. Dit wordt gebruikt om code te besparen. Een aanvaller kan dit echter gebruiken om andere velden uit de database / het object te veranderen.

Mass assignment aanval

Hoe werkt mass assignment?

Stel een applicatie heeft een object of tabel met de volgende velden:

name = "John"
isAdmin = False

De applicatie heeft een formulier om de naam aan te passen. Wanneer dit verstuurd wordt, verstuurt de client het volgende request:

POST /profile HTTP/1.1
Host: example.com

field[name]=John

Nu passen we het request aan naar het volgende:

POST /profile HTTP/1.1
Host: example.com

field[isAdmin]=True

Als de applicatie kwetsbaar is, zal deze de het veld is Admin aanpassen in plaats van het veld name.

In de praktijk

Mass-assignment kwetsbaarheden zijn vaak moeilijk handmatig te vinden, omdat de aanvaller moet weten hoe het datamodel van de applicatie in elkaar steekt. In het bovenstaande voorbeeld moet de aanvaller maar net weten dat de property “isAdmin” bestaat. Toch komen dergelijke kwetsbaarheden voor, vaak met grote gevolgen. Een bekend voorbeeld is de kwetsbaarheid bij GitHub, waarmee het mogelijk was om willekeurige repositories over te nemen middels over posting. De beste manier om dergelijke kwetsbaarheden op te sporen is door het gebruik van een Static Code Analyzer, zoals Fortify. In het geval van Fortify zal de tool een bevinding genaamd “Mass assignment secure binder” geven.

Hoe te voorkomen?

De oplossing is niet direct evident, aangezien ieder framework een eigen implementatie van binding heeft. Echter is het vaak mogelijk om aan te geven welk properties wel en niet aangepast mogen worden. Een meer generieke oplossing is om voor de binding te checken welke velden binnen komen.