2026 年每日通報的 CVE 數量比前一年多 131%。

在建置過程中記錄的 SBOM 產生

CRACI 是一款 SBOM 產生工具,記錄每次 GitHub Actions 建置實際取用的內容,而不是事後掃描檔案。每份 SBOM 都會標示自身的完整程度。

重點摘要:在 CRACI 執行器上執行您的 GitHub Actions 作業,每個作業都會產生一份 SBOM,列出它取用的套件,包括遞移相依套件與從 CI 快取還原的套件,並可匯出為 CycloneDX 或 SPDX。每份 SBOM 都附有完整性狀態,並在發布後持續監控新漏洞。Syft 與 Trivy 等掃描工具從檔案重建 SBOM;CRACI 則從建置中記錄。為什麼建置時 SBOM 不一樣。

在建置過程中記錄,而非事後掃描

多數 SBOM 產生工具會在建置完成後讀取檔案,再推測並重建當初納入了哪些內容。CRACI 則在自己的 CI 執行器內產生 SBOM。具備套件感知能力的代理伺服器會觀察每個作業連往套件來源的流量,因此 SBOM 列出的是作業實際取用的內容(包含遞移相依套件),而不是 manifest 宣稱所需的內容。不需要鎖定檔(lockfile)、不需要已安裝的相依套件樹,也不需要額外的掃描步驟,就能留下這份記錄。

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

涵蓋每一層遞移相依套件

建置所取用的內容,大多不是直接相依套件,而是相依套件的相依套件,位於好幾層之下;其中有些甚至從未出現在鎖定檔中:建置腳本下載的預先編譯二進位檔、從快取還原的套件、作業系統套件。CRACI 會記錄作業在每一層取用的每個套件,因此能比對整個相依套件樹的漏洞。在與其他 SBOM 工具的並列比較中,這份更完整的記錄找出了其他工具未回報的漏洞。

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 快取還原的套件仍會留在 SBOM 中

快取往往是建置時記錄中斷的地方:從快取還原的套件不會連線到任何套件庫(registry),因此單靠代理伺服器會漏掉它。CRACI 會讓相依套件的佐證資料隨快取一起傳遞,因此從 CI 快取還原的套件,會留在還原它的那個作業的 SBOM 中。

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

每個作業都有完整性狀態

漏洞追蹤只能比對 SBOM 中列出的元件。SBOM 遺漏的套件,就是一個沒有人會收到警示的漏洞。因此,CRACI 不會把每份 SBOM 都呈現為完整,而是為每個作業與每個快取標示完整性:Complete、Complete with connections、Incomplete、Unavailable 或 Not recorded。您可以清楚知道哪些 SBOM 可以信賴,哪些需要再檢查一次。

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.

支援您出貨所用的生態系與格式

CRACI 會記錄來自 npm、PyPI、RubyGems、Cargo、Go、Nix、OCI、apt、apk 與 Git 來源的套件,以及 Yocto 與 OpenEmbedded 的下載預設組態,並將 JFrog Artifactory 的 npm 與 PyPI 鏡像視為已知來源。Maven 與 Java 支援已列入產品藍圖。SBOM 可匯出為 CycloneDX 與 SPDX 格式,並包含遞移相依套件,可直接與客戶、合作夥伴及稽核人員分享。

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

每個元件都附有宣告的授權

每個記錄的套件都會將其宣告的授權帶入 SBOM。您可以在出貨前看到哪些相依套件採用商業或其他限制性授權,並在 copyleft 授權進入產品之前就將其找出。

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

透過 API 取得來源證明

SBOM 只是 CRACI 為每個作業記錄的內容之一。公開的 REST API 會回傳 SBOM、網路追蹤記錄與來源證明(provenance),全部記錄自同一次建置。

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

發布後持續監控

SBOM 是企業了解其出貨軟體內容的方式,客戶與主管機關也越來越常要求提供:Cyber Resilience Act(CRA)要求製造商為在歐盟銷售的產品製作 SBOM。每當有新漏洞公開,CRACI 都會重新評估受監控的 SBOM,彙整各建置與儲存庫的檢測結果,並支援 VEX。您向自家廠商收集的 SBOM,也會與您的建置一併監控。

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

記錄的 SBOM 與掃描的 SBOM 對照

對於非您自行建置的軟體,掃描器是合適的工具。對於您自己的版本發布,以下是記錄建置所帶來的差異。掃描器讀取鎖定檔或建置輸出,推算當初納入了哪些內容。CRACI 則看見流入建置的流量,因此安裝掛鉤(install hook)、建置腳本與基礎映像檔所帶入的隱藏相依套件,也會出現在 SBOM 中。

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.
功能 CRACI 掃描型 SBOM 工具
元件清單的產生方式 依據建置本身的套件流量記錄 事後從檔案重建
是否需要鎖定檔或已安裝的相依套件 不需要 通常需要其中之一
從 CI 快取還原的套件 佐證資料隨快取一起傳遞 僅限掃描時檔案仍存在的情況
每個作業的完整性狀態 五種狀態,依作業與快取分別標示
從建置產物到建置的簽章連結 不提供簽章的來源證明 需另外加入簽章步驟
非您自行建置的軟體 改為加入廠商提供的 SBOM
CI 系統 目前支援 GitHub Actions,其他 CI 系統已列入產品藍圖 可在任何 CI 中執行
  • 支援
  • 部分支援
  • 不支援
  • 已列入產品藍圖

想比較特定工具嗎?請參閱SBOM 工具比較,涵蓋 Syft、Trivy、cdxgen、Microsoft SBOM Tool、Dependency-Track 等。若想了解更全面的樣貌,請參閱軟體供應鏈安全工具比較。要在多個團隊推行 SBOM 嗎?請參閱跨工程團隊的 SBOM 產生。

SBOM basics: SPDX, CycloneDX and OpenVEX

SBOM 記錄了哪些內容、SPDX 與 CycloneDX 格式在實務上有何不同,以及 OpenVEX 如何補充說明某個漏洞是否真的影響產品。

Petteri Pulkkinen和Erika Marttinen 於 Kubernetes Community Days Helsinki 2026,SBOMbastic: Getting Ready for Upcoming EU Cybersecurity Regulation in Software Supply Chains 的 16:50 至 22:05。

SBOM 產生:常見問題

什麼是 SBOM 產生?

SBOM 產生是指製作軟體物料清單(SBOM):一份機器可讀、列出某個軟體所含元件與相依套件的清單。它可以從原始碼檔案產生、在建置過程中產生,或透過分析容器映像檔等完成的建置產物來產生。CRACI 在建置過程中,依據建置實際取用的內容產生 SBOM。

CRACI 如何產生 SBOM?

您的 GitHub Actions 作業在 CRACI 執行器上執行。每個作業執行時,具備套件感知能力的代理伺服器會觀察它連往套件來源的流量,並記錄它取用的套件,包括遞移相依套件與從 CI 快取還原的套件。每個作業都會產生各自的 SBOM,並附有完整性狀態。

我需要修改工作流程嗎?

只要將 runs-on 改為 craci。CRACI 取代的是執行器,而不是 GitHub Actions,因此您的工作流程與其執行記錄都會留在 GitHub。

CRACI 會記錄哪些套件生態系?

npm、PyPI、RubyGems、Cargo、Go、Nix、OCI、apt、apk 與 Git 來源,以及 Yocto 與 OpenEmbedded 的下載預設組態。JFrog Artifactory 的 npm 與 PyPI 鏡像會被視為已知來源。Maven 與 Java 支援已列入產品藍圖。

可以匯出哪些 SBOM 格式?

CycloneDX 與 SPDX,並包含遞移相依套件以及每個元件宣告的授權。

完整性狀態代表什麼意思?

Complete 表示 CRACI 觀察到完整的作業佐證資料,且每個還原的快取都是完整的。Complete with connections 表示該作業還使用了值得檢視的自訂網路連線。Incomplete 表示有某種情況可能導致相依套件被遺漏。Unavailable 表示無法評估佐證資料,Not recorded 則表示該作業早於完整性回報功能推出之前執行。請參閱SBOM 完整性。

CRACI 會找出 SBOM 中的漏洞嗎?

會。每當有新漏洞公開,CRACI 都會重新評估受監控的 SBOM,彙整各建置與儲存庫的檢測結果,並支援 VEX。資安團隊研判檢測結果,並轉交給負責修正的團隊。

CRACI 能為非我自行建置的軟體產生 SBOM 嗎?

不能。CRACI 記錄的是在其執行器上執行的建置。對於您採購的軟體,請加入廠商提供的 SBOM,CRACI 會將其與您自己的建置一併監控。對於非您自行建置的第三方映像檔,掃描器是務實的選擇;請參閱SBOM 工具比較。

看看您自己建置的 SBOM

預約示範,在 CRACI 上執行您的一個 GitHub Actions 工作流程,看看它實際取用了哪些內容

預約示範