Het bestand dat nooit werd geopend

De onderzoeker legde een lokaas neer. Eén bestand in een testrepository, dat de assistent nooit hoefde te openen en waarnaar hij nooit verwees: een kanarie. Daarna hing hij het verkeer aan een proxy en keek wat Grok Build, de coding-CLI van xAI, werkelijk naar huis stuurde. De kanarie kwam terug in de onderschepte bundel. Het bestand had de machine verlaten zonder ooit gelezen te zijn.

De gepubliceerde analyse op netwerkniveau beschrijft voor versie 0.2.93 twee gescheiden kanalen. Het eerste is het kanaal dat iedereen van een cloudassistent verwacht: een modelkanaal dat de bestanden meestuurt die de agent daadwerkelijk leest, zodat hij antwoord kan geven. Het tweede is een opslagkanaal op de achtergrond dat een momentopname van de hele werkmap naar een opslagbucket schuift, of de agent die bestanden nu heeft bekeken of niet.

Het gat tussen die twee is de vondst. Bij een testrepository van 12 gigabyte verplaatste het modelkanaal ongeveer 192 kilobyte. Het achtergrondkanaal verplaatste 5,10 gibibyte, in 73 blokken van ruwweg 75 megabyte elk. Dat is ongeveer 27.800 keer zoveel. Het ene kanaal deed het werk. Het andere kopieerde het gebouw.

Tussen de meegestuurde bestanden zat een getrackte .env, precies de conventie waarmee ontwikkelaars bewaren wat nooit mag reizen: API-sleutels, database-wachtwoorden. Het ging letterlijk en zonder enige afscherming de deur uit.

De knop op het scherm was niet de knop op de lijn

Elke AI-ontwikkeltool levert tegenwoordig een schakelaar mee met een variant van "help het model verbeteren". Het is de knop waar inkoop naar vraagt, die een functionaris gegevensbescherming in de beoordeling opschrijft en waar een engineering lead naar wijst als iemand vraagt of de code veilig is.

De onderzoeker zette hem uit. Daarna keek hij wat de server ervan vond. Het settings-endpoint bleef trace_upload_enabled als true teruggeven. De uploads gingen door.

Dit deel is het waard om los te trekken van de kop. Het gebrek was niet dat een coding-assistent code naar een server stuurt. Dat is de hele premisse van een cloudassistent, en precies daarom leest u de voorwaarden voordat u er een installeert. Het gebrek is dat de toestemmingsknop en het datapad nooit met elkaar verbonden waren. De knop stuurde de training aan. De upload liep door een andere leiding, en niets op het scherm reikte tot daar.

Een controle die niets controleert is erger dan geen controle, want een team dat hem ziet staan, houdt op met kijken.

De serverside fix is de eigenlijke vondst

Op 13 juli 2026 stopten de uploads. Leerzaam is hoe. Er kwam geen nieuwe clientrelease, geen versiesprong, geen changelog-regel die gebruikers konden nalezen en goedkeuren. Dezelfde binary 0.2.93 deed simpelweg geen opslagverzoeken meer, omdat de server begon te antwoorden met een nieuwe vlag die de codebase-upload uitzette. Elon Musk zei dat de al geüploade data, in zijn woorden, "completely and utterly deleted" zou worden, volledig en volstrekt gewist.

Lees die volgorde nog eens vanuit governance. Het gedrag van de software op de laptops van uw ontwikkelaars werd op afstand veranderd, door de leverancier, zonder het artefact aan te raken dat u had goedgekeurd. Langs dezelfde weg had het dus ook de andere kant op kunnen veranderen, en van uw kant uit had het er identiek uitgezien.

Dat is de structurele les, en die reikt veel verder dan xAI. Wordt het datagedrag van een tool bepaald door serverside vlaggen, dan vertelt één beoordeling van de client alleen wat hij deed op de dag dat u keek. Wat hij nu doet, vertelt die beoordeling niet. Een versie vastpinnen, de release notes lezen en aftekenen: dat is een proces voor software die haar gedrag in de binary meelevert. De meeste AI-tooling doet dat niet meer.

xAI heeft niet gepubliceerd waarom de uploads bestonden, hoe lang de data bewaard is gebleven, wie erbij kon en hoeveel gebruikers geraakt zijn. Die vier antwoorden heeft een klant nodig om het incident te kunnen wegen, en het ontbreken ervan is zelf informatie.

Wat een Europees team zijn klanten nu verschuldigd is

Begin met de aanname die het minst kost als ze onjuist blijkt: behandel elk secret dat in een met Grok Build geopende repository stond als bekendgemaakt. Roteer API-sleutels, database-inloggegevens, ondertekeningssleutels en tokens. Ga daarbij af op welke repositories geopend zijn, niet op welke bestanden de assistent volgens u gelezen heeft, want juist dat is de vondst: die twee verzamelingen zijn niet dezelfde.

Kijk daarna wat er verder in die repositories stond. Broncode alleen is een commercieel probleem. Persoonsgegevens, of inloggegevens voor systemen die persoonsgegevens bevatten, zijn een juridisch probleem. Onder de AVG is een AI-leverancier die uw repository in uw opdracht verwerkt een verwerker, en een kopie van die repository die in een opslagbucket buiten het afgesproken doel belandt, is een bekendmaking die u moet beoordelen. Blijkt het een meldplichtig datalek, dan gaat de melding naar de Autoriteit Persoonsgegevens, binnen 72 uur nadat u ervan wist, en het herstelwerk van een leverancier zet die klok niet terug.

Essentiële en belangrijke entiteiten onder NIS2, in Nederland belegd in de Cyberbeveiligingswet, horen dit te behandelen als een incident in de toeleverketen en het ook zo vast te leggen. Voor de incidentkant is het NCSC het Nederlandse aanspreekpunt. Want dat is het: een gebrek in het product van een leverancier dat uw data ergens heen bewoog waar u niet voor gekozen hebt.

Niets hiervan vraagt zekerheid over wat xAI met de data heeft gedaan. Het vraagt alleen de erkenning dat u op dit moment niet kunt bewijzen dat het niets uitmaakte.

Hoe u hierna een AI-codingtool inkoopt

De nuttige verandering is geen verbod. Teams die AI-codingassistenten botweg verbieden, ontdekken meestal dat hun ontwikkelaars er toch één hebben geïnstalleerd, alleen legt niemand het meer vast. De nuttige verandering is ophouden de client voor de grens aan te zien.

Stel een leverancier drie vragen voordat de volgende tool op een laptop komt. Met welke endpoints praat hij, en kunnen wij dat op ons eigen netwerk zien in plaats van in uw documentatie. Kan uw server veranderen wat de geïnstalleerde client verstuurt zonder een nieuwe versie uit te brengen, en zo ja, waaraan merken wij dat. Als een instelling in onze tenant uitstaat, hoe ziet de serverside weergave van die instelling er dan uit, en laat u ons dat controleren.

Maak de antwoorden vervolgens toetsbaar in plaats van contractueel. Een proxy en een middag hebben deze vondst opgeleverd. Dat is een goedkopere controle dan welke leveranciersvragenlijst ook, en het is de enige die gedrag meet in plaats van bedoeling. Secrets horen intussen helemaal niet in een repository die een coding-agent kan zien: omgevingsvariabelen injecteren tijdens runtime en een beheerde secrets store maken van dit soort incidenten een schouderophalen in plaats van een datalek.

De tools zijn de moeite waard. Wat de moeite niet waard is, is een beoordelingsproces dat het etiket leest en nooit naar de lijn kijkt.