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

Tietoturva

Sovelluksesi on matalan riskin. CI/CD-putkesi ei ole.

Jos ohjelmistosi on sisäinen, suppea tai tylsä, on järkevää laittaa tietoturva listan loppupäähän. Toimitusketjuhyökkäykset eivät katso, mitä sovelluksesi tekee. Ne kohdistuvat putkeen ja paketteihin, jotka ovat kaikille sovelluksille yhteisiä.

Päivitetty

Päättely pitää paikkansa, tiettyyn pisteeseen asti

Kuulemme tämän usein, ja se tulee yleensä järkevistä lähtökohdista. Sovellus on sisäinen dashboard, dataputki tai pieni palvelu, jolla on kourallinen käyttäjiä. Siinä ei ole mitään, mitä hyökkääjä haluaisi. Tietoturvabudjetti menee ensin asiakkaille näkyvään tuotteeseen.

Logiikka pätee sovellukseen. Se ei päde siihen, miten sovellus rakennetaan. Jokaisella tiimillä on toimitettavasta riippumatta CI-putki, jossa on tunnistetietoja, ja riippuvuuspuu, jota se ei ole itse kirjoittanut. Niihin kannattaa hyökätä juuri siksi, että ne ovat yhteisiä, ja murto niissä ulottuu kaikkeen muuhun, mihin samat tunnistetiedot pääsevät: pakettirekistereihisi, pilvitileihisi ja muihin repositorioihisi.

Hyökkäykset, jotka eivät välittäneet siitä, mitä sovellus teki

Yksikään näistä tapauksista ei kohdistunut tietynlaiseen sovellukseen. Jokainen niistä tavoitti tiimit työkalun tai paketin kautta, jota ne käyttivät ohjelmistojen rakentamiseen.

tj-actions/changed-files, 2025

Laajasti käytetty GitHub Action, joka tunnistaa muuttuneet tiedostot, kaapattiin. CISAn mukaan haitalliset versiot olivat käytössä 12.–15.3.2025, ja murto paljasti salaisuuksia, kuten käyttöavaimia, GitHubin henkilökohtaisia käyttötunnuksia, npm-tunnuksia ja yksityisiä RSA-avaimia. Wizin mukaan koodi tyhjensi CI-runnerin muistin, joten julkisissa repositorioissa salaisuudet päätyivät työnkulkujen lokeihin. Työnkulut, jotka viittasivat actioniin versiotagilla, ajoivat haitallisen koodin riippumatta siitä, mitä repositoriossa oli.

Shai-Hulud-npm-mato, 2025

Syyskuussa 2025 CISA varoitti itseään monistavasta madosta, joka oli kaapannut yli 500 npm-pakettia. Se keräsi GitHubin henkilökohtaisia käyttötunnuksia sekä AWS:n, Google Cloudin ja Azuren pilvi-API-avaimia. Palo Alto Networks Unit 42 kuvasi, miten se käytti varastettuja npm-tunnuksia julkaistakseen saastuneita versioita uhrin muista paketeista ja miten myöhempi aalto ajettiin pre-install-vaiheessa, mikä laajensi sen ulottuvuutta CI/CD-putkiin.

Shai-Hulud and other supply chain attacks

Miten Shai-Hulud-npm-mato varasti tunnistetietoja asennuksen yhteydessä ja julkaisi niiden avulla lisää vaarantuneita paketteja, sekä aiemmat hyökkäykset, joiden jatkumoa se on.

Petteri Pulkkinen ja Erika Marttinen, Kubernetes Community Days Helsinki 2026, 4:30–7:57 videosta SBOMbastic: Getting Ready for Upcoming EU Cybersecurity Regulation in Software Supply Chains.

Codecov Bash Uploader, 2021

Hyökkääjä sai haltuunsa tunnistetiedon Codecovin Docker-konttikuvan build-prosessin virheen kautta ja muokkasi Bash Uploader -skriptiä, jota monet tiimit ajoivat CI:ssä. 31.1.–1.4.2021 muutettu skripti saattoi lähettää ympäristömuuttujia, mukaan lukien CI-ympäristössä saatavilla olleet tunnistetiedot, tunnukset ja avaimet, kolmannelle osapuolelle. Se havaittiin, kun asiakas huomasi, ettei skriptin tarkistussumma täsmännyt.

xz utils, 2024

Haitallista koodia upotettiin XZ Utilsin versioihin 5.6.0 ja 5.6.1. XZ Utils on datanpakkauskirjasto, joka voi olla mukana Linux-jakeluissa. CISA neuvoi palaamaan vaarantumattomaan versioon, kuten 5.4.6:een, ja etsimään merkkejä haitallisesta toiminnasta. Pakkauskirjasto on suunnilleen niin arkinen riippuvuus kuin olla voi, ja se oli silti kohde.

event-stream, 2018

Avuliaaksi ylläpitäjäksi tekeytynyt henkilö otti haltuunsa suositun npm-paketin event-stream ja lisäsi siihen versiossa 3.3.6 haitallisen riippuvuuden, flatmap-streamin. npm-tiimin mukaan haittakoodi kohdistui yhteen tiettyyn sovellukseen, Copay-bitcoinlompakkoon. Kaikki muutkin event-streamin asentaneet saivat haitallisen koodin.

Mitä yhteistä näillä tapauksilla on

  • Ne tapahtuivat buildin tai asennuksen aikana. Haitallinen koodi ajettiin kehittäjien koneilla ja CI-runnereilla, ei tuotantosovelluksessa.
  • Ne tavoittelivat tunnistetietoja. Putken tunnukset ja avaimet olivat saalis, koska ne avaavat ovia rakennettavaa projektia laajemmalle.
  • Ne tulivat luotettujen nimien kautta. Tuttu action, tuttu paketti, tuttu skripti. Kukaan ei päättänyt asentaa haittaohjelmaa.
  • Ensimmäinen kysymys jälkeenpäin oli sama. Hakiko jokin buildeistamme huonon version, ja mihin se ylsi? Tiimit, joilla ei ollut tallennetta siitä, mitä kukin buildi käytti, joutuivat rekonstruoimaan sen.

Miltä pieni vaiva näyttää

Perusasioihin et tarvitse tietoturvatiimiä. Suurin osa GitHubin ja CISAn neuvoista mahtuu lyhyeen listaan:

  1. Kiinnitä kolmansien osapuolten GitHub Actionit täyteen commit-SHA:han tagin sijaan, jotta siirretty tagi ei voi muuttaa sitä, mitä ajetaan.
  2. Commitoi lukitustiedostot (lockfile) ja kiinnitä riippuvuuksien versiot tunnetusti hyviin julkaisuihin.
  3. Anna CI-tunnuksille suppeimmat toimivat oikeudet ja vaihda ne, kun tapaus koskee jotain käyttämääsi.
  4. Vaadi tietojenkalastelun kestävä monivaiheinen tunnistautuminen kehittäjä- ja julkaisutileille.
  5. Pidä tallennetta siitä, mitä kukin buildi asensi, jotta voit vastata kysymykseen "olimmeko altistuneita?" datan etkä muistin perusteella.

Neljä ensimmäistä ovat konfiguraatiota. Viidennen useimmat pienet tiimit ohittavat, koska se vaatii työkaluja.

Miten CRACI sopii mukaan pienellä vaivalla

CRACI hoitaa kirjanpidon ja lisää verkkorajan ilman, että sinun tarvitsee muuttaa sovellustasi tai työnkulkujasi.

  • Yksi rivi jobia kohden. Vaihda runs-on arvoon craci. GitHub Actions -työnkulkusi pysyvät ennallaan, ja ajot näkyvät edelleen GitHubissa.
  • SBOM jokaisesta buildista. CRACI tallentaa paketit, jotka kukin jobi todella hakee, myös välimuisteista palautetut paketit, ja vie tuloksen CycloneDX- tai SPDX-muodossa.
  • Verkkojälki jokaisesta jobista. Kun tapauksesta ilmoitetaan, voit tarkistaa, mitkä buildit hakivat kyseisen paketin ja mihin kukin jobi otti yhteyden.
  • Egress-käytäntö, jonka voit asettaa oletuksena estäväksi. Salli jobin tarvitsemat pakettilähteet, niin kaapatulla vaiheella on vähemmän paikkoja, joihin lähettää löytämänsä. Käytännöt noudattavat fail closed -periaatetta, ja rikkeistä lähtee hälytys.
  • Jatkuva uudelleenarviointi. Valvotut SBOM:t tarkistetaan uudelleen, kun uusia haavoittuvuuksia julkaistaan, joten vanha buildi ei pysy "puhtaana" vain siksi, ettei kukaan katsonut.

Rajoituksista selvästi: egress-käytäntö ei olisi estänyt tj-actions-murtoa tulostamasta salaisuuksia julkiseen lokiin, eikä mikään työkalu peru vuotanutta tunnusta. Kiinnittäminen ja tunnusten vaihtaminen ovat edelleen tärkeitä. CRACI muuttaa sen, kuinka nopeasti pystyt vastaamaan, olitko altistunut, ja kuinka pitkälle kaapattu vaihe ylettyy.

Ensimmäisen työnkulun saa käyntiin asentamalla GitHub Appin ja vaihtamalla yhden rivin muotoon runs-on: craci.

Mitä se maksaa

CRACI veloittaa vain build-minuuteista: $0.002 vCPU-minuutilta ($0.004 oletusarvoiselta 2 vCPU:n runnerilta), mitattuna sekunneittain, ilman kuukausimaksua ja ilman SBOM-kohtaista maksua. Kaikki ehdot löydät hinnoittelusta. Ehdot täyttävät startupit voivat hakea startup-ohjelmaan, josta saa vähintään 100k ilmaista build-minuuttia ja käytännön apua käyttöönottoon.

Jos myyt ohjelmistoja EU:ssa, kannattaa myös tarkistaa, koskeeko EU:n kyberkestävyyssäädös (Cyber Resilience Act, CRA) sinua. CRA-oppaamme kertoo soveltamisalan ja määräajat.

Katso, mitä buildisi todella hakee

Varaa demo ja aja yksi työnkuluistasi CRACI:lla. Saat jobista SBOM:n ja verkkojäljen ilman muutoksia sovellukseesi.

Varaa demo