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

SBOM-generointi, tallennettu buildin aikana

CRACI on SBOM-generointityökalu, joka tallentaa, mitä kukin GitHub Actions -buildi todella toi mukanaan, sen sijaan että se skannaisi tiedostoja jälkikäteen. Jokainen SBOM kertoo, kuinka kattava se on.

Lyhyesti: aja GitHub Actions -jobisi CRACI-runnereilla, niin jokainen jobi saa SBOM:n hakemistaan paketeista, transitiiviset riippuvuudet ja CI-välimuisteista palautetut paketit mukaan lukien, CycloneDX- tai SPDX-muodossa. Jokaisella SBOM:lla on kattavuustila, ja sitä valvotaan uusien haavoittuvuuksien varalta julkaisun jälkeen. Skannaustyökalut, kuten Syft ja Trivy, päättelevät SBOM:n tiedostoista; CRACI tallentaa sen buildista. Miksi buildin aikana tallennetut SBOM:t eroavat.

Tallennettu buildin aikana, ei skannattu jälkikäteen

Useimmat SBOM-generaattorit lukevat tiedostoja buildin jälkeen ja päättelevät, mitä buildiin luultavasti meni. CRACI generoi SBOM:n omassa CI-runnerissaan. Paketit tunnistava välityspalvelin (proxy) seuraa jokaisen jobin liikennettä pakettilähteisiin, joten SBOM luettelee sen, mitä jobi todella haki, transitiiviset riippuvuudet mukaan lukien, eikä sitä, mitä manifestin mukaan pitäisi tarvita. Tallenne syntyy ilman lukitustiedostoa (lockfile), asennettua riippuvuuspuuta tai erillistä skannausvaihetta.

Recorded during the build, not scanned afterwards A scanner reads a lockfile or manifest after the fact and reconstructs what it thinks went in. CRACI observes the job's traffic to package sources while the build runs, including packages restored from CI caches, so the SBOM lists what the job actually pulled in. A scanner, after the build Lockfile Scanner SBOM Reconstructs what it thinks went in, from the files it can read Nothing tells you what it missed CRACI, during the build Job fetches Proxy records Job SBOM Lists what the job actually pulled in, including packages restored from CI caches Completeness stated for every job

Transitiiviset riippuvuudet joka tasolla

Suurin osa siitä, mitä buildi tuo mukanaan, ei ole suoria riippuvuuksia. Ne ovat riippuvuuksien riippuvuuksia monen tason syvyydessä, eikä osa niistä näy lukitustiedostossa lainkaan: build-skriptin lataamat valmiiksi käännetyt binäärit, välimuistista palautetut paketit, käyttöjärjestelmän paketit. CRACI tallentaa jokaisen paketin, jonka jobi haki, joka tasolla, joten haavoittuvuuksia verrataan koko riippuvuuspuuhun. Rinnakkaisvertailuissa muiden SBOM-työkalujen kanssa tämä kattavampi tallenne on tuonut esiin haavoittuvuuksia, joita muut työkalut eivät raportoineet.

Every layer of transitive dependencies A dependency tree three layers deep. The app depends directly on express, pg and a build script. Express pulls in body-parser and router, which pull in raw-body and path-to-regexp; pg pulls in pg-protocol. The build script fetches a prebuilt library during the build, which bundles a native codec that matches a vulnerability advisory. A lockfile scanner sees the packages the lockfile lists; CRACI records every package the job fetched, at every depth, including the ones only the build pulls in. Your app Direct Layer 2 Layer 3 your-app express pg build script body-parser router pg-protocol prebuilt lib raw-body path-to-regexp native-codec advisory match In the lockfile and the build record Only in the build record: fetched while the job ran Matched an advisory, so it is tracked like any other

CI-välimuisteista palautetut paketit pysyvät SBOM:ssa

Välimuistit ovat kohta, jossa buildin aikainen tallennus yleensä pettää: välimuistista palautettu paketti ei koskaan käy rekisterissä, joten pelkkä välityspalvelin ei näkisi sitä. CRACI kuljettaa riippuvuustiedot välimuistin mukana, joten CI-välimuistista palautetut paketit pysyvät sen jobin SBOM:ssa, joka ne palautti.

Packages restored from CI caches stay in the SBOM A first job fetches packages from a registry through CRACI's proxy and saves a cache. The dependency evidence travels with the cache, so when a later job restores it, those packages stay in that job's SBOM even though they never touched a registry. First run: cache miss npm registry Job 1 fetches Cache + evidence Packages recorded through the proxy Later run: cache hit Job 2 restores Cache + evidence No registry request, packages still recorded Job 2 SBOM express 5.2.1 (from cache) lodash 4.17.21 (from cache) Cache-restored packages stay in the SBOM

Kattavuustila jokaiselle jobille

Haavoittuvuuksien seuranta voi verrata vain niitä komponentteja, jotka SBOM:si luettelee. SBOM:sta puuttuva paketti on haavoittuvuus, josta kukaan ei saa hälytystä. Siksi CRACI ei esitä jokaista SBOM:ia kattavana, vaan ilmoittaa kattavuuden jokaiselle jobille ja välimuistille: Complete, Complete with connections, Incomplete, Unavailable tai Not recorded. Tiedät, mihin SBOM:eihin voit luottaa ja mitkä kaipaavat tarkempaa katsomista.

A completeness state for every job Instead of presenting every SBOM as complete, CRACI states completeness for each job and each cache: Complete, Complete with connections, Incomplete, Unavailable or Not recorded. Workflow run: SBOM completeness Job Completeness build Complete test Complete with connections integration Incomplete docs Not recorded Why it matters Vulnerability tracking can only match listed components. A package missing from the SBOM is a vulnerability nobody is alerted about, so CRACI says when a list is partial.

Ekosysteemit ja formaatit, joita toimitat

CRACI tallentaa paketteja npm-, PyPI-, RubyGems-, Cargo-, Go-, Nix-, OCI-, apt-, apk- ja Git-lähteistä sekä Yocton ja OpenEmbeddedin latausesiasetuksista, ja käsittelee JFrog Artifactoryn npm- ja PyPI-peilejä tunnettuina lähteinä. Mavenin ja Javan tuki on tiekartalla. SBOM:t viedään CycloneDX- ja SPDX-muodossa transitiivisine riippuvuuksineen, valmiina jaettaviksi asiakkaille, kumppaneille ja auditoijille.

Ecosystems and formats CRACI records packages from npm, PyPI, RubyGems, Cargo, Go, Nix, OCI, apt, apk and Git sources, plus Yocto and OpenEmbedded download presets, and treats JFrog Artifactory npm and PyPI mirrors as known sources. Maven and Java are on the roadmap. SBOMs export as CycloneDX or SPDX. Recorded today npm PyPI RubyGems Cargo Go Nix OCI apt · apk Git sources, Yocto presets Artifactory npm, PyPI mirrors On the roadmap Maven and Java Export CycloneDX SPDX With transitive dependencies and declared licenses

Ilmoitettu lisenssi jokaisella komponentilla

Jokainen tallennettu paketti tuo ilmoitetun lisenssinsä SBOM:iin. Näet ennen julkaisua, mitkä riippuvuudet ovat kaupallisen tai muuten rajoittavan lisenssin alaisia, ja copyleft-lisenssit huomataan ennen kuin ne päätyvät tuotteeseesi.

Declared licenses on every component Every recorded package carries its declared license into the SBOM, so restrictive and copyleft licenses show up before you ship. License policy rules can block a build on a license. Job SBOM: components and licenses Component Declared license express 5.2.1 MIT requests 2.32.3 Apache-2.0 serde 1.0.219 MIT OR Apache example-lib 1.4.0 GPL-3.0 copyleft License policy Build blocked: GPL-3.0 is not allowed Caught before it ends up in your product

Alkuperätiedot API:n kautta

SBOM on yksi osa sitä, mitä CRACI tallentaa jokaisesta jobista. Julkinen REST-API palauttaa SBOM:t, verkkojäljet ja alkuperätiedot (provenance), jotka kaikki on tallennettu samasta buildista.

Provenance data from every build Every job on CRACI records the packages it fetched and its network trace. The public REST API returns the job's SBOMs, network trace and provenance. Build release job on CRACI Recorded packages fetched network trace Provenance build data, via the API Ask the API about any job Job → SBOM, trace, provenance Returned by the API Job Packages CycloneDX SBOM Network trace Recorded on every CRACI job, no extra step

Valvonta julkaisun jälkeen

SBOM:n avulla yritys tietää, mitä sen toimittamassa ohjelmistossa on, ja asiakkaat ja viranomaiset pyytävät sitä yhä useammin: EU:n kyberkestävyyssäädös (Cyber Resilience Act, CRA) velvoittaa valmistajat laatimaan sellaisen EU:ssa myytäville tuotteille. CRACI arvioi valvotut SBOM:t uudelleen aina, kun uusia haavoittuvuuksia julkaistaan, kokoaa löydökset kaikista buildeista ja repositorioista ja tukee VEX:iä. Omilta toimittajiltasi keräämiäsi SBOM:eja valvotaan buildiesi rinnalla.

Vulnerability tracking after release After a release ships, its SBOM stays monitored. When a new vulnerability is published, CRACI re-evaluates the monitored SBOMs, finds the affected releases, and the security team triages the finding and routes it to the team that owns the fix. The inventory view shows which software versions are deployed to which products. Release shipped SBOM monitored Later New advisory published Re-evaluated automatically Finding: critical, in 2 releases 1. Triage 2. Route to owner 3. Team fixes Policy gates can block a build on findings · VEX supported Inventory: deployed versions Product Version Web app v4.12.0 Mobile API v2.3.1

Tallennettu SBOM skannatun rinnalla

Skannerit ovat oikea työkalu ohjelmistoille, joita et itse buildannut. Omissa julkaisuissasi buildin tallentaminen muuttaa tämän. Skanneri lukee lukitustiedoston tai buildin tuotoksen ja päättelee, mitä buildiin meni. CRACI näkee buildiin tulevan liikenteen, joten myös asennuskoukkujen, build-skriptien ja peruskuvien tuomat piilotetut riippuvuudet päätyvät SBOM:iin.

How a scanned SBOM and a recorded SBOM are made Left, a scanner: it reads the lockfile after the build, which lists packages A to E, so its SBOM contains A to E. The build also fetched code through an install hook, a build script download and a base image, which are in no lockfile, so the scanned SBOM is missing them. Right, CRACI: it sees the traffic coming into the build, so all eight packages, including the three hidden dependencies, land in the recorded SBOM. Scanner reads files after the build package-lock.json A B C D E the build also fetched install hook download build script download base image layers in no lockfile, so the scan never sees them Scanned SBOM A B C D E missing missing missing CRACI sees the traffic into the build the network build job on CRACI every package that comes in Recorded SBOM A B C D E install hook build script base image hidden ones too
A scanner can only list what the lockfile or the output declares. CRACI sees what actually came into the build, including the hidden dependencies.
Ominaisuus CRACI Skanneripohjainen SBOM-työkalu
Miten komponenttiluettelo syntyy Tallennetaan buildin omasta pakettiliikenteestä Päätellään tiedostoista jälkikäteen
Vaatii lukitustiedoston tai asennetut riippuvuudet Ei Yleensä jommankumman
CI-välimuisteista palautetut paketit Näyttö kulkee välimuistin mukana Vain jos tiedostot ovat paikalla skannatessa
Kattavuustila jobikohtaisesti Viisi tilaa, jobi- ja välimuistikohtaisesti
Allekirjoitettu linkki artefaktista buildiin Ei allekirjoitettuja alkuperätietoja Erillisellä allekirjoitusvaiheella
Ohjelmistot, joita et itse buildannut Lisää toimittajan SBOM sen sijaan
CI-järjestelmät GitHub Actions nyt; muut CI-järjestelmät tiekartalla Toimii missä tahansa CI:ssä
  • Sisältyy
  • Osittain
  • Ei sisälly
  • Tiekartalla

Vertailetko tiettyjä työkaluja? Katso SBOM-työkalut vertailussa: Syft, Trivy, cdxgen, Microsoft SBOM Tool, Dependency-Track ja muut. Laajemman kuvan saat sivulta ohjelmistotoimitusketjun tietoturvatyökalut vertailussa. Otatko SBOM:t käyttöön monessa tiimissä? Katso SBOM-generointi kehitystiimeissä.

SBOM basics: SPDX, CycloneDX and OpenVEX

Mitä SBOM kirjaa, miten SPDX- ja CycloneDX-formaatit eroavat käytännössä ja mitä OpenVEX lisää tietoon siitä, vaikuttaako haavoittuvuus tuotteeseen todella.

Petteri Pulkkinen ja Erika Marttinen, Kubernetes Community Days Helsinki 2026, 16:50–22:05 videosta SBOMbastic: Getting Ready for Upcoming EU Cybersecurity Regulation in Software Supply Chains.

SBOM-generointi: usein kysytyt kysymykset

Mitä SBOM-generointi on?

SBOM-generointi tarkoittaa ohjelmistojen materiaaliluettelon (SBOM) tuottamista: koneluettavaa luetteloa ohjelmiston komponenteista ja riippuvuuksista. Sen voi tehdä lähdekooditiedostoista, buildin aikana tai analysoimalla valmiin artefaktin, kuten konttikuvan. CRACI generoi SBOM:n buildin aikana sen perusteella, mitä buildi todella haki.

Miten CRACI generoi SBOM:n?

GitHub Actions -jobisi ajetaan CRACI-runnereilla. Jokaisen jobin aikana paketit tunnistava välityspalvelin seuraa sen liikennettä pakettilähteisiin ja tallentaa paketit, jotka jobi tuo mukanaan, myös transitiiviset riippuvuudet ja CI-välimuisteista palautetut paketit. Jokainen jobi saa oman SBOM:nsa ja kattavuustilan.

Pitääkö työnkulkujani muuttaa?

Vaihdat runs-on-arvoksi craci. CRACI korvaa runnerin, ei GitHub Actionsia, joten työnkulkusi ja niiden ajot pysyvät GitHubissa.

Mitä pakettiekosysteemejä CRACI tallentaa?

npm-, PyPI-, RubyGems-, Cargo-, Go-, Nix-, OCI-, apt-, apk- ja Git-lähteet sekä Yocton ja OpenEmbeddedin latausesiasetukset. JFrog Artifactoryn npm- ja PyPI-peilejä käsitellään tunnettuina lähteinä. Mavenin ja Javan tuki on tiekartalla.

Missä SBOM-formaateissa voin viedä?

CycloneDX ja SPDX, mukana transitiiviset riippuvuudet ja kunkin komponentin ilmoitettu lisenssi.

Mitä kattavuustila tarkoittaa?

Complete tarkoittaa, että CRACI havaitsi jobista kattavan näytön ja jokainen palautettu välimuisti oli kattava. Complete with connections tarkoittaa, että jobi käytti lisäksi mukautettuja verkkoyhteyksiä, jotka kannattaa tarkistaa. Incomplete tarkoittaa, että jokin tilanne on voinut jättää riippuvuuksia pois. Unavailable tarkoittaa, ettei näyttöä voitu arvioida, ja Not recorded, että jobi on vanhempi kuin kattavuusraportointi. Katso SBOM:n kattavuus.

Löytääkö CRACI haavoittuvuuksia SBOM:sta?

Kyllä. CRACI arvioi valvotut SBOM:t uudelleen aina, kun uusia haavoittuvuuksia julkaistaan, kokoaa löydökset kaikista buildeista ja repositorioista ja tukee VEX:iä. Tietoturvatiimit luokittelevat ja priorisoivat (triage) löydökset ja ohjaavat ne korjauksesta vastaaville tiimeille.

Voiko CRACI generoida SBOM:n ohjelmistolle, jota en itse buildannut?

Ei. CRACI tallentaa buildit, jotka ajetaan sen runnereilla. Ostamillesi ohjelmistoille lisää toimittajan SBOM, niin CRACI valvoo sitä omien buildiesi rinnalla. Kolmannen osapuolen konttikuvalle, jota et buildannut, skanneri on käytännöllinen valinta; katso SBOM-työkalut vertailussa.

Katso oman buildisi SBOM

Varaa demo, aja yksi GitHub Actions -työnkuluistasi CRACI:ssa ja näe, mitä se todella toi mukanaan

Varaa demo