123% meer gemelde CVE's per dag in 2026 dan vorig jaar.

Red team vs blue team

Aanvallen op de softwareketen: hoe aanvallers binnenkomen en hoe u ze stopt

Aanvallers richten zich zelden op uw bedrijf. Ze richten zich op het pakket, de Action of de buildtool waarvan bedrijven overal afhankelijk zijn, en proberen de exploit vervolgens op allemaal tegelijk. Ze hebben uw lijst met afhankelijkheden niet nodig. U wel.

Wat is een aanval op de softwareketen?

Een aanval op de softwareketen compromitteert iets waaruit een product is opgebouwd, zoals een open-sourcepakket, een CI/CD-component of het buildsysteem, in plaats van het product direct aan te vallen. Moderne software is grotendeels code van anderen: het meeste komt uit open-sourcepakketten, en de meeste daarvan zijn transitieve afhankelijkheden die niemand in het team heeft gekozen. Compromitteer één veelgebruikt component, en u bereikt elke organisatie die erop bouwt.

Dat verandert hoe aanvallers doelwitten kiezen. Ze onderzoeken niet de afhankelijkheden van één bedrijf. Ze kiezen een pakket of tool met een grote voetafdruk, misbruiken die overal en kijken wat er antwoordt.

Soorten aanvallen op de softwareketen

Een kwetsbare afhankelijkheid misbruiken

Een fout in een populair open-sourcepakket wordt bekendgemaakt, en aanvallers misbruiken die in elk product dat de kwetsbare versie levert, meestal als transitieve afhankelijkheid die niemand direct heeft gekozen.

Kwaadaardige pakketreleases

Een aanvaller neemt een account van een maintainer over, of een worm steelt publicatietokens, en brengt een vergiftigde versie van een vertrouwd pakket uit. Die draait zodra een build hem installeert, zoals bij de npm-worm Shai-Hulud.

Upstreamprojecten met een backdoor

Een bijdrager wint in de loop van de tijd vertrouwen in een open-sourceproject en smokkelt vervolgens kwaadaardige code in een release die downstream distributies en producten overnemen, zoals bij de backdoor in xz utils.

Typosquatting en dependency confusion

Pakketten met namen die op populaire namen lijken, profiteren van typefouten. Dependency confusion gaat verder: een openbaar pakket met dezelfde naam als een intern pakket van een bedrijf wordt in plaats daarvan geïnstalleerd.

Gecompromitteerde CI/CD-componenten

Een GitHub Action of andere buildtool wordt gekaapt, en elke pipeline die hem gebruikt, voert de code van de aanvaller uit met de eigen secrets binnen bereik, zoals bij tj-actions en Codecov.

Manipulatie van builds en artefacten

De build zelf wordt gewijzigd, of het artefact wordt tussen build en uitrol verwisseld, zodat een schone broncodeboom toch een gecompromitteerde release oplevert, zoals bij SolarWinds.

Voorbeelden van aanvallen op de softwareketen

SolarWinds is de bekendste aanval op de softwareketen: kwaadaardige code die tijdens de build werd ingevoegd en als normale update aan klanten werd geleverd. De meest recente aanvallen richten zich in plaats daarvan op pakketregistries en CI-pipelines, waar één gecompromitteerd pakket of één gecompromitteerde Action elke build bereikt die ervan gebruikmaakt. Nieuwste eerst:

npm-worm · sinds september 2025

Shai-Hulud

Een zichzelf verspreidende worm die draait wanneer een geïnfecteerd npm-pakket wordt geïnstalleerd, npm-, GitHub- en cloudtokens steelt en geïnfecteerde versies publiceert van de andere pakketten van het slachtoffer. De meeste infecties vonden plaats in CI.

Hoe u uw builds controleert →

CVE-2025-30066 · maart 2025

tj-actions/changed-files

CISA meldde dat elke versie van deze populaire GitHub Action drie dagen lang gecompromitteerd was, met secrets die in workflowlogs werden blootgesteld. Workflows die er via een tag naar verwezen, voerden de code van de aanvaller uit.

CVE-2024-3094 · maart 2024

Backdoor in xz utils

Andres Freund vond een backdoor in xz-versies 5.6.0 en 5.6.1 nadat hij had gemerkt dat SSH-logins te veel CPU gebruikten. De backdoor was in het upstreamproject zelf ingebracht.

CVE-2021-44228 · december 2021

Log4Shell

Door een fout in Apache Log4j 2 kon een aanvaller die een gelogd bericht beheerste, willekeurige code uitvoeren, met een CVSS-score van 10.0. Het moeilijke voor de meeste teams was vinden welke applicaties log4j-core bevatten, meestal als afhankelijkheid van een afhankelijkheid.

januari tot april 2021

Codecov Bash Uploader

Aanvallers wijzigden het Bash Uploader-script dat teams in hun CI-pipelines draaiden, zodat het de CI-omgeving, inclusief inloggegevens, tokens en sleutels, naar een server buiten de infrastructuur van Codecov stuurde. Het draaide onopgemerkt van 31 januari tot een klant het op 1 april meldde.

SUNBURST · december 2020

SolarWinds Orion

Aanvallers hadden al lange tijd heimelijke toegang tot het buildproces van SolarWinds Orion en voegden kwaadaardige code toe aan Orion-releases 2019.4 tot en met 2020.2.1 HF1, die klanten als normale updates installeerden. CISA vaardigde als reactie een noodrichtlijn uit.

Red team vs blue team

Hoe aanvallen op de softwareketen werken, fase voor fase

Elke fase in de woorden van de aanvaller, en de verdediging die daarop antwoordt.

Fase 1 van 3

Verkenning

U hoeft het doelwit niet te kennen. Kies het pakket, en de doelwitten kiezen zichzelf.

Red team

Gok op de afhankelijkheden die iedereen heeft

U hebt hun lockfile niet nodig. Populaire pakketten zitten diep in de transitieve boom van bijna alles, en de meeste teams kunnen niet zeggen welke ze leveren. Openbare aanwijzingen verkleinen de zoekruimte: versies in JavaScript-bundels en HTTP-headers, openbare repositories en containerimages. En wat hun build buiten de lockfile ophaalt, zoals de binary die een postinstall-script downloadt of de lagen onder hun base image, heeft hun scanner nooit gezien, dus niemand patcht het.

Blue team

Ken elke afhankelijkheid die elke build binnenhaalde

CRACI ziet het verkeer dat elke build binnenkomt en legt elk pakket en bestand vast dat hij binnenhaalt, inclusief de verborgen afhankelijkheden die op lockfiles gebaseerde tools missen, op elk niveau van de transitieve boom. Uw SBOM komt uit de build die is geleverd, dus u hebt de lijst die een aanvaller nooit nodig had, voordat iemand gaat zoeken.

SBOM's tijdens de build →

Red team

Kom in actie zodra een nieuwe CVE verschijnt

Een nieuwe advisory vertelt u precies welke versies kwetsbaar zijn. Bouw de exploit, scan op alles wat antwoordt, en laat de scan u vertellen wie ze zijn. U begint dezelfde dag, terwijl hun team in een Slack-thread nog vraagt: "zijn we getroffen?"

Blue team

"Zijn we getroffen?" beantwoord vanuit het buildrecord

CRACI beoordeelt gemonitorde SBOM's doorlopend opnieuw aan de hand van nieuwe kwetsbaarheidsgegevens. De buildgeschiedenis toont welke builds de kwetsbare afhankelijkheid bevatten, direct of transitief, zodat u weet waar die is geleverd en hoe lang.

Zijn we getroffen? →

Fase 2 van 3

Binnenkomen

Misbruik de fout voordat die is gepatcht, of sla de fout over en lift mee op hun pipeline.

Red team

Genereer de aanval op de dag van bekendmaking

AI maakt van een advisory en een patch-diff een werkende aanval voordat hun securityteam het ticket heeft getrieerd. De bekendmaking is uw startschot. Hun sprintplanning is volgende week.

Blue team

Stop met het leveren van de kwetsbare versie

Policy gates kunnen elke build blokkeren die een specifieke CVE bevat, zodat de kwetsbare versie niet meer wordt geleverd op het moment dat u dat besluit, hoe diep in de boom die ook zit.

CVE-remediatie →

Red team

Herschrijf één tag, draai in duizend pipelines

Workflows vertrouwen tags zoals @v4, en tags kunnen worden verplaatst. Compromitteer één populaire GitHub Action en elke workflow die hem gebruikt, voert uw code uit, met hun secrets binnen bereik.

Blue team

Weet precies welke Action elke build heeft gedraaid

CRACI legt de GitHub Actions die een workflow draait vast in de SBOM van de build, vastgepind op de commit die daadwerkelijk heeft gedraaid. Wordt een Action gecompromitteerd, dan ziet u welke builds de kwaadaardige code hebben gedraaid in plaats van het te moeten raden aan de hand van een tag.

CI/CD-beveiligingschecklist →

Fase 3 van 3

Naar buiten

Neem de secrets mee en blijf hangen voor meer.

Red team

Bel naar huis vanuit hun CI

Een kwaadaardige pakketrelease voert zijn installatiescript uit binnen hun build, waar de tokens en cloudinloggegevens staan. CI-runners kunnen meestal het hele internet bereiken, dus de secrets vertrekken naar uw server voordat iemand weet dat het pakket kwaadaardig is.

Blue team

Een build kan alleen bereiken wat hij nodig heeft

Een egressbeleid dat standaard weigert, laat een build zijn pakketbronnen en publicatiedoelen bereiken en blokkeert al het andere. Malware die uw secrets naar de host van een aanvaller stuurt, wordt geblokkeerd, zelfs als patiënt nul van een aanval die nog niemand heeft gezien, en u krijgt een melding van de beleidsovertreding.

Egressbeleid →

Red team

Blijf op de runner voor de volgende job

Langlevende zelfgehoste runners zijn een geschenk: plant iets in de workspace of de toolcache en wacht tot de volgende job, en de volgende set secrets, naar u toe komt.

Blue team

Eén geïsoleerde virtuele machine per job

Elke CRACI-job draait in zijn eigen geïsoleerde virtuele machine, dus niets wat de ene job achterlaat, wacht op de volgende. Er is ook geen vloot runners die u moet patchen en harden.

Beheerde vs zelfgehoste runners →

Na de bekendmaking

De race begint zodra de advisory openbaar wordt

De aanvaller hoeft niet te weten dat u de afhankelijkheid gebruikt. Hij probeert de exploit overal en kijkt wat er antwoordt. Uw team moet weten waar die afhankelijkheid is geleverd. Het verschil is of u moet gaan zoeken, en er zijn elk jaar meer races te lopen: zie hoeveel CVE's er per dag worden gepubliceerd.

Red team

  1. Advisory gepubliceerd
  2. Exploit gegenereerd
  3. Scannen op alles wat een kwetsbare versie draait
  4. Binnen bij elke match, ook bij u

Blue team, zonder buildrecord

  1. Advisory gepubliceerd
  2. "Zijn we getroffen?"
  3. Repo's, lockfiles en images doorzoeken
  4. De transitieve kopie vinden die niemand had vermeld
  5. Uitzoeken welke releases hem hebben geleverd
  6. Patchen

Blue team, met CRACI

  1. Advisory gepubliceerd
  2. Gemonitorde SBOM's opnieuw beoordeeld
  3. Buildgeschiedenis toont de builds en de periode
  4. Policy gate blokkeert nieuwe builds met de CVE

Hoe u aanvallen op de softwareketen voorkomt

Geen enkele maatregel stopt elke aanval op de softwareketen. Combineer deze, en elke fase hierboven wordt moeilijker. Zie voor de pipelinekant in detail de beveiligingschecklist voor CI/CD-pipelines.

  1. Weet wat elke build levert. Bewaar een SBOM per build, inclusief transitieve afhankelijkheden en alles wat buiten de lockfile is opgehaald. Een scan van de repository legt de release niet vast.
  2. Let op wat is geleverd, niet alleen op de standaardbranch. Controleer uitgebrachte builds opnieuw op nieuwe advisories, en bewaar de buildgeschiedenis die u vertelt sinds wanneer u was blootgesteld.
  3. Pin afhankelijkheden en Actions vast. Gebruik lockfiles en pin GitHub Actions vast op een volledige commit-SHA. GitHub noemt dat de enige manier om een action als onveranderlijke release te gebruiken.
  4. Stop kwetsbare versies bij de build. Houd builds tegen op de kwetsbaarheden waarvan u hebt besloten dat ze niet mogen worden geleverd, zodat een fix niet ongemerkt ongedaan kan worden gemaakt.
  5. Standaard weigeren voor egress in CI. Laat builds alleen hun pakketbronnen en publicatiedoelen bereiken, zodat kwaadaardige code geen secrets naar buiten kan sturen, zelfs niet bij een aanval die nog niemand heeft gezien.
  6. Isoleer jobs en beperk secrets. Draai elke job op een nieuwe, geïsoleerde machine en geef elke job alleen de tokens en rechten die hij nodig heeft.
  7. Verifieer artefacten voordat u uitrolt. Onderteken herkomstgegevens tijdens de build en controleer of wat in productie draait, exact is wat is gebouwd.
  8. Roteer secrets na een incident. Heeft een gecompromitteerd pakket of een gecompromitteerde Action in uw pipeline gedraaid, behandel dan elk secret dat binnen bereik was als blootgesteld. Dat was het advies van CISA na de compromittering van tj-actions.

Zij hebben de lijst niet nodig. U wel.

Aanvallers volgen elke advisory en proberen de exploit op iedereen op de dag dat een kwetsbaarheid bekend wordt. Ze hadden uw lijst met afhankelijkheden nooit nodig. U wel. CRACI geeft uw team die lijst, rechtstreeks uit de build, en sluit de deuren waarop aanvallers rekenen: open egress en gedeelde runners.

Aanvallen op de softwareketen: veelgestelde vragen

Wat is een aanval op de softwareketen?

Een aanval op de code, tools of diensten waaruit een product is opgebouwd, zoals een open-sourcepakket, een CI/CD-component of het buildsysteem, en niet op het product zelf. Eén compromittering bereikt elke organisatie die het getroffen component gebruikt.

Wat zijn voorbeelden van aanvallen op de softwareketen?

De Shai-Hulud-worm (sinds 2025) verspreidde zich via geïnfecteerde npm-pakketten en stal CI-secrets. De compromittering van tj-actions/changed-files (CVE-2025-30066) kaapte een populaire GitHub Action. De backdoor in xz utils (CVE-2024-3094) werd in een upstream compressiebibliotheek gesmokkeld. Log4Shell (CVE-2021-44228) misbruikte een fout in een veelgebruikte Java-logbibliotheek. De Bash Uploader van Codecov (2021) werd gewijzigd om CI-inloggegevens naar een externe server te sturen, en SolarWinds Orion (2020) leverde kwaadaardige code die tijdens de build was ingevoegd.

Wat is de bekendste aanval op de softwareketen?

SolarWinds. In 2020 voegden aanvallers met heimelijke toegang tot het buildproces van SolarWinds Orion kwaadaardige code toe aan de releases, en klanten installeerden die als normale update. Het liet zien dat een schone broncodeboom niet genoeg is: de build zelf moet betrouwbaar en verifieerbaar zijn.

Weten aanvallers welke afhankelijkheden mijn bedrijf gebruikt?

Meestal niet, en dat hoeft ook niet. De meeste aanvallen richten zich op een pakket en niet op een bedrijf: zodra een advisory uit is, proberen aanvallers de exploit op alles wat een kwetsbare versie zou kunnen draaien en kijken ze wat er antwoordt. Openbare aanwijzingen, zoals versies in JavaScript-bundels of open-sourcerepositories, helpen hen gericht aan te vallen. De asymmetrie is dat u de lijst wel nodig hebt: om te weten of u bent getroffen, moet u weten wat elke build heeft geleverd, inclusief wat hij buiten de lockfile heeft opgehaald.

Hoe voorkomt u aanvallen op de softwareketen?

Geen enkele maatregel stopt ze allemaal. Bewaar een SBOM van wat elke build levert en monitor die op nieuwe advisories, pin afhankelijkheden en GitHub Actions vast, blokkeer kwetsbare versies bij de build, beperk waarmee CI-jobs verbinding kunnen maken, isoleer jobs en beperk hun secrets, en verifieer dat uitgerolde artefacten de artefacten zijn die u hebt gebouwd.

Hoe bescherm ik me tegen npm-aanvallen op de softwareketen?

Commit een lockfile en installeer ermee in CI, en schakel installatiescripts uit waar een build ze niet nodig heeft (--ignore-scripts van npm). Houd bij welke pakketversies elke build daadwerkelijk heeft geïnstalleerd, zodat u snel kunt controleren wanneer een nieuwe golf zoals Shai-Hulud wordt aangekondigd. Beperk waarmee CI-jobs verbinding kunnen maken, zodat een kwaadaardig installatiescript uw tokens niet naar buiten kan sturen, en roteer elk token dat een geïnfecteerde versie kan hebben bereikt.

Wat betekent red team vs blue team hier?

In beveiligingsoefeningen speelt het red team de aanvaller en verdedigt het blue team. Deze pagina gebruikt dezelfde verdeling: elke fase van een aanval op de softwareketen in de woorden van de aanvaller, beantwoord door de verdediging.

Detecteert CRACI kwaadaardige pakketten?

Bekende wel. Een kwaadaardige release met een gepubliceerde CVE, zoals de xz-backdoor, wordt gemarkeerd zoals elke andere kwetsbaarheid, en een policy gate kan builds blokkeren die hem bevatten. CRACI analyseert geen pakketgedrag en kent geen reputatiescores toe, dus een gloednieuw kwaadaardig pakket blijft ongemarkeerd totdat er een advisory bestaat. Daarvoor dient het egressbeleid: met standaard weigeren kan de build alleen de hosts bereiken die hij nodig heeft, dus het pakket kan uw secrets niet naar buiten sturen, zelfs niet bij een aanval die nog niemand heeft gezien.