Vorige week schreef iemand malware om bestanden uit de werkmap van Claude te stelen. Het werkte, zo'n beetje. Het lekte ook zijn eigen GitHub-token in het pakket, en zo vonden onderzoekers het account van de aanvaller, zijn testruns en de hele klungelige operatie pijnlijk in het zicht.
Laat dat even bezinken. De dief liet zijn sleutels in het slot zitten.
Op 27 mei waarschuwde OX Security voor een npm-pakket genaamd mouse5212-super-formatter. Ze doopten de campagne Malware-Slop, en die naam dekt de lading.
Wat het precies deed
Het pakket deed zich voor als een formatter. Eronder zat een infostealer met één taak: alles in /mnt/user-data pakken, de map die Claude gebruikt voor uploads en outputs, en die naar een GitHub-repository van de aanvaller wegsluizen.
Dat verpakte het als een "archive deployment sync"-tooltje. Even een repo valideren, een "network status snapshot" grijpen, en stilletjes je werkmap naar een externe repo kopiëren. Zo'n 676 downloads. Ongeveer zeven echte exfiltraties in de repo van de aanvaller, grotendeels zijn eigen tests.
En het GitHub-account erachter? Aangemaakt op 26 mei, een paar uur voor de eerste kwaadaardige upload. Met het private token er voor iedereen leesbaar in.
Dit is niet het werk van een zorgvuldige tegenstander. Dit is iemand die een model vroeg een infostealer te schrijven, klakkeloos uploadde wat eruit kwam, en het nooit controleerde. De malware heeft dezelfde vingerafdrukken als de code die wij allemaal shippen: snel, plausibel, en niet begrepen door degene die op push drukte.
Het goede nieuws is meteen ook het slechte nieuws
En dit is het ongemakkelijke deel. De klungeligheid is de enige reden dat dit verhaal grappig is.
Haal het gelekte token en de amateuristische werkwijze weg, en wat overblijft is een precieze, gerichte aanval. Hij ging niet achter je .env aan. Hij scande niet op AWS-sleutels op de bekende plekken. Hij ging recht op /mnt/user-data af, omdat de persoon, of het model, precies wist waar Claude de bestanden bewaart die jij aanlevert.
Het doelwit was niet je machine. Het doelwit was je agent.
Dat is de verschuiving die niemand hardop zegt. Jarenlang gingen supply chain-aanvallen achter build-servers aan, CI-tokens, het npm-account van een overwerkte maintainer. Nu richten ze zich op het ene proces op je machine dat overal leesrechten heeft, dat zonder nadenken vreemde code uitvoert, en dat jij hebt opgedragen namens jou te handelen.
Waarom de agent het sappigste doelwit is
Bekijk eens wat een coding-agent eigenlijk is, door de bril van een aanvaller.
- Hij draait met jouw credentials. Je GitHub-token, je cloud-sleutels, je 1Password-sessie als die ontgrendeld is. De agent hoeft geen rechten te verhogen. Die van jou had hij al.
- Hij installeert dingen zonder nadenken. "Voeg een datum-library toe."
npm install. De agent leest het pakket niet. Hij controleert de maintainer niet. Hij draait de lifecycle scripts, want dat is wat install doet. Je hebt een enthousiaste stagiair ingehuurd en hem je bedrijfspas en een shell gegeven. - Zijn configbestanden voeren code uit. Dit is de venijnige. De Shai-Hulud-worm die sinds vorig voorjaar rondgaat, dropt een
.claude/settings.jsonen een.vscode/tasks.jsonin de repo. Open je het project in Claude Code of VS Code en de payload draait opnieuw. Je editorconfig is nu een manier om code uit te voeren.
Geen van deze dingen is een bug. Het zijn de features. Het hele punt van een agent is dat hij handelt zonder te vragen. Gemak en aanvalsoppervlak zijn hetzelfde oppervlak.
Het blijft niet klungelig
Als Malware-Slop het hele verhaal was, kon je erom lachen en doorlopen. Dat is het niet.
Spoel terug naar 19 mei. Iemand vergiftigde de echte Nx Console-extensie, de legitieme, ergens tussen elf en achttien minuten lang in de marketplace. Dat was lang genoeg. De payload cascadeerde van een TanStack npm-pakket, de extensie in, op de laptop van een GitHub-medewerker, en van daaruit de interne infrastructuur van GitHub in. Zo'n 3.800 private repositories liepen de deur uit. De credential stealer zocht specifiek naar Claude Code-configuraties, 1Password-kluizen, npm- en AWS-sleutels. De buit ging te koop voor vijftigduizend dollar.
Hetzelfde doelwit. Hetzelfde draaiboek. De sleutels van de agent, de config van de agent, het vertrouwen van de developer. Het enige verschil tussen de komedie en de inbraak is vakmanschap, en vakmanschap is goedkoop.
Je hebt dus twee voorbeelden. Eén aanvaller die een model zijn malware liet schrijven en over zijn eigen veters struikelde. Eén bende die precies wist wat ze deed en in minder dan twintig minuten de kasten van GitHub leeghaalde. Ze mikten op hetzelfde.
Beide kanten vibe-coden nu
Er zit een grimmige symmetrie in die ik maar niet van me af kan zetten.
Wij genereren code die we niet helemaal lezen, shippen die op het vertrouwen van het model, en noemen het productiviteit. Een kwart ervan gaat de deur uit met bekende kwetsbaarheden. Nu werken de mensen die ons aanvallen op dezelfde manier. Ze prompten een model voor een infostealer zoals wij er een prompten voor een CRUD-endpoint, en shippen de slop net zo goed zonder hem te lezen.
Dezelfde kwaal. Andere kant van het toetsenbord.
De token-lekkende amateur is hoe de dreiging er vandaag uitziet. Lang representatief blijft hij niet. De tools waarmee hij boven zijn kunnen uitstijgt, worden elke maand beter, en de vakkundige bendes, zie Nx Console, waren nooit de klungelaars.
Wat je echt moet doen
Je kunt je hier niet uit prompten. Je hebt grenzen nodig waar de agent zich niet uit kan praten, dezelfde les als uit de dag dat Claude mijn database verwijderde: een regel in een prompt is een suggestie, een grens op systeemniveau is echt.
- Beperk de credentials van de agent. Hij heeft geen breed GitHub-token met org-brede toegang nodig. Geef hem de smalste scope die de taak vraagt, en niets dat voor vijftigduizend door te verkopen is.
- Sandbox de werkmap. Dat
/mnt/user-dataüberhaupt bestaat, is goed ontwerp. Het betekent dat Claude ergens geïsoleerd draait. Houd het zo. Draai de installs van de agent niet op dezelfde machine waar je echte sleutels staan. - Stop met het draaien van install scripts die je niet hebt gelezen.
npm install --ignore-scriptsals standaard. Pin je lockfile. Behandel een nieuwe dependency die de agent voorstelt als onvertrouwd tot je ernaar hebt gekeken, want de agent doet dat niet. - Review configbestanden als code. Een diff die
.claude/settings.jsonof.vscode/tasks.jsontoevoegt, is een diff die een manier toevoegt om code uit te voeren. Dat hoort in de review, niet doorgewuifd als "gewoon config". - Vertrouw het keurmerk niet. Nx Console was de echte, geverifieerde, populaire extensie. Toch werd hij vergiftigd. Reputatie is geen garantie.
De kern
Het grappigste detail uit deze hele episode, de aanvaller die zijn eigen token lekte, is ook het eerlijkste. Het vertelt je precies waar we staan. De drempel om malware te schrijven die je agent als doelwit neemt, ligt nu ongeveer op die van een formatter-tooltje. Laag, en dalend.
Je agent is het krachtigste, meest goedgelovige, meest van credentials voorziene ding op je machine. Behandel hem ernaar.
Want de volgende die er een model op richt, denkt er wel aan zijn sleutels uit het slot te halen.