Kritieke AdonisJS Bodyparser-kwetsbaarheid (CVE-2024-28183): Analyse en Mitigatie

Written by Olivia Nolan

januari 9, 2026

Recent is een significante kwetsbaarheid, geïdentificeerd als CVE-2024-28183, aan het licht gekomen in de body-parser middleware van AdonisJS, een populair Node.js webframework. Deze **AdonisJS Bodyparser-kwetsbaarheid** stelt kwaadwillenden in staat om een zogenaamde 'prototype pollution'-aanval uit te voeren. AdonisJS wordt door ontwikkelaars gewaardeerd om zijn elegantie en productiviteit, maar zoals dit incident aantoont, is geen enkel framework immuun voor beveiligingsrisico's, vooral niet in de dieper gelegen afhankelijkheden. De body-parser component is cruciaal voor het verwerken van inkomende HTTP-verzoekdata, zoals JSON-payloads van webformulieren of API-aanroepen. De kwetsbaarheid bevindt zich specifiek in de manier waarop deze data wordt geparset en verwerkt, waardoor een aanvaller de prototype van standaard JavaScript-objecten kan manipuleren. Dit kan leiden tot onvoorspelbaar gedrag, denial-of-service (DoS) of zelfs het omzeilen van beveiligingsmechanismen. Organisaties die AdonisJS gebruiken, worden met klem geadviseerd om de impact te evalueren en onmiddellijk actie te ondernemen. De zakelijke impact van een dergelijke technische kwetsbaarheid kan verstrekkend zijn. Het gaat verder dan een technisch ongemak voor het ontwikkelteam; het raakt de kern van de bedrijfscontinuïteit en het klantvertrouwen. Een succesvolle exploitatie kan leiden tot applicatiecrashes (Denial of Service), wat resulteert in downtime en direct omzetverlies. In meer geavanceerde scenario's kan prototype pollution worden misbruikt om beveiligingscontroles te omzeilen, wat kan leiden tot ongeautoriseerde toegang tot data of administratieve functionaliteiten. De gevolgen hiervan zijn onder meer datalekken, schending van de AVG/GDPR-regelgeving met bijbehorende hoge boetes, en aanzienlijke reputatieschade. Voor C-level executives en IT-managers is het cruciaal om te begrijpen dat de beveiliging van de software supply chain een strategische prioriteit is. Investeren in proactieve beveiligingsmaatregelen, zoals geautomatiseerde dependency scanning en een gedegen vulnerability management-proces, is geen kostenpost maar een essentiële verzekering tegen catastrofale bedrijfsrisico's. Dit incident onderstreept de complexe en onderling verbonden aard van moderne softwareontwikkeling, die zwaar leunt op open-source software (OSS). Frameworks zoals AdonisJS zijn zelf opgebouwd uit talloze kleinere, gespecialiseerde packages, die op hun beurt weer afhankelijk zijn van andere packages. Deze keten van afhankelijkheden, de 'software supply chain', creëert enorme efficiëntievoordelen maar introduceert tegelijkertijd een breed aanvalsoppervlak. Een kwetsbaarheid in één enkele, ogenschijnlijk onbelangrijke bibliotheek kan de veiligheid van de gehele applicatiestack compromitteren. Dit illustreert het principe van gedeelde verantwoordelijkheid: de makers van AdonisJS zijn verantwoordelijk voor hun code, maar de ontwikkelaars die het framework implementeren, zijn verantwoordelijk voor het up-to-date houden van hun afhankelijkheden en het monitoren op nieuwe kwetsbaarheden. Het is een collectieve inspanning die een proactieve en waakzame houding vereist van de gehele ontwikkelgemeenschap.

Luister naar dit artikel:

Om de ernst van de AdonisJS-kwetsbaarheid te begrijpen, is een fundamenteel begrip van de JavaScript-prototypes essentieel. In tegenstelling tot klassieke objectgeoriënteerde talen, maakt JavaScript gebruik van een prototypisch overervingsmodel. Elk object heeft een interne link naar een ander object, zijn 'prototype'. Wanneer men een eigenschap van een object probeert te benaderen die op het object zelf niet bestaat, zoekt de JavaScript-engine verder in de prototype-keten. Dit proces gaat door totdat de eigenschap wordt gevonden of de keten eindigt (meestal bij `Object.prototype`). `Object.prototype` staat aan de top van de meeste prototype-ketens en bevat algemene methoden zoals `toString()` en `hasOwnProperty()`. Een 'prototype pollution'-aanval vindt plaats wanneer een aanvaller erin slaagt om eigenschappen toe te voegen aan of te wijzigen op `Object.prototype`. Omdat bijna elk object in een applicatie `Object.prototype` in zijn prototype-keten heeft, zullen al deze objecten plotseling de nieuwe, malafide eigenschap erven, wat tot onvoorspelbare en gevaarlijke situaties kan leiden. De aanval zelf wordt doorgaans uitgevoerd door een applicatie te misleiden om een malafide JSON-payload te verwerken. Dit gebeurt vaak via kwetsbare code die objecten recursief samenvoegt of eigenschappen instelt op basis van gebruikersinvoer zonder adequate validatie. Een aanvaller kan een JSON-object construeren met een speciale sleutel zoals `__proto__`. Wanneer een onveilige merge-functie deze payload verwerkt, kan het de `__proto__`-sleutel interpreteren als een verwijzing naar het prototype van het doelobject. Hierdoor kan de aanvaller eigenschappen direct op `Object.prototype` 'injecteren'. Een voorbeeldpayload zou er als volgt uit kunnen zien: `JSON.parse('{"__proto__":{"isAdmin":true}}')`. Als een applicatie deze input op een onveilige manier verwerkt, kan elk object in de applicatie plotseling een `isAdmin` eigenschap hebben met de waarde `true`, wat desastreuze gevolgen kan hebben voor autorisatiechecks die enkel controleren op de aanwezigheid van deze eigenschap. In de context van de AdonisJS body-parser lag de fout in de logica die de inkomende request body ontleedt en omzet in een JavaScript-object. De bibliotheek voerde onvoldoende controles uit op de sleutels van de geneste objecten binnen de payload. Hierdoor kon een zorgvuldig opgestelde HTTP-request (bijvoorbeeld een POST-request met een malafide JSON-body) de kwetsbaarheid triggeren. De aanvaller hoeft alleen maar een eindpunt te vinden dat de body-parser gebruikt (wat bij de meeste API's en webapplicaties het geval is) en de kwaadaardige payload te versturen. De kwetsbare code in de body-parser verwerkte de `__proto__` sleutel op een onveilige manier, waardoor de eigenschappen die de aanvaller meegaf, direct op `Object.prototype` werden geplaatst. Dit gebeurt volledig op de achtergrond, zonder dat de applicatielogica er direct weet van heeft, totdat een ander deel van de code onverwacht gedrag vertoont door de 'vervuilde' prototypes. De concrete exploitatiescenario's van prototype pollution variëren van relatief onschuldig tot catastrofaal. Een veelvoorkomend gevolg is een Denial of Service (DoS). Een aanvaller kan bijvoorbeeld de `toString`-methode op `Object.prototype` overschrijven met een waarde die geen functie is. Wanneer een ander deel van de applicatie (bijvoorbeeld een logging-framework) deze methode probeert aan te roepen, crasht de applicatie. Een gevaarlijker scenario is het omzeilen van beveiligingslogica. Als een applicatie controleert op `if (user.isAdmin)`, kan een aanvaller `isAdmin: true` op het prototype injecteren, waardoor elke gebruiker plotseling administratorrechten krijgt. Het meest ernstige scenario is Remote Code Execution (RCE). Dit is complexer, maar mogelijk als de applicatie op basis van object-eigenschappen dynamisch commando's uitvoert of templates laadt. Door specifieke eigenschappen te 'polluten' die door een template-engine of een child-process-module worden gebruikt, kan een aanvaller de applicatie mogelijk dwingen om willekeurige code uit te voeren op de server.
De meest effectieve en dringende stap om de AdonisJS Bodyparser-kwetsbaarheid te mitigeren, is het updaten van de getroffen package. De beheerders van AdonisJS hebben snel gehandeld en een gepatchte versie van `@adonisjs/bodyparser` uitgebracht. Ontwikkelteams moeten onmiddellijk hun projecten controleren op de aanwezigheid van de kwetsbare versies. Dit kan eenvoudig worden gedaan met de ingebouwde audit-tools van package managers. Voer `npm audit` of `yarn audit` uit in de root van het project. Deze commando's scannen de afhankelijkheden en rapporteren bekende kwetsbaarheden, inclusief CVE-2024-28183, met details over de kwetsbare versie en de versie waarin het probleem is opgelost. De volgende stap is het updaten van de package naar de aanbevolen veilige versie door de versie in het `package.json`-bestand aan te passen en `npm install` of `yarn install` uit te voeren. Na de update is het essentieel om de applicatie grondig te testen om er zeker van te zijn dat de wijziging geen onverwachte neveneffecten heeft veroorzaakt. In situaties waarin een onmiddellijke update van de dependency niet mogelijk is – bijvoorbeeld vanwege complexe afhankelijkheidsconflicten of een langdurig releaseproces – kunnen tijdelijke workarounds worden overwogen. Deze moeten echter als een noodoplossing worden gezien en niet als een permanente fix. Een effectieve workaround op applicatieniveau is het implementeren van input-sanering die specifiek zoekt naar malafide sleutels zoals `__proto__`, `constructor` en `prototype` in inkomende JSON-payloads. Voordat de JSON-data wordt verwerkt, kan een middleware-functie de data doorlopen en deze gevaarlijke sleutels verwijderen of de request volledig blokkeren. Een andere laag van verdediging kan worden toegevoegd met een Web Application Firewall (WAF). Een WAF kan worden geconfigureerd met regels om HTTP-requests die patronen bevatten die typisch zijn voor prototype pollution-aanvallen, te detecteren en te blokkeren. Dit wordt ook wel 'virtual patching' genoemd en kan bescherming bieden terwijl het onderliggende probleem in de code wordt aangepakt. Op de lange termijn vereist het beschermen tegen dergelijke kwetsbaarheden een verschuiving van een reactieve naar een proactieve beveiligingsstrategie. Organisaties moeten een robuust vulnerability management-programma opzetten. Een kernonderdeel hiervan is de integratie van geautomatiseerde tools voor Software Composition Analysis (SCA) in de CI/CD-pijplijn. Tools zoals Snyk, GitHub Dependabot of WhiteSource scannen continu alle open-source afhankelijkheden op bekende kwetsbaarheden bij elke code-commit of build. Dit stelt teams in staat om problemen te identificeren zodra ze worden onthuld, in plaats van tijdens een periodieke handmatige audit. Het is eveneens cruciaal om duidelijke Service Level Agreements (SLA's) vast te stellen voor het patchen van kwetsbaarheden, gebaseerd op hun CVSS-score. Kritieke kwetsbaarheden zoals deze vereisen actie binnen uren of dagen, niet weken. Dit creëert een cultuur van 'security by design' waarin beveiliging een integraal onderdeel is van het ontwikkelproces.

advertenties

advertenties

advertenties

advertenties

De AdonisJS Bodyparser-kwetsbaarheid is geen geïsoleerd incident, maar een symptoom van een systemisch risico in de moderne softwareontwikkeling: de beveiliging van de software supply chain. Het leert ons de belangrijke les dat de veiligheid van een applicatie slechts zo sterk is als de zwakste schakel in haar keten van afhankelijkheden. Ontwikkelaars en organisaties moeten afstappen van het idee dat open-source componenten 'gratis' zijn; ze komen met de impliciete verantwoordelijkheid voor onderhoud en beveiliging. Een blind vertrouwen in externe packages is niet langer houdbaar. Een waakzame en kritische houding is vereist, waarbij de keuze voor een nieuwe afhankelijkheid niet alleen wordt gebaseerd op functionaliteit, maar ook op de reputatie van de maintainers, de frequentie van updates en de reactiesnelheid op beveiligingsproblemen. Dit incident moet dienen als een wake-up call om de processen voor het beheren en beveiligen van de software supply chain opnieuw te evalueren en te versterken. Een steeds belangrijker wordend instrument in de strijd voor een veiligere supply chain is de Software Bill of Materials (SBOM). Een SBOM is een formele, machineleesbare inventaris van alle componenten, bibliotheken en modules die nodig zijn om een stuk software te bouwen en uit te voeren. Het is vergelijkbaar met een ingrediëntenlijst voor een voedingsproduct. Wanneer een nieuwe kwetsbaarheid zoals CVE-2024-28183 wordt ontdekt, stelt een actuele SBOM een organisatie in staat om binnen enkele minuten te bepalen welke applicaties de kwetsbare component bevatten. Dit verkort de tijd tot mitigatie drastisch en biedt de noodzakelijke transparantie die vereist is voor compliance en risicobeheer. Het genereren en onderhouden van SBOM's zou een standaardpraktijk moeten worden binnen elke softwareontwikkelingscyclus, geautomatiseerd en geïntegreerd in de build-processen. Naast het beheren van externe afhankelijkheden, kunnen ontwikkelaars ook defensieve codeerpraktijken toepassen om zich te wapenen tegen prototype pollution. Een fundamentele techniek is het vermijden van onveilige, recursieve merge- of clone-operaties die blindelings eigenschappen van het ene object naar het andere kopiëren. Gebruik in plaats daarvan bibliotheken die expliciet zijn ontworpen om dit veilig te doen. Een andere best practice is het gebruik van `Object.create(null)` om objecten te creëren die geen prototype hebben. Dergelijke 'kale' objecten zijn immuun voor prototype pollution omdat er geen prototype-keten is om te vervuilen. Voor objecten die niet mogen worden gewijzigd, kan `Object.freeze()` worden gebruikt om hun eigenschappen en prototype onveranderlijk te maken. Door deze technieken toe te passen, kunnen ontwikkelaars de impact van potentiële prototype pollution-kwetsbaarheden in hun eigen code of in hun afhankelijkheden aanzienlijk beperken. Uiteindelijk is het bouwen van veilige software een culturele uitdaging die verder gaat dan tools en processen. Het vereist een sterke DevSecOps-cultuur waarin beveiliging een gedeelde verantwoordelijkheid is van iedereen die betrokken is bij de softwarelevenscyclus. Ontwikkelaars moeten worden getraind in het schrijven van veilige code, security-engineers moeten vroeg in het proces worden betrokken, en operations-teams moeten de infrastructuur verharden en monitoren. Open communicatie, snelle feedbackloops en een 'blameless' post-mortem cultuur zijn essentieel om continu te leren en te verbeteren. De AdonisJS-kwetsbaarheid is een herinnering dat absolute veiligheid een illusie is; het doel is veerkracht. Door te investeren in mensen, processen en technologie kunnen we systemen bouwen die niet alleen robuust zijn, maar ook in staat zijn om snel te herstellen wanneer zich onvermijdelijk nieuwe bedreigingen voordoen.

Olivia Nolan is redacteur bij MSP2Day, waar zij zich richt op het vertalen van complexe IT- en technologische ontwikkelingen naar toegankelijke en inspirerende artikelen. Met haar ervaring als content manager en social media expert weet zij inhoud niet alleen informatief, maar ook aantrekkelijk en relevant te maken voor een breed publiek.