0 Minuten lezen
0 Min
12 sep 2023

Je vraagt je misschien af waar deze blogpost over gaat. Nou, laten we je een verhaal vertellen over hoe we een kritieke kwetsbaarheid ontdekten in de ontwikkelinfrastructuur van de Nederlandse Kiesraad.

Maarten Boone, onze gewaardeerde collega, zat op een druilerige dinsdagavond in juli rustig te eten in zijn appartement, samen met zijn katten.

Hij dacht na over een grote Coordinated Vulnerability Disclosure (CVD) die hij net samen met het Zerocopter-team had ingediend bij een groot medisch bedrijf. Hij voelde zich er energiek door, maar ook een beetje leeg – het had veel tijd gekost en nu was het… klaar. Af.

Terwijl hij nadacht over wat hij daarna zou doen, dwaalden zijn gedachten af naar een oud project waar hij eerder naar had gekeken: de OSV2020-software, die wordt gebruikt bij Nederlandse verkiezingen en wordt geleverd door de Kiesraad. Hij had al eens gedacht aan het bouwen van een nieuwe tool, zodat hij ideeën op dit project kon testen. En misschien zelfs nog wat meer issues kon vinden om te melden.

Tijdens het eten downloadde Maarten de publiek beschikbare OSV2020-software. Hij bekeek de installer en zag dat deze grotendeels in Java was gebouwd. Dus pakte hij een tool: https://github.com/ststeiger/procyon en begon de OSV2020-software te decompilen. Het bleek dat ze een open-source installer gebruikten genaamd Izpack, die je hier kunt vinden: http://izpack.org/downloads/.

Hoe werkt dat? Wat is het buildproces? En hoe ziet de uiteindelijke build eruit? Nou… tromgeroffel… Als je een tool gebruikt, moet je echt de documentatie doornemen. Want in dit geval bevatte de final build een aantal artifacts in de vorm van Java-geserialiseerde objecten die daar absoluut niet hadden mogen staan. Oeps.

In Yoda-stem: “Dus deserializen, we moeten, hmm?” Nou, nee. Met een simpele hex-editor kom je al ver. Maar Maarten is Maarten, dus hij schreef snel een tool die Java-objecten kan deserializen naar JSON. En weet je? Omdat jij dit leest, mag jij hem ook hebben. Sharing is caring → https://github.com/Zerocopter/J2J

Tool gebouwd, artifacts erin, en wat zien we? Nou, [redacted]:

"keystore.storepass": "Jeder",
"confluence.password": "#H
5Z",
"PROGRAM_DATA": "ProgramData",
"was.app.name": "VApp-U",
"wvp.datasource.jndi.name": "java:/electWvpDatabase",
"DEPLOYMENTS_FOLDER": "deployments",
"JAVA_LIB_FOLDER": "lib",
"H2_DB_DIR_NAME": "database",
"KEYSTORE_PASSWORD": "idLEn",
"izpack-release.version": "5.1.3",
"share.intern.password": "QM
pW",
"osv.tld.name": "osv2020.nl",

En zo ging het maar door…

Mooi. Al die credentials en andere interessante info gaven hem volledige toegang tot de deployomgeving van de softwarebouwers. En dit alles nam minder dan een uur in beslag.

Het melden van deze vondst verliep ook razendsnel, dankzij de CISO van de Kiesraad. De snelheid, het oppakken en het mitigeren gingen soepel en ontzettend snel, en de communicatie was uitstekend. Maarten werd meegenomen in het hele CVD-proces aan hun kant en kreeg continu updates. Voor hem was het een van de beste CVD-processen ooit – hoe de Kiesraad dit oppakte zou voor veel bedrijven en overheidsorganisaties een voorbeeld moeten zijn.

Voor de volledigheid, hier de exacte tijdlijn:

28 jun 2023, 17:50: Diner
28 jun 2023, 17:54: Downloaden OSV2020-PP
28 jun 2023, 18:33: Geldige inloggegevens gevonden
28 jun 2023, 18:53: Eerste contact met de CISO om voorlopige bevindingen te delen
29 jun 2023, 12:32: Uitgebreide mail naar de CISO met alle bevindingen
29 jun 2023, 16:47: Bevestiging van ontvangst door de CISO
30 jun 2023, 14:56: E-mail van de CISO met aanvullende vragen na overleg met de leverancier
30 jun 2023, 15:20: Reactie verstuurd
7 jul 2023, 15:36: Uitgebreide update van de CISO met alles wat met de vendor was besproken plus hun vervolgstappen
7 aug 2023, 13:00: Fysieke afspraak met de CISO in het gebouw van de Kiesraad in Den Haag

Let op: in Nederland hoeven we als hackers niet bang te zijn om dit soort kwetsbaarheden te melden, omdat we beschermd worden door de Nederlandse CVD-richtlijn, die je hier kunt vinden.

En nu weet je waar de titel op slaat. Het is belangrijk om te onthouden dat je niet klaar bent zodra je op build en deploy drukt. Securityfouten kunnen in elke fase van je ontwikkelproces ontstaan, en het is verstandig om hackers regelmatig te laten meekijken.

Een pentest alleen is simpelweg niet genoeg. Je zou een diversiteit aan hackers moeten inzetten – ieder met unieke vaardigheden – om je werk te beoordelen, via een Coordinated Vulnerability Disclosure (CVD)-programma of een Bug Bounty-programma als dat beter past. Ze vinden dingen die je wilt weten. Zelfs terwijl ze aan het avondeten zitten.