資安
您的應用程式風險低,建置管線卻不是。
如果您的軟體只供內部使用、用途有限或平凡無奇,把資安排在清單後段是合理的。但供應鏈攻擊不會管您的應用程式做什麼,它們鎖定的是每個應用程式共用的管線與套件。
更新日期
這個想法有道理,但只到某個程度
我們常聽到這種說法,而且通常出於合理的考量。應用程式是內部儀表板、資料管線,或只有少數使用者的小型服務,裡面沒有攻擊者想要的東西。資安預算會優先投入面向客戶的產品。
這個邏輯對應用程式本身成立,對應用程式的建置方式卻不成立。無論出貨的是什麼,每個團隊都有一條帶著憑證的 CI 管線,以及一棵不是自己撰寫的相依套件樹。正因為它們是共用的,才值得攻擊;一旦在那裡遭到入侵,影響就會擴及這些憑證能觸及的一切:您的套件登錄庫、雲端帳戶,以及其他儲存庫。
不在乎應用程式用途的攻擊
以下事件沒有一起是針對特定類型的應用程式。每一起都是透過團隊用來建置軟體的工具或套件找上門。
tj-actions/changed-files,2025 年
一個廣受使用、用來偵測變更檔案的 GitHub Action 遭到入侵。根據 CISA,惡意版本於 2025 年 3 月 12 日至 3 月 15 日間上線,這次入侵外洩了包括存取金鑰、GitHub 個人存取權杖、npm 權杖與 RSA 私密金鑰在內的機密。Wiz 指出,這段程式碼會傾印 CI 執行器的記憶體,因此在公開儲存庫中,機密最後出現在工作流程日誌裡。以版本標籤參照此 action 的工作流程,無論儲存庫內容為何,都執行了惡意程式碼。
Shai-Hulud npm 蠕蟲,2025 年
2025 年 9 月,CISA 針對一隻已入侵超過 500 個 npm 套件的自我複製蠕蟲發出警告。它竊取 GitHub 個人存取權杖,以及 AWS、Google Cloud 與 Azure 的雲端 API 金鑰。Palo Alto Networks Unit 42 說明了它如何利用竊得的 npm 權杖,發布受害者其他套件的受感染版本,以及後續一波攻擊如何在 pre-install 階段執行,進一步擴大其觸及 CI/CD 管線的範圍。
Shai-Hulud and other supply chain attacks
Shai-Hulud npm 蠕蟲如何在安裝時竊取憑證,再利用這些憑證發布更多遭入侵的套件,以及在它之前的幾起攻擊。
Petteri Pulkkinen和Erika Marttinen 於 Kubernetes Community Days Helsinki 2026,SBOMbastic: Getting Ready for Upcoming EU Cybersecurity Regulation in Software Supply Chains 的 4:30 至 7:57。
Codecov Bash Uploader,2021 年
攻擊者利用 Codecov Docker 映像檔建置流程中的一個錯誤取得憑證,並竄改了許多團隊在 CI 中執行的 Bash Uploader 腳本。從 2021 年 1 月 31 日到 4 月 1 日,遭竄改的腳本可將環境變數(包括 CI 環境中可用的憑證、權杖與金鑰)傳送給第三方。直到一位客戶發現腳本的校驗碼不相符,才被揭露。
xz utils,2024 年
惡意程式碼被嵌入 XZ Utils 5.6.0 與 5.6.1 版,這是一個可能存在於 Linux 發行版中的資料壓縮函式庫。CISA 建議降級至未遭入侵的版本(例如 5.4.6),並追查惡意活動。壓縮函式庫幾乎是最不起眼的相依套件,卻仍然成為攻擊目標。
event-stream,2018 年
一名假扮熱心維護者的人接手了熱門 npm 套件 event-stream,並在 3.3.6 版中加入惡意相依套件 flatmap-stream。npm 團隊指出,惡意酬載鎖定的只有一個特定應用程式:Copay 比特幣錢包。但其他所有安裝了 event-stream 的人,也一併拿到了惡意程式碼。
這些事件的共同點
- 它們發生在建置或安裝階段。惡意程式碼是在開發者的電腦與 CI 執行器上執行,而不是在正式環境的應用程式中。
- 它們鎖定的是憑證。管線中的權杖與金鑰才是目標,因為它們能打開所建置專案以外的大門。
- 它們透過受信任的名稱進入。熟悉的 action、熟悉的套件、熟悉的腳本。沒有人是自己選擇安裝惡意軟體的。
- 事後的第一個問題都一樣。我們有沒有任何建置拉進了有問題的版本?它能觸及哪些東西?沒有每次建置使用內容紀錄的團隊,只能事後重建。
最低限度的防護是什麼樣子
涵蓋基本防護不需要資安團隊。GitHub 與 CISA 的建議大多可以濃縮成一份短清單:
- 將第三方 GitHub Actions 固定到完整的 commit SHA 而非標籤,這樣即使標籤被移動,執行的內容也不會改變。
- 提交 lockfile,並將相依套件版本固定在已知安全的版本。
- 只給 CI 權杖足以運作的最小權限,並在資安事件波及您使用的工具時輪換權杖。
- 開發者帳戶與發布帳戶一律要求使用抗網路釣魚的多因素驗證。
- 保留每次建置安裝內容的紀錄,讓您能以資料而不是記憶回答「我們是否受到影響?」。
前四項都是設定工作。第五項則是多數小型團隊會略過的,因為它需要工具。
CRACI 如何以極少的投入補上缺口
CRACI 負責保存紀錄並加上一道網路邊界,不需要您修改應用程式或工作流程。
- 每個作業只改一行。將
runs-on改為craci。您的 GitHub Actions 工作流程維持不變,執行紀錄仍會顯示在 GitHub 中。 - 每次建置都產生 SBOM。CRACI 會記錄每個作業實際拉進來的套件,包括從快取還原的套件,並以 CycloneDX 或 SPDX 格式匯出結果。
- 每個作業都有網路追蹤紀錄。當資安事件公布時,您可以查出哪些建置拉進了受影響的套件,以及每個作業連線到了哪裡。
- 可切換為預設拒絕的對外連線政策。只允許作業需要的套件來源,遭入侵的步驟就更難把找到的東西傳送出去。政策採失效即封鎖(fail closed),違規時會觸發警示。
- 持續重新評估。受監控的 SBOM 會在新漏洞公布時重新檢查,舊建置不會只因為沒人查看就一直維持「乾淨」。
也要清楚說明限制:對外連線政策無法阻止 tj-actions 入侵事件把機密印到公開日誌中,也沒有任何工具能讓外洩的權杖復原。版本固定與權杖輪換依然重要。CRACI 改變的是,您能多快回答自己是否曾經暴露,以及遭入侵的步驟能觸及多遠。
要讓第一個工作流程開始執行,只需安裝 GitHub App,並將一行改為 runs-on: craci。
費用
CRACI 只針對建置分鐘數收費:每 vCPU 分鐘 $0.002(預設 2 vCPU 執行器為 $0.004),按秒計量,沒有月費,也不按 SBOM 收費。完整條款請參閱價格方案。符合資格的新創公司可申請新創計畫,獲得至少 10 萬分鐘的免費建置分鐘數與實際協助的導入服務。
如果您在歐盟銷售軟體,也值得確認 Cyber Resilience Act(CRA)是否適用於您。我們的CRA 指南說明了適用範圍與期限。