Voordat je begint met lezen, wil je dit weten: toen we Ajax vertelden wat er aan de hand was en adviseerden welke systemen direct offline moesten, haalde Ajax één ding offline. Het portaal met hun eigen spelersdata. Contracten, salarissen, transferinformatie. Hun eigen geheimen. De systemen die jouw gegevens bevatten als fan? Je tickets, je naam, je adres, je stoelnummer? Die lieten ze gewoon staan. 72 uur lang. Ze beschermden zichzelf. Niet jou. π
In maart 2026 hebben wij 55 uur non-stop besteed aan het onderzoeken van de digitale systemen van AFC Ajax. We vonden meer dan 37 kwetsbaarheden. Alles is gemeld via responsible disclosure. Ajax was niet blij. π
Dit artikel is geschreven voor mensen die niks van techniek weten. Je hoeft niet te snappen wat een API is. Je hoeft alleen te begrijpen dat jouw gegevens als Ajax-fan jarenlang voor het oprapen lagen. Dat Ajax zei dat het niet waar was. En dat ze, toen ze eenmaal moesten handelen, eerst hun eigen data beschermden en die van 300.000 fans lieten liggen.
De meeste beveiligingsbedrijven checken welke deur openstaat. Wij kijken waar die deur naartoe leidt, waar de gang eindigt, en wat er achter de laatste muur ligt. Bij inlichtingendiensten noemen ze dat "full-spectrum analysis." Je stopt niet bij de eerste vondst. Je stopt als je het hele systeem begrijpt. Dat kostte ons 55 uur. Maar dat is het verschil tussen een rapport dat in een la verdwijnt en een bevinding die 300.000 mensen raakt.
Hoofdstuk 1: De Sleutel op de Deurmat
Elk digitaal systeem heeft sleutels. Net als je voordeur. Zonder sleutel kom je nergens. Met de juiste sleutel kom je overal. En als een inlichtingendienst jouw systeem wil binnenkomen, zoeken ze niet naar een gat in de muur. Ze zoeken naar de plek waar iemand de sleutel heeft laten liggen.
Dat is precies wat wij deden. Niet hacken. Lezen. Ajax heeft verschillende websites waarop fans hun seizoenkaart beheren, tickets kopen, dat soort dingen. Wij openden een van die pagina's, klikten op "Paginabron weergeven", en begonnen elk JavaScript-bestand door te spitten. Duizenden regels code. De meeste onderzoekers scannen even snel en gaan door. Wij niet. Wij lezen alles. Regel voor regel. Zoals je een document analyseert. En ergens tussen al die regels, vonden we het.
Als je een website bezoekt, downloadt je browser alle bestanden die nodig zijn om die pagina te tonen. Je kunt die bestanden gewoon openen en lezen. Dat is niet illegaal. Dat is hoe het internet werkt.
In een van die bestanden stond, gewoon in leesbare tekst, de API-sleutel van Ajax. Maar het vinden is één ding. De echte vraag is: wat kun je ermee? Wij testten de sleutel tegen elk systeem dat Ajax heeft. Ticketing. Identiteit. Stadionverboden. Beheer. Analytics. De sleutel werkte op alles. EΓ©n sleutel. Alles open. Ik dacht: zijn ze echt zo dom? π³ Maar het werd nog veel erger.
En het was niet zomaar een sleutel. Het was de hoofdsleutel. Ticketsysteem. Identiteitsverificatie. Stadionverboden. Digitale tickets. Interne beheertools. Analytics. Alles achter dezelfde code. Bij een inlichtingendienst noemen ze dit een "golden key." Eén sleutel die toegang geeft tot het hele koninkrijk. Bij Ajax lag die op de deurmat.
Rechtermuisklik. Dat was alles. π±οΈ
Geen wachtwoord. Geen inlogscherm. Geen hackertool. Gewoon de broncode openen van een pagina die iedere Ajax-fan kent. Daar stond de sleutel tot alles. Een miljoenenbedrijf, en de beveiliging was: "we hopen dat niemand kijkt."
Het werd erger: niet één sleutel, maar vier
De meeste onderzoekers zouden hier stoppen. Sleutel gevonden, rapport schrijven, factuur sturen. Maar zo werken wij niet. Wij werken zoals inlichtingendiensten werken: als hier één sleutel ligt, waar liggen de rest? Welke systemen hangen eraan vast? Hoe diep gaat het konijnenhol? Je trekt aan één draadje en je ontrafelt het hele systeem.
We downloadden de officiΓ«le Ajax-app uit de Play Store en maakten hem helemaal open. Een moderne app is een doolhof van honderdduizenden bestanden. Wij schreven tools om automatisch te zoeken naar verborgen sleutels, interne URL's en geheime verbindingen. We vonden een tweede sleutel. Op drie plekken in dezelfde app. En nog veel meer: interne configuraties, koppelingen met gok-platforms, feature flags die nooit publiek hadden mogen zijn. Alsof Ajax hun hele keuken open had laten staan. π³
Maar toen checkten we iets. We keken naar de versiegeschiedenis van de app. Wanneer was die sleutel erin gezet? Het antwoord deed ons even stil worden.
Die sleutel zat er sinds 2019 in. Niet maanden. Zeven jaar. Elke versie van de Ajax-app die in de afgelopen zeven jaar is uitgebracht, had dezelfde sleutel erin staan die toegang gaf tot het complete systeem. Elke fan die de app downloadde had, zonder het te weten, de sleutel tot zijn eigen gegevens en die van 300.000 anderen op zijn telefoon staan. Zeven jaar lang.
β οΈ AJAX IS SINDS 2019 OPEN GEWEEST. ZEVEN JAAR.
Dit is geen bug die vorige week is geïntroduceerd. Dit is een sleutel die er sinds 2019 in zit. Zeven jaar lang had iedereen die de Ajax-app downloadde en openmaakte, volledige toegang tot tickets, persoonsgegevens en barcodes van honderdduizenden fans. Niemand weet hoeveel mensen deze sleutel voor ons hebben gevonden. Niemand weet wat ermee is gedaan. Er was geen monitoring, geen logging, geen alert. Zeven jaar lang stond de deur wagenwijd open en niemand bij Ajax heeft ooit gekeken of er iemand naar binnen liep. Verwijder de Ajax-app. Nu. Wacht niet tot Ajax zegt dat het veilig is. ποΈ
Uiteindelijk vonden we vier sleutels op vier verschillende plekken. De website, de app, een testomgeving, een vacaturesite. Allemaal leesbaar.
Vier sleutels. Vier plekken. Geen hackertools nodig. We lazen gewoon wat Ajax zelf online had gezet.
Hoe een staatshacker dit zou gebruiken
Een crimineel verkoopt de data. Maar een gerichte aanvaller? Die is geduldiger. Die gebruikt de sleutel om weken, maanden mee te kijken. Wie komt er in het stadion. Waar zitten de directeuren. Welke VIP's zijn wanneer aanwezig. Welke medewerkers hebben toegang tot wat. Bij inlichtingendiensten heet dit "persistent access." Je breekt niet in. Je logt in. Onzichtbaar. Zolang als je wilt. En bij Ajax kon dat. Zeven jaar lang.
Hoofdstuk 2: Andermans Seizoenkaart in 10 Seconden
Met de sleutel in handen openden we de deur naar het ticketsysteem. Ajax gebruikt een platform genaamd SecutiX voor alle kaartverkoop: seizoenkaarten, losse wedstrijden, VIP-arrangementen. Elke fan heeft een klantnummer, een zogenaamd Contact ID.
Dat klantnummer is een gewoon getal. 10730471. 10730472. 10730473. Het telt op. Wie nummer 10730471 heeft, kan raden dat 10730472 ook bestaat.
Denk aan kluisjes op school. Jij hebt kluisje nummer 5. Jij mag alleen kluisje 5 openen. Maar wat als je gewoon "6" intypt en kluisje 6 ook opengaat? En "7" ook? En alle 300.000 kluisjes? Dat is precies wat hier aan de hand was.
We typten een willekeurig klantnummer in. Het systeem gaf braaf antwoord. Geen foutmelding. Geen "toegang geweigerd." Gewoon: hier zijn alle tickets van deze persoon. We probeerden een ander nummer. Werkte ook. En nog een. Het systeem controleerde op geen enkel moment of dat nummer ook echt van ons was.
Elk nummer dat we probeerden leverde volledige ticketdata op. Wedstrijd, vak, rij, stoel, prijs, ticket-ID, barcode. Maar wij zijn grondig. Als je kunt lezen, kun je dan ook schrijven? Kun je iemands ticket doorverkopen zonder dat diegene het weet?
We testten het één keer. Op één ticket. En zetten het direct weer terug. Het werkte. Het systeem zei gewoon "success" en zette het ticket te koop. Zonder enige check.
De directie van Ajax
Om de impact duidelijk te maken testten we het op de directie van Ajax zelf. Want als het bij hún niet veilig is, bij wie dan wel? π€
Jordi Cruijff, technisch directeur. 6 tickets. Ajax vs PSV, Ajax vs FC Twente, Ajax vs FC Utrecht. Vak 115, rij 21, stoel 131 en 132. €194 per stuk. Zijn seizoenkaart lag op ons scherm. π±
Menno Geelen, algemeen directeur. 402 tickets. Vierhonderdtwee. Met werkende barcodes. Inclusief Champions League. De baas van Ajax, en wij hadden zijn complete seizoen in handen. π
402 tickets. Van de directeur. Met werkende barcodes. π¬
We wisten precies waar de algemeen directeur van Ajax zat bij elke thuiswedstrijd. Welke stoel, welk vak, welke rij. In een stadion met 55.000 mensen. Bij inlichtingendiensten noemen ze dit "locational intelligence." Waar is het doelwit, wanneer, hoe vaak. Normaal heb je daar een team voor nodig. Bij Ajax had je er een rechtermuisklik voor nodig.
Account-overname: de identiteitswissel
Maar het werd nog erger. We ontdekten iets wat bij inlichtingendiensten "identity takeover" heet. Je kon iemands digitale identiteit loskoppelen van zijn account en je eigen identiteit eraan koppelen. In twee stappen. Geen sporen. Het slachtoffer merkt het pas als hij bij de ingang staat en zijn kaart niet werkt.
Twee calls. Geen extra wachtwoord. Geen bevestigingsmail. Geen "weet je het zeker?" Gewoon: stap 1, stap 2, klaar. De seizoenkaart van Jordi Cruijff? Nu van jou. Zijn €194-stoel bij Ajax-PSV? Ga lekker zitten.
Wat een echte aanvaller hiermee zou doen
Wij testten dit uitsluitend op eigen accounts in eigen beheer om de kwetsbaarheid te bewijzen. Een crimineel zou duizenden klantnummers aflopen. Elke hit levert tickets op die doorverkocht kunnen worden. Ajax-PSV kaarten gaan voor €200+ op de zwarte markt. Met de identiteitswissel zou hij seizoenkaarten kunnen overnemen. De echte eigenaar belt dan de klantenservice: "Mijn kaart werkt niet meer." Maar het echte gevaar? Een crimineel kan kiezen wie er op welke stoel zit in een stadion met 55.000 mensen.
Hoofdstuk 3: 538 Stadionverboden op Straat
De KNVB houdt een lijst bij van iedereen met een stadionverbod. Gevochten, racisme, vuurwerk, dat soort dingen. Die lijst is geheim. Logisch ook. Het is een strafregister. Wie er op staat wil dat niet op Facebook zien. π€
Ajax downloadt deze lijst naar hun app om te controleren of een gebruiker gebanned is. Normaal gesproken zou het systeem alleen moeten antwoorden met "ja" of "nee." Staat deze persoon op de lijst? Klaar.
In plaats daarvan stuurde het systeem de volledige lijst. Alle 538 personen. Met hun Contact ID, de begindatum van hun verbod, en de einddatum. De controle of je erop stond, gebeurde op je telefoon. Niet op de server.
Stel je voor dat een nachtclub bij binnenkomst de volledige lijst van alle gebande gasten in het hele land naar elke bezoeker stuurt, en dan vraagt: "Sta jij hierop? Nee? OkΓ©, kom maar binnen." Dat is wat de Ajax-app deed.
De app stuurde de volledige lijst naar ons toe. Gewoon zo. Automatisch bij het opstarten. 538 personen met al hun gegevens, recht je telefoon in geladen. Wij vroegen er niet om. De app deed het zelf. Elke Ajax-fan met de app had dit strafregister op zijn telefoon staan. Zonder het te weten. ππ¬
En toen ontdekten we iets waar we echt van schrokken: 13 personen met een actief stadionverbod hadden nog steeds werkende seizoenkaarten. Ze konden gewoon naar binnen. Het systeem blokkeerde niks. Wij wisten exact waar ze zaten. Vak, rij, stoel. Gebande hooligans met een werkende seizoenkaart. Bij Ajax. In 2026. π€―
Gebande hooligans in het stadion ποΈ
De C3V-database is er om gevaarlijke personen buiten het stadion te houden. Maar Ajax controleerde die lijst op de telefoon van de gebruiker zelf. Bij een inlichtingendienst noemen ze dit een "client-side trust violation." Je vertrouwt het apparaat van de gebruiker om de beslissing te nemen. Dat is alsof je een verdachte zijn eigen achtergrondcheck laat doen. Bij Ajax was dat de beveiliging. In een stadion met 55.000 mensen.
Wat een echte aanvaller hiermee zou doen
Voor een inlichtingendienst is dit soort data goud. Een complete database van personen met een geweldsverleden, gekoppeld aan real-time locatiegegevens in een stadion met 55.000 bezoekers. Dat is een surveillancelijst die je cadeau krijgt. Voor een criminele organisatie is het chantage-materiaal. Voor een rivaliserende hooligangroep is het een doelwitlijst met stoelnummers. De C3V-lijst bestond om mensen te beschermen. Ajax maakte er een wapen van door hem naar elke telefoon te sturen.
Hoofdstuk 4: De Barcode, Lopen Door Het Hek
Tot nu toe hadden we data. Veel data. Maar de vraag die ons niet losliet: kun je met al deze informatie ook daadwerkelijk het stadion binnenlopen?
Ajax gebruikt TixNGo voor digitale tickets. Dynamische QR-codes die regelmatig vernieuwen. Klinkt veilig toch? π Wij onderschepten de app terwijl hij draaide en keken mee met hoe hij de barcodes versleutelt en ontsleutelt. Dat levert veel informatie op. We ontdekten dat de app alles lokaal doet. De versleutelde barcode komt via de API, de app pakt hem uit. Wij volgden het spoor, stap voor stap, en bouwden de volledige keten van API-sleutel tot werkende QR-code.
Dit is hoe die keten eruitziet:
We zijn niet naar de stadioningang gelopen. Dat zou strafbaar zijn. Maar elke stap apart? Bewezen. We testten of het systeem tokens zou genereren zonder blokkade. Dat deed het. Zonder limiet. Geen rate limiting, geen waarschuwing, geen alert. Het systeem zag geen verschil tussen een echte fan en ons. We haalden tickets op met werkende barcodes. We laadden ze in de app. De QR-codes verschenen op het scherm. Klaar om te scannen. π
Stel je voor dat je de sleutel van iemands auto kunt kopiëren door zijn kenteken te googelen. Dat je daarmee de auto kunt openen, starten, en wegrijden. Je doet het niet, want het is strafbaar. Maar je bewijst dat het kàn. En dat is precies wat wij hebben gedaan.
Wat een echte aanvaller hiermee zou doen
Een crimineel koopt een telefoon van €50 en een prepaid SIM. Injecteert het token. Loopt het stadion binnen op de stoel van iemand anders. Maar denk groter. Een georganiseerde groep kan tien, twintig, honderd telefoons voorbereiden. Honderd stoelen. Op elke plek in het stadion iemand neerzetten die daar niet hoort. Bij inlichtingendiensten heet dit "asset placement." Mensen op strategische posities zetten zonder dat iemand het doorheeft. Bij Ajax kon je het doen met een script en een stapel prepaid telefoons.
Hoofdstuk 5: Het Complete Plaatje
Elke kwetsbaarheid op zich is al ernstig. Maar de werkelijke schade zit in de combinatie. Bij inlichtingendiensten noemen ze dit een "kill chain": een reeks losse stappen die samen een compleet aanvalspad vormen. Van de eerste verkenning tot het uiteindelijke doel. Bij Ajax bouwden wij die kill chain in 55 uur.
Ajax gebruikt zes verschillende identiteitssystemen die niet met elkaar praten. Zes nummers voor dezelfde persoon, verspreid over zes eilanden die onafhankelijk van elkaar kwetsbaar waren. Geen enkel systeem controleerde of jij was wie je beweerde te zijn. Alsof zes bewakers elk een andere deur bewaken, maar geen van allen met elkaar praten. Een aanvaller hoeft maar één van hen te passeren.
Een aanvaller kon:
1. Via de publieke broncode de API-sleutel bemachtigen (30 seconden)
2. Met die sleutel het emailadres van een fan opzoeken en bevestigen (5 seconden)
3. Daarmee een authenticatie-token genereren, zonder wachtwoord (10 seconden)
4. Alle persoonlijke gegevens opvragen: naam, adres, geboortedatum, telefoonnummer (10 seconden)
5. Alle tickets met barcodes opvragen (5 seconden)
6. Vanuit daar is account-overname of ticketmanipulatie mogelijk (10 seconden)
Totale tijd van broncode lezen tot volledige account-overname: één minuut. En het systeem had geen enkele beveiliging die dit stopte. Geen rate limiting. Geen monitoring. Geen alerts. 300.000 fans, allemaal op dezelfde manier bereikbaar. Ajax merkte er niks van. π€·
Dit is geen theorie
Elke stap in deze keten is afzonderlijk getest en bewezen werkend. Het systeem had geen rate limiting, geen monitoring en geen blokkade. Het zijn geen aannames. Het zijn feiten. En er zijn nog meer bevindingen die we hier niet bespreken.
Hoofdstuk 6: Hoe Dit Kon Gebeuren
Ajax geeft tientallen miljoenen uit aan spelers. Honderden miljoenen omzet per jaar. En ze hebben ongetwijfeld beveiligingsaudits laten doen. Waarschijnlijk door een gerenommeerd bedrijf. Waarschijnlijk met een dure scanner. En waarschijnlijk kregen ze een rapport van honderd pagina's met een groen vinkje. π’
Dat is het probleem.
De kwetsbaarheden die wij vonden, worden door geen enkele scanner ter wereld gevonden. Niet door Nessus. Niet door Qualys. Niet door Burp Suite op autopilot. Je kunt security-software van honderdduizenden euro's op dit systeem loslaten en die geeft een schoon rapport terug. Waarom? Omdat de code zelf niet kapot is. Er zit geen SQL-injectie in. Geen cross-site scripting. Geen verouderde software. De logica is kapot. De volgorde van handelingen. De aannames over wie wat mag. En dat snapt een computer niet. Daar heb je een mens voor nodig die begrijpt hoe het systeem écht werkt en die denkt als een aanvaller.
Een scanner checkt: is de deur op slot? Ja? Groen vinkje. Wat een scanner niet checkt: mag de postbode ook bij de kluis? Kan de schoonmaker de alarmcode veranderen? Dat zijn logica-fouten. En dáár zat Ajax vol mee. Niet één. Niet twee. Meer dan 37.
De fouten vinden is het makkelijke deel. De kunst zit in het verbinden. Ajax heeft zes losse systemen die niks van elkaar weten. Zes eilanden. Wij bouwden de brug ertussen. Van emailadres naar account, naar tickets, naar barcodes, naar de stadioningang. Die keten bestond niet. Wij hebben hem gebouwd. En dat is precies wat een echte crimineel ook zou doen. Het verschil? Wij belden Ajax daarna op. Een crimineel niet. π
De meeste pentesters leveren een PDF in en gaan door naar de volgende klant. Wij werken anders. Wij graven door tot we de complete keten begrijpen. Niet alleen welke deur openstaat, maar waar die deur naartoe leidt, en waar die gang eindigt. Bij inlichtingendiensten noemen ze dat "full-spectrum analysis." Je stopt niet bij de eerste vondst. Je stopt als je het hele systeem begrijpt. Dat kostte ons 55 uur. Maar dat is het verschil tussen een rapport dat in een la verdwijnt en een bevinding die 300.000 mensen raakt.
Hoofdstuk 7: Wat Er Daarna Gebeurde
Normaal gesproken eindigt ons werk met een rapport, een handdruk, en een veiliger systeem. Bij 95% van onze opdrachten hoort niemand er ooit van. Dat is hoe het hoort. Maar wat Ajax deed na onze melding, dwong ons een andere weg te kiezen.
Zondag.De Melding
We ontdekten de eerste kwetsbaarheden op een zondagavond. Binnen enkele uren hadden we genoeg bewijs om te weten dat dit ernstig was. We meldden onze bevindingen diezelfde nacht via responsible disclosure aan Ajax Amsterdam. Het rapport dat we stuurden, werd binnen 16 seconden geopend.
Maandag.Het Telefoongesprek
De volgende ochtend belde Ajax. De eerste reactie was: "Deze bevindingen zijn van iemand anders."
Ze beweerden dat een andere partij hetzelfde rapport had ingediend. Dat onze rapportage niet origineel was. Dat we iemand anders' werk presenteerden als het onze.
Dat was niet waar. Elk script, elke API-call, elke screenshot was van ons. We hadden 55 uur non-stop gewerkt. De tijdstempels bewezen het. De tooling was van ons. Maar Ajax stelde zich op alsof wij de verdachten waren, niet de helpers.
Halverwege het gesprek de vraag: "Wat wil je eigenlijk? Wat wil je bereiken?"
Dat 300.000 fans veilig zijn. Dat was het enige wat we wilden.
Na het gesprek stuurden we een gedetailleerde rapportage van onze eerste bevindingen. We gaven aan welke portalen direct offline moesten. Het ticketsysteem met de barcodes van 300.000 fans. De interne portalen die wagenwijd openstonden. Alles stond erin. Duidelijk. Concreet. Met prioriteiten.
Maandag t/m Woensdag.De Stilte
Ajax handelde. Deels. Ze haalden één portaal offline. Het portaal met interne bedrijfsdata. De deur waar hun eigen belangen achter lagen.
De portalen die de fans raakten? De ticketsystemen? De C3V-database? Die bleven staan. 72 uur lang. Alsof de gegevens van 300.000 seizoenkaarthouders minder belangrijk waren dan hun interne bedrijfsdata.
In die 72 uur vonden wij meer. Nieuwe endpoints. Nieuwe kwetsbaarheden. De identiteitswissel. De TixNGo-keten. Met elke scan werd het plaatje groter en de urgentie hoger. En Ajax deed niks.
72 uur
DrieΓ«nzeventig uur lang stonden de gegevens van honderdduizenden fans bloot. Ajax wist ervan. Ze hadden het rapport gelezen in 16 seconden. Ze hadden de spelersdata beschermd. Maar de fans? Die konden wachten.
De Dreigmail
Toen, midden in die stilte, kregen we een e-mail van Ajax. Geen update over de fixes. Een waarschuwing. We moesten "oppassen." Er werd verwezen naar 2017.
Wij vertelden Ajax dat de gegevens van hun hele fanbase openlagen. De reactie was een dreigende e-mail. Op dat moment realiseerden we ons dat Ajax niet van plan was om de fans te beschermen.
RTL Nieuws
We namen een besluit dat we liever niet hadden genomen. We belden RTL Nieuws. Niet om Ajax te beschadigen. Maar omdat 300.000 fans het recht hadden om te weten dat hun gegevens al 72 uur onbeschermd waren terwijl Ajax de boel probeerde stil te houden.
Een journalist kwam langs. We lieten alles zien. Live. Op zijn eigen laptop. Met zijn eigen ogen. Hij verifieerde elke stap zelf.
RTL belde Ajax.
Ajax: "Het is allemaal niet waar. Wat er beweerd wordt, klopt niet."
RTL: "Weten jullie het zeker?"
Ajax: "Ja. We weten het zeker."
Terwijl Ajax aan de telefoon beweerde dat het niet kon, stonden de seizoenkaarten van hun eigen directeur op het scherm van een RTL-laptop. Vak, rij, stoel, barcode. Alles.
De Uitnodiging
Na dat telefoontje veranderde de toon ineens. Ajax wilde praten. Maar alleen in de Johan Cruijff ArenA. Op hun terrein. Op hun voorwaarden. ποΈ
Wij zeiden: jullie zijn welkom bij ons. Alles laten zien. Rustig. Normaal. Gewoon twee partijen die een probleem oplossen.
Ajax weigerde. Het moest de ArenA zijn. Per se.
Op dat moment gaven we RTL Nieuws groen licht voor publicatie. Niet met plezier. Maar omdat het de enige manier was om 300.000 fans te beschermen die Ajax zelf niet wilde beschermen.
Waarom we dit verhaal vertellen
Dit is niet hoe wij normaal werken. Bij het overgrote deel van onze opdrachten eindigt het met een rapport, een fix, en een handdruk. Geen publiciteit. Geen pers. Gewoon een veiliger systeem. Wij geloven in stille professionaliteit. Maar responsible disclosure werkt alleen als beide partijen meewerken. Wij meldden de kwetsbaarheden dezelfde nacht. We gaven prioriteiten aan. We wachtten 72 uur. Wat we terugkregen was ontkenning, dreigementen, en een weigering om de fansystemen offline te halen. Op dat moment was publicatie geen keuze meer. Het was de enige manier om de fans te beschermen die Ajax niet wilde beschermen.
Nawoord
Na onze melding heeft Ajax één van de vier sleutels geroteerd. Één. De andere drie, waaronder de sleutel die al sinds 2019 in de Android-app zat, waren op het moment van schrijven nog steeds actief. Zeven jaar lang kon iedereen erin. En Ajax wist het.
Laat dat even zakken. Niet dagen. Niet weken. Zeven jaar. Terwijl 300.000 fans hun identiteitsbewijs uploadden, hun bankgegevens koppelden, hun seizoenkaart activeerden.lag de sleutel tot al die data in een bestand dat elke informatica-student met een gratis tool kon openen. En toen wij het meldden, roteerden ze één sleutel en noemden het opgelost.
Data die is gelekt, kun je niet terugstoppen. Je kunt een slot vervangen, maar niet ongedaan maken dat iemand al binnen is geweest. Dat iemand je naam, je adres, je geboortedatum, je stoelnummer, je barcode heeft gezien. Dat is geen risico meer. Dat is een feit. En geen enkele sleutelrotatie verandert daar iets aan.
De vraag die Ajax moet beantwoorden
Hoeveel mensen hebben deze sleutels gevonden vóór ons? In zeven jaar tijd? Wij meldden het. Maar wij zijn onderzoekers. Wie het vóór ons vond en het niet meldde.die heeft de data. En Ajax heeft geen idee wie dat is, hoeveel het er zijn, of wat ze ermee gedaan hebben. Want er was geen logging. Geen monitoring. Geen alarm. Zeven jaar lang stond de deur open en niemand keek of er iemand naar binnen liep.
Dit artikel beschrijft de contouren. De werkelijkheid is uitgebreider. Er zijn bevindingen die we hier niet bespreken. Niet omdat ze minder ernstig zijn, maar omdat ze te gevaarlijk zijn om publiek te maken zolang Ajax ze niet heeft opgelost.
Wij deden wat we konden. We meldden het dezelfde nacht. We wachtten. We gaven kansen. En toen die kansen niet werden gepakt, kozen we voor de fans. Dat zouden we altijd weer doen.
En als je de Ajax-app nog op je telefoon hebt staan: je weet nu wat je te doen staat.
Hoe AquaX normaal werkt
Dit artikel laat een uitzonderlijke situatie zien. Normaal gesproken werken wij onder NDA, in stilte, en eindigt elk project met een veiliger systeem en een tevreden opdrachtgever. Wij denken als aanvallers zodat onze klanten dat niet hoeven te vrezen. Wij openen je app, lezen je broncode, testen je systemen, en bouwen de aanvalsketen die een crimineel zou gebruiken. Het verschil: wij bellen je op, lopen alles door, en helpen je het te fixen. Geen publiciteit. Geen pers. Alleen resultaat.
In 55 uur vonden we 37+ kwetsbaarheden bij een van de grootste organisaties van Nederland. Wat zouden we bij jouw organisatie vinden? Neem contact op en slaap morgen weer rustig.