Dev / CodingNieuwsAI-generated

42 GitHub-repo's gekaapt met hooks voor Claude en Cursor

De npm-campagne die vorige week onder de naam testmetest opdook, reikt verder dan losse pakketjes. Onderzoekers Guy Korolevski en Yair Benamou van JFrog Security Research meldden op 26 oktober 42 bewapende GitHub-repositories, verspreid over elf legitieme eigenaren: echte ontwikkelaars, studenten en een organisatie.

Hooks voor je codeassistent

Het opvallendste: in die repo's stonden startbestanden voor AI-codetools en IDE's — uitvoeringshooks voor Claude, Gemini, Cursor en VS Code, naast .github/init.js. In één repo werd die set op 22 oktober toegevoegd in commit 5ab640e1. Diezelfde repo diende als versleutelde dataopslag: op 25 oktober bevatte hij 27 bestanden data/snap-*.json, bijgewerkt met de nietszeggende commitboodschap chore: sync.

Wie zo'n repo opent in een omgeving die deze bestanden automatisch leest, laat de aanvaller code uitvoeren. Dat is het hele punt van de hooks.

Waarom niemand het zag

Waarom bleef dit onder de radar? De payloads zaten in polymorfe wrappers van 12,9 tot 13,7 MB, te groot voor de GitHub-zoekfunctie en de contents-API — de paden waarmee dit soort compromittering normaal wordt opgespoord. Securitybedrijf SafeDep rapporteerde op 22 oktober nog geen slachtoffers of besmette pakketten van derden te hebben gevonden; JFrog komt op basis van de GitHub-kant tot een andere conclusie en stelt dat er al op 28 september echte repo's bewapend waren. Commitdatums waren gekopieerd of vervalst, dus auteursdatums zijn geen betrouwbaar spoor.

De bezorging veranderde onderweg ook. In plaats van een JavaScript-loader leveren drie pakketten een gecompileerde Node-addon (addon.node, plus addon_win.node voor Windows) met een eenregelige postinstall. Ernaast staat een bestand .napi_cache dat op een build-cache lijkt. De addon zoekt zijn eigen map op via /proc/self/maps, XOR't elke byte van dat bestand met 0x96, zet het resultaat in /tmp en start het losgekoppeld met node — maar weigert te draaien in CI-omgevingen, containers en debuggers, juist om scanners te ontwijken.

In de npm-pakketten werd uitvoering bij installatie geregeld via een binding.gyp met commando-expansie, zonder een gewoon installscript te declareren.

Gelekte npm-tokens via een nep-CodeQL

Sommige publicatiebranches bevatten een workflow met de naam CodeQL die geen code scande. Hij dumpte de omgevingsvariabelen, inclusief NPM_TOKEN, base64-gecodeerd in een artefact scan-output dat één dag bewaard bleef. JFrog onderschepte er 29 voordat ze verliepen.

In dezelfde groep gekaapte eigenaren vonden de onderzoekers ook workflows die het internet afzochten op cPanel- en WHM-systemen om CVE-2026-41940 te misbruiken, een authenticatie-omzeiling uit de Known Exploited Vulnerabilities-catalogus van CISA. JFrog bevestigt de scans, maar vond geen bewijs van geslaagde inbraken.

Wat je nu kunt doen

De adviezen hieronder komen uit het JFrog-rapport:

  • Loop in alle repo's die toegankelijk waren voor getroffen accounts deze paden na: .github/init.js, .claude/settings.json, .gemini/settings.json, .cursor/mcp.json, .cursor/rules/setup.mdc, .vscode/tasks.json, plus onverwachte hooks in composer.json of een Makefile en commits met skip-checks:true.
  • Inventariseer de repo-bomen direct. Vertrouw niet op GitHub-codezoek of de contents-API: de wrappers zijn te groot voor die paden.
  • Verwijder onbevoegde branches chore/ci-* en deps/upd-*, schakel kwaadaardige workflows uit en wis de nep-artefacten scan-output.
  • Trek tokens in en roteer sleutels voor GitHub, GitLab, npm, PyPI, RubyGems, cloud, SSH, Vault, Kubernetes en AI-providers die beschikbaar waren voor het getroffen account of de CI-omgeving.
  • Let op de volgorde: verwijder eerst de persistentie net-health-checker en pkg-runtime, inclusief LaunchAgents en systemd user services, en trek daarna het gestolen GitHub-token in. De worm bevat namelijk een wiper die afgaat bij het intrekken van dat token.
  • Wie een versie met de volledige worm installeerde, moet de host als gecompromitteerd beschouwen en opnieuw opbouwen vanaf vertrouwde bronnen.
  • Wees wantrouwig bij pakketten die vanuit postinstall een .node-addon starten, zeker als ze zich presenteren als placeholder of stub.