Vuonna 2026 raportoitiin päivässä 131% enemmän CVE:itä kuin edellisenä vuonna.

Red team vs. blue team

Toimitusketjuhyökkäykset: miten hyökkääjät pääsevät sisään ja miten ne pysäytetään

Hyökkääjät kohdistuvat harvoin sinun yritykseesi. He kohdistuvat pakettiin, Actioniin tai build-työkaluun, josta yritykset kaikkialla ovat riippuvaisia, ja kokeilevat sitten exploitia kaikkiin kerralla. He eivät tarvitse riippuvuuslistaasi. Sinä tarvitset.

Mikä on ohjelmistotoimitusketjuun kohdistuva hyökkäys?

Ohjelmistotoimitusketjuun kohdistuva hyökkäys vaarantaa jotain, mistä tuote rakennetaan, kuten avoimen lähdekoodin paketin, CI/CD-komponentin tai build-järjestelmän, sen sijaan että hyökkäisi suoraan tuotteeseen. Moderni ohjelmisto on enimmäkseen muiden koodia: suurin osa siitä tulee avoimen lähdekoodin paketeista, ja suurin osa niistä on transitiivisia riippuvuuksia, joita kukaan tiimissä ei valinnut. Vaaranna yksi laajasti käytetty komponentti, niin tavoitat jokaisen organisaation, joka rakentaa sen varaan.

Se muuttaa sitä, miten hyökkääjät valitsevat kohteensa. He eivät tutki yhden yrityksen riippuvuuksia. He valitsevat paketin tai työkalun, jolla on laaja levinneisyys, hyödyntävät sitä kaikkialla ja katsovat, mikä vastaa.

Ohjelmistotoimitusketjun hyökkäysten tyypit

Haavoittuvan riippuvuuden hyödyntäminen

Suositusta avoimen lähdekoodin paketista julkistetaan aukko, ja hyökkääjät hyödyntävät sitä jokaisessa tuotteessa, joka toimittaa haavoittuvan version, yleensä transitiivisena riippuvuutena, jota kukaan ei valinnut suoraan.

Haitalliset pakettijulkaisut

Hyökkääjä kaappaa ylläpitäjän tilin, tai mato varastaa julkaisutokeneita, ja julkaisee myrkytetyn version luotetusta paketista. Se käynnistyy heti, kun buildi asentaa sen, kuten Shai-Hulud-npm-madon tapauksessa.

Takaovella varustetut upstream-projektit

Kontribuuttori ansaitsee ajan mittaan luottamuksen avoimen lähdekoodin projektissa ja ujuttaa sitten haitallista koodia julkaisuun, jonka alavirran jakelut ja tuotteet ottavat käyttöön, kuten xz utilsin takaovessa.

Typosquatting ja dependency confusion

Suosittuja paketteja muistuttavat nimet nappaavat kirjoitusvirheet. Dependency confusion menee pidemmälle: julkinen paketti, jolla on sama nimi kuin yrityksen sisäisellä paketilla, asennetaan sen tilalle.

Vaarantuneet CI/CD-komponentit

GitHub Action tai muu build-työkalu kaapataan, ja jokainen sitä käyttävä putki ajaa hyökkääjän koodia salaisuudet ulottuvilla, kuten tj-actionsin ja Codecovin tapauksissa.

Buildin ja artefaktien peukalointi

Itse buildia muutetaan, tai artefakti vaihdetaan buildin ja käyttöönoton välissä, joten puhdas lähdekoodipuu tuottaa silti vaarantuneen julkaisun, kuten SolarWindsin tapauksessa.

Esimerkkejä toimitusketjuhyökkäyksistä

SolarWinds on tunnetuin toimitusketjuhyökkäys: buildissa lisätty haitallinen koodi toimitettiin asiakkaille tavallisena päivityksenä. Uusimmat hyökkäykset kohdistuvat sen sijaan pakettirekistereihin ja CI-putkiin, joissa yksi vaarantunut paketti tai Action ulottuu jokaiseen sitä käyttävään buildiin. Uusimmat ensin:

npm-mato · syyskuusta 2025

Shai-Hulud

Itsestään leviävä mato, joka käynnistyy, kun saastunut npm-paketti asennetaan, varastaa npm-, GitHub- ja pilvitokeneita ja julkaisee saastuneita versioita uhrin muista paketeista. Useimmat tartunnat tapahtuivat CI:ssä.

Näin tarkistat buildisi →

CVE-2025-30066 · maaliskuu 2025

tj-actions/changed-files

CISA:n mukaan tämän suositun GitHub Actionin jokainen versio oli vaarantunut kolmen päivän ajan, ja salaisuuksia paljastui työnkulkujen lokeissa. Työnkulut, jotka viittasivat siihen tagilla, ajoivat hyökkääjän koodia.

CVE-2024-3094 · maaliskuu 2024

xz utilsin takaovi

Andres Freund löysi takaoven xz:n versioista 5.6.0 ja 5.6.1 huomattuaan, että SSH-kirjautumiset käyttivät liikaa prosessoriaikaa. Se oli tuotu itse upstream-projektiin.

CVE-2021-44228 · joulukuu 2021

Log4Shell

Apache Log4j 2:n aukko antoi lokiin kirjattavaa viestiä hallitsevan hyökkääjän ajaa mielivaltaista koodia, CVSS-luokitus 10.0. Useimmille tiimeille vaikeinta oli selvittää, mitkä sovellukset sisälsivät log4j-coren, yleensä riippuvuuden riippuvuutena.

tammi–huhtikuu 2021

Codecov Bash Uploader

Hyökkääjät muuttivat Bash Uploader -skriptiä, jota tiimit ajoivat CI-putkissaan, niin että se lähetti CI-ympäristön, mukaan lukien tunnistetiedot, tokenit ja avaimet, Codecovin infrastruktuurin ulkopuoliselle palvelimelle. Se toimi huomaamatta 31. tammikuuta alkaen, kunnes asiakas ilmoitti siitä 1. huhtikuuta.

SUNBURST · joulukuu 2020

SolarWinds Orion

Hyökkääjillä oli pitkäaikainen, salainen pääsy SolarWinds Orionin build-prosessiin, ja he lisäsivät haitallista koodia Orionin julkaisuihin 2019.4–2020.2.1 HF1, jotka asiakkaat asensivat tavallisina päivityksinä. CISA antoi vastauksena hätädirektiivin.

Red team vs. blue team

Miten toimitusketjuhyökkäykset etenevät vaihe vaiheelta

Jokainen vaihe hyökkääjän sanoin, ja puolustus, joka vastaa siihen.

Vaihe 1/3

Tiedustelu

Kohdetta ei tarvitse tuntea. Valitse paketti, niin kohteet valikoituvat itsestään.

Red team

Panosta riippuvuuksiin, jotka kaikilla on

Et tarvitse heidän lukitustiedostoaan. Suositut paketit ovat syvällä lähes kaiken transitiivisessa puussa, eivätkä useimmat tiimit osaa sanoa, mitä niistä ne toimittavat. Julkiset vihjeet rajaavat joukkoa: versiot JavaScript-bundleissa ja HTTP-otsakkeissa, julkiset repositoriot ja konttikuvat. Ja mitä tahansa heidän buildinsa hakee lukitustiedoston ulkopuolelta, kuten postinstall-skriptin lataama binääri tai heidän pohjakuvansa alla olevat kerrokset, heidän skannerinsa ei koskaan nähnyt, joten kukaan ei paikkaa sitä.

Blue team

Tunne jokainen riippuvuus, jonka kukin buildi haki

CRACI näkee jokaiseen buildiin tulevan liikenteen ja tallentaa jokaisen paketin ja tiedoston, jonka buildi hakee, myös piilossa olevat riippuvuudet, jotka lukitustiedostoon perustuvilta työkaluilta jäävät huomaamatta, transitiivisen puun joka tasolla. SBOM:si tulee buildista, joka toimitettiin, joten sinulla on lista, jota hyökkääjä ei koskaan tarvinnut, ennen kuin kukaan lähtee etsimään.

Buildin aikana tallennetut SBOM:t →

Red team

Toimi heti, kun uusi CVE julkaistaan

Uusi tietoturvatiedote kertoo tarkalleen, mitkä versiot ovat haavoittuvia. Rakenna exploit, skannaa kaikkea, mikä vastaa, ja anna skannauksen kertoa, keitä he ovat. Aloitat samana päivänä, kun heidän tiiminsä vielä kysyy Slack-ketjussa "koskeeko tämä meitä?".

Blue team

"Koskeeko tämä meitä?" vastataan buildin tallenteesta

CRACI arvioi seuratut SBOM:t jatkuvasti uudelleen uusien haavoittuvuustietojen perusteella. Buildihistoria näyttää, mitkä buildit sisälsivät haavoittuvan riippuvuuden, suoran tai transitiivisen, joten tiedät, minne se toimitettiin ja kuinka pitkään.

Koskeeko tämä meitä? →

Vaihe 2/3

Sisään

Hyödynnä aukko ennen kuin se paikataan, tai ohita aukko ja kulje heidän putkensa kyydissä.

Red team

Generoi hyökkäys julkistamispäivänä

Tekoäly muuttaa tietoturvatiedotteen ja paikkauksen diffin toimivaksi hyökkäykseksi ennen kuin heidän tietoturvatiiminsä on tehnyt tiketille triagen. Julkistaminen on lähtölaukauksesi. Heidän sprinttisuunnittelunsa on ensi viikolla.

Blue team

Lopeta haavoittuvan version toimittaminen

Käytäntöportit voivat estää minkä tahansa buildin, joka sisältää tietyn CVE:n, joten haavoittuvan version toimittaminen loppuu heti, kun päätät, olipa se kuinka syvällä puussa tahansa.

CVE-haavoittuvuuksien korjaus →

Red team

Kirjoita yksi tagi uudelleen, aja tuhannessa putkessa

Työnkulut luottavat tageihin, kuten @v4, ja tageja voi siirtää. Vaaranna yksi suosittu GitHub Action, niin jokainen sitä käyttävä työnkulku ajaa koodiasi heidän salaisuutensa ulottuvilla.

Blue team

Tiedä tarkalleen, minkä Actionin kukin buildi ajoi

CRACI tallentaa työnkulun ajamat GitHub Actionsit buildin SBOM:iin kiinnitettynä committiin, joka todella ajettiin. Kun Action vaarantuu, näet, mitkä buildit ajoivat haitallista koodia, eikä sinun tarvitse arvailla tagin perusteella.

CI/CD-tietoturvan tarkistuslista →

Vaihe 3/3

Ulos

Ota salaisuudet ja jää odottamaan lisää.

Red team

Soita kotiin heidän CI:stään

Haitallinen pakettijulkaisu ajaa asennusskriptinsä heidän buildissaan, jossa tokenit ja pilvitunnukset ovat. CI-runnerit pääsevät yleensä koko internetiin, joten salaisuudet lähtevät palvelimellesi ennen kuin kukaan tietää paketin olevan haitallinen.

Blue team

Buildi pääsee vain sinne, minne sen tarvitsee

Oletuksena estäväksi asetettu lähtevän liikenteen käytäntö päästää buildin pakettilähteisiinsä ja julkaisukohteisiinsa ja estää kaiken muun. Haittaohjelma, joka lähettää salaisuutesi hyökkääjän palvelimelle, estetään, vaikka olisit ennennäkemättömän hyökkäyksen ensimmäinen uhri, ja saat hälytyksen käytännön rikkomisesta.

Lähtevän liikenteen käytännöt →

Red team

Jää runnerille seuraavaa jobia varten

Pitkäikäiset itse ylläpidetyt runnerit ovat lahja: istuta jotain työtilaan tai työkaluvälimuistiin ja odota, että seuraava jobi ja seuraavat salaisuudet tulevat luoksesi.

Blue team

Yksi eristetty virtuaalikone jobia kohden

Jokainen CRACI-jobi ajetaan omassa eristetyssä virtuaalikoneessaan, joten mikään, minkä yksi jobi jättää jälkeensä, ei odota seuraavaa. Sinun ei myöskään tarvitse paikata ja koventaa runneriparvea.

Hallinnoidut vs. itse ylläpidetyt runnerit →

Julkistamisen jälkeen

Kilpajuoksu alkaa, kun tietoturvatiedote julkaistaan

Hyökkääjän ei tarvitse tietää, että käytät riippuvuutta. Hän kokeilee exploitia kaikkialla ja katsoo, mikä vastaa. Tiimisi täytyy tietää, minne riippuvuus toimitettiin. Ero on siinä, joudutko lähtemään etsimään, ja kilpajuoksuja on joka vuosi enemmän: katso, kuinka monta CVE:tä julkaistaan päivittäin.

Red team

  1. Tietoturvatiedote julkaistu
  2. Exploit generoitu
  3. Skannaa kaikki haavoittuvaa versiota ajavat
  4. Sisällä jokaisessa osumassa, myös sinun

Blue team ilman buildin tallennetta

  1. Tietoturvatiedote julkaistu
  2. "Koskeeko tämä meitä?"
  3. Käy läpi repositoriot, lukitustiedostot ja kuvat
  4. Löydä transitiivinen kopio, jota kukaan ei listannut
  5. Selvitä, mitkä julkaisut toimittivat sen
  6. Paikkaa

Blue team ja CRACI

  1. Tietoturvatiedote julkaistu
  2. Seuratut SBOM:t arvioitu uudelleen
  3. Buildihistoria näyttää buildit ja ajanjakson
  4. Käytäntöportti estää uudet buildit, joissa on CVE

Miten ohjelmistotoimitusketjun hyökkäyksiä ehkäistään

Mikään yksittäinen kontrolli ei pysäytä jokaista toimitusketjuhyökkäystä. Kerrosta nämä, niin jokainen yllä oleva vaihe vaikeutuu. Putken puolelta yksityiskohtaisemmin kertoo CI/CD-putken tietoturvan tarkistuslista.

  1. Tiedä, mitä jokainen buildi toimittaa. Pidä SBOM jokaisesta buildista, mukaan lukien transitiiviset riippuvuudet ja kaikki lukitustiedoston ulkopuolelta haettu. Repositorion skannaus ei ole tallenne julkaisusta.
  2. Seuraa toimitettua, ei vain oletushaaraa. Tarkista julkaistut buildit uusia tietoturvatiedotteita vasten ja säilytä buildihistoria, joka kertoo, mistä lähtien olit altistunut.
  3. Kiinnitä riippuvuudet ja Actionsit. Käytä lukitustiedostoja ja kiinnitä GitHub Actionsit täyspitkään commitin SHA-tunnisteeseen. GitHubin mukaan se on ainoa tapa käyttää actionia muuttumattomana julkaisuna.
  4. Pysäytä haavoittuvat versiot buildissa. Aseta buildeille portti niiden haavoittuvuuksien perusteella, joita et halua toimittaa, jotta korjaus ei voi huomaamatta peruuntua.
  5. Oletuksena estävä lähtevä liikenne CI:ssä. Päästä buildit vain pakettilähteisiinsä ja julkaisukohteisiinsa, jotta haitallinen koodi ei voi lähettää salaisuuksia ulos, ei edes hyökkäyksessä, jota kukaan ei ole ennen nähnyt.
  6. Eristä jobit ja rajaa salaisuudet. Aja jokainen jobi uudella, eristetyllä koneella ja anna kullekin jobille vain sen tarvitsemat tokenit ja oikeudet.
  7. Varmenna artefaktit ennen käyttöönottoa. Allekirjoita alkuperätiedot buildin aikana ja tarkista, että tuotannossa ajettava on täsmälleen se, mikä rakennettiin.
  8. Vaihda salaisuudet tietoturvapoikkeaman jälkeen. Jos vaarantunut paketti tai Action ajettiin putkessasi, käsittele jokaista salaisuutta, johon se pääsi käsiksi, paljastuneena. Näin CISA neuvoi tj-actionsin vaarantumisen jälkeen.

He eivät tarvitse listaa. Sinä tarvitset.

Hyökkääjät seuraavat jokaista tietoturvatiedotetta ja kokeilevat exploitia kaikkiin heti, kun haavoittuvuus julkistetaan. He eivät koskaan tarvinneet riippuvuuslistaasi. Sinä tarvitset. CRACI antaa tiimillesi tuon listan suoraan buildista ja sulkee ovet, joihin hyökkääjät luottavat: avoimen lähtevän liikenteen ja jaetut runnerit.

Toimitusketjuhyökkäykset: usein kysytyt kysymykset

Mikä on ohjelmistotoimitusketjuun kohdistuva hyökkäys?

Hyökkäys koodia, työkaluja tai palveluja vastaan, joista tuote rakennetaan, kuten avoimen lähdekoodin pakettia, CI/CD-komponenttia tai build-järjestelmää vastaan, eikä itse tuotetta vastaan. Yksi vaarantuminen ulottuu jokaiseen organisaatioon, joka käyttää kyseistä komponenttia.

Mitä esimerkkejä ohjelmistotoimitusketjuun kohdistuneista hyökkäyksistä on?

Shai-Hulud-mato (vuodesta 2025) levisi saastuneiden npm-pakettien kautta ja varasti CI-salaisuuksia. tj-actions/changed-files-vaarantuminen (CVE-2025-30066) kaappasi suositun GitHub Actionin. xz utilsin takaovi (CVE-2024-3094) ujutettiin upstream-pakkauskirjastoon. Log4Shell (CVE-2021-44228) hyödynsi aukkoa laajalti käytetyssä Javan lokikirjastossa. Codecovin Bash Uploaderia (2021) muutettiin lähettämään CI-tunnistetietoja ulkopuoliselle palvelimelle, ja SolarWinds Orion (2020) toimitti buildissa lisättyä haitallista koodia.

Mikä on tunnetuin toimitusketjuhyökkäys?

SolarWinds. Vuonna 2020 hyökkääjät, joilla oli salainen pääsy SolarWinds Orionin build-prosessiin, lisäsivät haitallista koodia sen julkaisuihin, ja asiakkaat asensivat sen tavallisena päivityksenä. Se osoitti, ettei puhdas lähdekoodipuu riitä: itse buildin on oltava luotettava ja todennettavissa.

Tietävätkö hyökkääjät, mitä riippuvuuksia yritykseni käyttää?

Yleensä eivät, eikä heidän tarvitse. Useimmat hyökkäykset kohdistuvat pakettiin eivätkä yritykseen: kun tietoturvatiedote on julki, hyökkääjät kokeilevat exploitia kaikkeen, mikä saattaa ajaa haavoittuvaa versiota, ja katsovat, mikä vastaa. Julkiset vihjeet, kuten versiot JavaScript-bundleissa tai avoimen lähdekoodin repositorioissa, auttavat heitä tähtäämään. Epäsymmetria on siinä, että sinä tarvitset listan: tietääksesi, koskeeko asia sinua, sinun on tiedettävä, mitä jokainen buildi toimitti, myös mitä se haki lukitustiedoston ulkopuolelta.

Miten ohjelmistotoimitusketjun hyökkäyksiä ehkäistään?

Mikään yksittäinen kontrolli ei pysäytä niitä kaikkia. Pidä SBOM siitä, mitä jokainen buildi toimittaa, ja seuraa sitä uusia tietoturvatiedotteita vasten, kiinnitä riippuvuudet ja GitHub Actionsit, estä haavoittuvat versiot buildissa, rajoita, mihin CI-jobit voivat yhdistää, eristä jobit ja rajaa niiden salaisuudet ja varmenna, että käyttöön otetut artefaktit ovat ne, jotka rakensit.

Miten suojaudun npm:n toimitusketjuhyökkäyksiltä?

Committaa lukitustiedosto ja asenna siitä CI:ssä, ja poista asennusskriptit käytöstä, kun buildi ei tarvitse niitä (npm:n --ignore-scripts). Pidä kirjaa siitä, mitkä pakettiversiot kukin buildi todella asensi, jotta voit tarkistaa nopeasti, kun uusi aalto, kuten Shai-Hulud, julkistetaan. Rajoita, mihin CI-jobit voivat yhdistää, jotta haitallinen asennusskripti ei voi lähettää tokeneitasi ulos, ja vaihda jokainen token, johon saastunut versio olisi voinut päästä käsiksi.

Mitä red team vs. blue team tarkoittaa tässä?

Tietoturvaharjoituksissa red team esittää hyökkääjää ja blue team puolustaa. Tämä sivu käyttää samaa jakoa: toimitusketjuhyökkäyksen jokainen vaihe hyökkääjän sanoin, ja puolustuksen vastaus siihen.

Havaitseeko CRACI haitallisia paketteja?

Tunnetut kyllä. Haitallinen julkaisu, jolla on julkaistu CVE, kuten xz:n takaovi, merkitään kuten mikä tahansa muu haavoittuvuus, ja käytäntöportti voi estää buildit, jotka sisältävät sen. CRACI ei analysoi pakettien käyttäytymistä eikä pisteytä mainetta, joten upouusi haitallinen paketti jää merkitsemättä, kunnes siitä on tietoturvatiedote. Sitä varten on lähtevän liikenteen käytäntö: oletuksena estävällä asetuksella buildi pääsee vain tarvitsemiinsa palvelimiin, joten paketti ei voi lähettää salaisuuksiasi ulos, ei edes hyökkäyksessä, jota kukaan ei ole ennen nähnyt.