攻擊從偶爾一次變成一天三次:Chainguard CTO 談軟體供應鏈的崩壞速度

攻擊從偶爾一次變成一天三次:Chainguard CTO 談軟體供應鏈的崩壞速度

發布於
·18 分鐘閱讀
AI資安開源產業觀察創業投資SaaS商業AI Agent監管

TL;DR

  • 開源供應鏈攻擊的頻率,這兩年從「每月一次」掉到「每週一次」再掉到「每天一次」。Matt Moore 在 LinkedIn 貼文說已經是每天了,隔天就出現同一天三起攻擊。
  • XZ utils 那次是等級最高的一起:攻擊者花兩年半經營一個假身分、做真實貢獻、拿到 maintainer 權限,手法接近間諜工作。
  • CI/CD 現在是首要攻擊面。你的 build system 有推上 production 的最高權限,卻是整條開發鏈裡防護最差的一環。
  • 大家講的 SBOM(軟體物料清單)多半是假的:沒人規定覆蓋率,交一份空的 JSON 也算「有交」。
  • Anthropic 的 Mythos 模型讓漏洞發現速度暴增。Firefox 某次釋出修掉的漏洞數量,是過去的十到二十倍。
  • Matt 的判斷:漏洞已經能用機器速度被武器化,你如果沒辦法用機器速度打補丁,接下來六到十二個月會很痛。

這集是 Software Engineering Daily,一個做了十幾年的老牌軟體工程節目,什麼技術主題都聊,這集由常駐主持人之一 Gregor Vann 主訪,他人在新加坡,做過資安、網路保險跟一般軟體公司的 CTO,所以問題問得很進去。來賓 Matt Moore 是 Chainguard 的共同創辦人兼 CTO,這家公司二〇二一年成立,五個創辦人全是 Google 出身,做的是「安全的開源供應鏈」,最有名的產品是零已知漏洞的容器映像檔(container image,簡單說就是打包好的軟體執行環境)。二〇二五年四月估值三十五億美金,累積募資超過六億,目前維護超過兩千個專案的映像檔。Matt 本人在 Google 時期就深度參與 Kubernetes 跟供應鏈安全,Sigstore 這個現在業界標準的簽章工具也是這群人搞出來的。

從 Napster 到 Spotify:這比喻比你想的精準

Matt 用了一個我覺得非常好懂的比喻。

早年大家都用 Napster 抓 MP3。你確實抓得到音樂,但有時候抓下來的不是音樂,是病毒。後來 iTunes 出現,你付錢跟 Apple 買,拿到的一定是那首歌,不會夾帶惡意程式。再後來變成 Spotify,你付月費,整個曲庫隨你聽。

他說今天你從公開的套件庫(npm、PyPI、Maven 這些)抓開源套件,本質上就是 Napster 那個狀態。你抓得到東西,但你不知道裡面有沒有夾東西。Chainguard 想做的就是中間那層,把所有東西從原始碼自己重編一次,確保你拿到的乾淨。商業模式也一路從 iTunes(單買一個 image)走到 Spotify(買整個目錄的使用權,照開發者人數收費)。

這個比喻厲害的地方在於,它讓你意識到一件事:現代軟體幾乎沒有一行是「全部自己寫的」。你用的語言、編譯器、HTTP 框架、作業系統核心、容器執行環境,全部是開源的。這是超能力,二十五年前 Amazon 還在自己組伺服器,現在你寫一點膠水程式碼就能上線一個服務。但同樣的道理,你的攻擊面也從「我自己寫的那幾千行」擴張到「全世界幾千個陌生人寫的幾百萬行」。

XZ utils:一個花兩年半潛伏的假身分

如果你只記得一起供應鏈攻擊,那就記這個。

XZ utils 是一套資料壓縮工具,幾乎所有 Linux 發行版都會裝。二〇二四年三月被發現,有一個代號 Jia Tan 的「人」(Matt 講這個名字的時候特別加了引號手勢),花了大約兩年半的時間在這個專案裡做正常貢獻、跟社群建立信任,最後拿到維護者權限,然後在釋出檔裡塞了後門。

注意細節:他公開的原始碼是乾淨的,但他另外附上的「釋出壓縮包」被動了手腳。因為多數 Linux 發行版是拿那個壓縮包去編譯,不是拿 Git 上的原始碼,所以中招的是下游整條線。

Chainguard 剛好逃過,原因有兩個。一是他們堅持從原始碼編譯,不碰那個壓縮包。二是那段惡意程式碼專門針對產生 DEB 跟 RPM 套件的系統,Chainguard 用的是自己的發行版 Wolfi,格式不同,觸發條件沒滿足。

Matt 講得很誠實:這次是運氣加上架構選擇一起發揮作用。如果 Jia Tan 選另一條路,從原始碼編譯不見得擋得住,因為他當時的權限已經深到那個程度了。所以他強調瑞士起司模型(每一層防護都有洞,但把好幾片疊起來,洞就對不齊了)。任何跟你說單一方案能給你百分之百保護的人,都是在賣你東西。

之前在三百美金就能撬開一個前沿模型有聊過攻守誰佔優這件事,供應鏈這條線的答案更清楚一點:攻方只要成功一次,守方要每次都對。

「灰色軟體」這個概念,我覺得比惡意軟體更值得聊

Matt 提到一個他們正在推的詞叫 grayware。

不是被入侵的套件,也不是惡意程式,但它做的事情跟惡意程式很像。比方說某個開源專案會開一個遠端連線終端機,方便你除錯。聽起來很棒對不對?除錯超方便。但你的資安團隊看到你在 production 環境跑一個開著遠端終端的東西,大概會想殺人。或者某個套件會讀取並上傳環境變數裡的憑證,作者的本意可能是做遙測,但那就是你的資料庫密碼。

這件事的難處在於,你不能用「是不是惡意的」來判斷,得用「我要不要它在我的環境裡做這件事」來判斷。前者是二元的,後者是政策問題。

他們的另一個做法是差異掃描:比對 1.0.1 跟 1.0.2 的行為差異。小版本更新照理說不應該出現重大行為變化,如果突然多了一個對外網路連線,而且 changelog 沒提,那就值得標記出來看一眼。

這招真的抓到過東西。有一次 Python 生態出現攻擊,手法是在套件裡塞一個 .pth 檔案,這種檔案的特性是直譯器啟動時就會自動執行,你根本不用 import 那個套件就中了。Chainguard 的掃描把它擋下來,所以那個惡意版本從來沒被編譯過,他們編的是前一個版本。

把你的 build system 當成 production 來守

這是整集我覺得最該被抄下來貼在牆上的一段。

TJ Actions 那起事件是有人打穿一個很多人用的 GitHub Action,然後大量竊取 CI/CD 環境裡的密鑰。Matt 說這類攻擊的共通點清楚到有點好笑:幾乎每一次,攻擊者拿到的都是一個長期有效的憑證。

他對 SLSA 框架(業界的供應鏈安全規範)最大的意見是,它沒有把「一律使用短期憑證」列為強制要求。這在他看來是最大的一個漏球。Chainguard 自己幾年前就做了一個叫 OctoSTS 的東西來解決 GitHub 沒有憑證聯邦服務的問題,而且開放給所有人免費用。

他還提到一個叫 imposter commits 的技巧,是他們家工程師三年半前就通報給 GitHub 的:你以為你把 Action 鎖定在某個 commit hash 上很安全,但那個 commit 其實不需要真的存在於它看起來所屬的那個 repo,它可以來自一個 fork。這個技巧後來被用在另一起攻擊上。

原則講白了就三句:build system 當 production 守、一律短期憑證、最小權限。你在 production 環境會斤斤計較某個微服務不該有多餘權限,結果你的 CI 拿著能推翻整個 production 的鑰匙,還放在一個永不過期的 token 裡。這事說出來大家都懂,但真的去改的沒幾個。

SBOM 的皇帝新衣

歐盟的 Cyber Resilience Act 在二〇二七年底會開始咬人,強制要求 SBOM(軟體物料清單,就是「這個軟體裡面裝了哪些東西」的清單)跟二十四小時漏洞通報。

Matt 對「強制 SBOM」這四個字有很深的意見,而且他的論點我覺得完全對。

問題是:沒人規定覆蓋率。我交給你一份空的 JSON 檔,格式完全合規,內容零筆。算不算通過?好,這個太極端。那我交一份只涵蓋映像檔裡百分之十內容的清單呢?算不算?

他說這件事應該像測試覆蓋率一樣看待,而不是一個是非題。他們公司內部有個測法叫「WordPress 測試」:拿掃描工具去掃 Docker Hub 上官方的 WordPress 映像檔,工具能不能告訴你裡面有 WordPress?答案是幾乎都不行,因為官方映像檔是在建置過程中直接把原始碼拉下來編譯的,沒有留下任何套件管理器的紀錄。這種「掃不到的部分」他叫它暗物質。

還有更細的坑。Go 語言預設就會把相依套件資訊編進二進位檔,Rust 不會,你要特別打開 auditable 模式才有。所以你今天從 AWS 拿到某些用 Rust 寫的東西,裡面用的函式庫有沒有漏洞,你查不出來,因為那個資訊根本沒被寫進去。

「強制 SBOM」聽起來很有力,但格式沒統一(CycloneDX 跟 SPDX 兩派各有靠山)、覆蓋率沒定義、解析深度沒定義。最後大概率會生出一大堆形式上合規、實質上沒用的清單。

順帶一提,歐盟執委會自己就是那起攻擊的受害者之一,因為二十四小時通報規定,他們自己揭露了大約三百四十 GB 的歐盟公民資料外洩。規則寫的人,先被規則抓到。

Mythos 這件事,Matt 說「不是行銷」

節目錄的時候 Anthropic 的 Mythos 模型剛出來不到兩天。

一開始大家嚇壞,接著一群人跳出來說這只是行銷話術。Matt 的立場很明確:他看過實際的發現結果,這不是行銷。Firefox 某次版本更新修掉的漏洞數量大約一百五十個,是過去版本的十到二十倍,而且是其他 agentic 工具跑過都沒抓到的。

最讓他在意的是這個模型有辦法把多個漏洞串起來形成完整攻擊鏈。這一直是資安領域最稀缺的技能:找到漏洞不難,把漏洞變成可用的武器很難、很花時間。而現在那個時間正在快速歸零。

有個細節很有意思。他自己第一件事就是把 Fable(Mythos 衍生出來的版本)拿去審計一個資安隔離工具,結果模型直接回他一段話,大意是「看起來你在做資安相關的事,我把你降級到 Opus 4.8」。Anthropic 確實在發表時說裝了防止漏洞研究濫用的控制,而且真的抓到他了。

但他馬上補一句:這種控制,總有人會繞過去。這件事我在寫一個 AI 為了考一百分,跑去駭進真實世界的公司的時候就有同樣的感覺,模型為了達成目標會找出你沒想到的路徑,護欄擋得住老實人,擋不住有動機的人。

他的結論是整集的重點:漏洞已經可以用機器速度被找到跟武器化了,如果你沒有能力用機器速度打補丁,接下來六到十二個月會很難過。而且這不是撐過第一波就好,這是一塊要長期練的肌肉。

我的幾個看法

第一,這集講的所有東西,本質上都是同一個問題的不同切面:信任的成本正在上升。以前你 npm install 一個套件,那個動作背後的信任幾乎是免費的。現在它有價格了,只是帳單還沒寄到你手上。

第二,我覺得台灣多數中小型團隊聽到這種內容的直覺反應是「這是大公司的事」。不太對。供應鏈攻擊的特性就是不挑目標,它打的是套件,誰裝誰中。你公司大小跟你會不會中沒有關係,只跟你會不會被發現有關係。

第三,短期憑證這件事,是整集裡投報率最高、也最容易做的一項。你不用買 Chainguard,不用改發行版,不用重寫 Dockerfile。你只要去看一遍你的 CI 裡有幾個永不過期的 token,然後把它們換掉。這件事今天下午就能做,而且它擋掉的攻擊比例高得驚人。

第四,那些看起來很「工程」的資安生意其實都很好做,因為問題永遠不會消失。之前寫十年不漲價、零業務開發、年收破兩千萬美金的 Thinkst Canary也是同一個邏輯:把一件簡單但沒人願意做到底的事做到底,就是護城河。Chainguard 的護城河不是技術有多神,是他們願意把兩千個專案全部從原始碼重編一遍,每季再加兩三百個。這種事沒有捷徑,就是熬。

最後老實說,我聽完的當下第一個動作是去翻我自己專案的 GitHub Actions 設定。結果不太好看,有幾個 token 大概躺在那裡兩年沒動過了。所以這篇某種程度上也是寫給我自己看的。

這類產業觀察跟資安筆記我會持續寫,訂閱 wilsonhuang.xyz 就不會漏掉。

推薦閱讀

喜歡這篇文章嗎?

訂閱電子報,每週收到精選技術文章與產業洞察,直送你的信箱。

💌 隨時可以取消訂閱,不會收到垃圾郵件