三天一起
StepSecurity 在週六公布了一整年惡意套件攻擊的統計:共 56 起,前六個月 6 起,二月以來的六個半月裡 50 起,三月起大約每三天一起。接著報告點名了它們持續奏效的原因:開發機器與 CI runner 上的機密、未固定版本的 latest、毫無限制的對外連線。這三件事沒有一件是套件的性質。三者描述的都是執行安裝的那台機器,而如今安裝套件最多的那台機器上,坐著一個編碼代理。
惡意套件在安裝時就引爆。沒有需要抵達的脆弱程式路徑,沒有需要撰寫的漏洞利用,也沒有可 修補的空窗。在三天一起的頻率下,它裝在哪個套件裡,已經不再是值得追問的問題。
週六,StepSecurity 發表了 一份為期十二個月的開源供應鏈攻擊統計。 五十六起。「在 2025 年 8 月到 2026 年 1 月的六個月裡,我們記錄到 6 起事件。在 2026 年 2 月 以來的六個半月裡,我們記錄到 50 起。」三月起,速度維持在每月約九起,也就是「大約每三天 一起」。
StepSecurity 賣的是一套帶過濾的登錄檔,請帶著這個前提去讀這份報告。統計本身仍然站得住腳。 這是目前公開資料中對惡意套件最審慎的一份清點,而它背後的定義是刻意收窄的。
這個數字在數什麼
報告把漏洞排除在外。不計 CVE,也不計事後才發現真的有問題的 unsafe 區塊。它數的是有人
蓄意下毒的套件。
這正是這個數字可用的原因。漏洞需要第二個事件:得有人找到你的執行個體、抵達受影響的程式 路徑,並從中取走些什麼。你可以跑一整年的脆弱版本而什麼事都沒發生。惡意套件把這些全部跳過。 用報告的話說,它「在開發機器或 CI runner 安裝它的那一刻就開始執行」。安裝本身就是入侵成功。 你永遠不會有揭露到修補之間的空窗,因為沒有人揭露過什麼,也沒有人發過修補。你拿到的只有一個 版本號,然後是一場釐清誰抓過它的忙亂。
2026 年 3 月有 13 起。4 月 9 起、5 月 9 起、6 月 10 起、7 月 6 起。在三月的五天之內,一個
被追蹤為 Team PCP 的行動汙染了 Trivy GitHub Action 全部 77 個標籤中的 76 個,以及少數其他
建置期元件,
從 2,186 個組織手中取走 78,330 份機密,
其中 92 家是上市公司。每週下載量超過一億的 axios,發布了兩個帶有跨平台遠端存取木馬的惡意
版本。這一年裡出現了六隻蠕蟲:Shai-Hulud 兩次、CanisterWorm、Mini Shai-Hulud、Miasma,以及
本月的 ChainDrop。npm、PyPI、RubyGems、Composer、crates.io、GitHub Actions。「每一個主要的
套件生態系與 CI/CD 平台都中過招。」
這份清單裡有兩項在這裡格外重要。報告指出,「一個由 AI 驅動的機器人」hackerbot-claw 盯上了
Microsoft、Datadog 與 CNCF 的 GitHub Actions,而且「Miasma 蠕蟲專門鎖定 AI 編碼代理」。
三個條件,沒有一個是套件
接著報告做了件有用的事。在一個追問攻擊為何持續奏效的標題底下,它給出三個答案:「CI/CD 流水線與開發機器上的機密、未固定版本的 latest、毫無限制的對外連線」。
這份清單裡沒有一項在描述套件。沒有混淆、沒有拼字相似度、也沒有安裝掛鉤的花招。三者描述的 都是執行安裝的那台機器:它握著什麼、它怎麼挑版本、它獲准連到哪裡。只要改動其中任何一項, 這五十六起裡的大多數就不再划算。
未固定的 latest
解析鏈上的某一環說了「要最新的」。一段浮動範圍、一個間接相依、一份重建的 lockfile、 一個代你加上函式庫的代理。攻擊者只需要解析器偏好一個幾分鐘前才發布的版本。
機器上的機密
~/.ssh、~/.aws、~/.kube、~/.npmrc、環境變數裡的 GH_TOKEN、
~/.docker/config.json 裡的登錄檔憑證。這些沒有一樣屬於這次建置,而建置剛剛啟動的
東西全都讀得到。
開放的對外連線
偷到的東西得送出去,第二階段的執行檔得送進來。兩者都只是從一台允許連往任何地方的機器 發出的、再普通不過的對外連線。
現在裝套件裝得最多的,是誰的機器
大家一直倚靠的防線是注意力。你讀 diff。你注意到一個快取函式庫拉進了一個相依,名字跟某個 日期格式化套件只差一個字母。
有兩件事已經超車了。首先是頻率:沒有人每三天就把間接相依重看一遍。其次是誰在裝。編碼代理 因為你要它做點東西而加進一個函式庫、解析出相依樹、跑完安裝,然後回報測試通過。你讀的是它 產生的 diff,那的確是值得你花時間的部分。但 tarball 從來不會出現在 diff 裡。StepSecurity 的 清單上,已經有一隻蠕蟲正是衝著這種工作方式來的。
代理留著。把控制點搬到它的速度不再重要的地方。
三個條件,三道控制,全都在 Mac 這一側
Bromure Agentic Coding 讓代理跑在 Apple Virtualization 框架上的一台用完即丟的 Ubuntu VM 裡, 只掛載你挑選的資料夾,並以主機端的代理伺服器作為唯一的對外出口。這樣的擺放,把 StepSecurity 的三個條件各自擋在一道建置碰不到的控制之前。
未固定的 latest 變成一只時鐘。 每一次套件抓取都先經過主機端代理:npm、PyPI、Cargo、
RubyGems、Maven、NuGet、Go 模組、Packagist。發布時間閘門預設開啟,門檻是兩天。浮動參照會
解析到早於截止時間的最新版本,於是 latest 照常運作,卻不再意味著「在你讀這段字的時候才
發布的版本」。指向太新版本的固定參照會回傳一個帶著 Bromure 錯誤訊息的 451。在此之上,你還
可以依自選的嚴重度門檻啟用 OSV 查詢、讓套件改走 socket.dev 的信譽資料庫或 Delpi 的過濾式
登錄檔,並在傳輸過程中把 preinstall、install、postinstall 與 prepare 從 npm tarball
裡剝掉。Bromure 會改寫 tarball,並同步更新登錄檔中繼資料的雜湊值,讓 npm 自己的驗證照樣通過。
VM 內的 .npmrc 與 pip.conf 可以把上述任何一項設定收得更緊,但沒有一項放得鬆。
機器上的機密都是替身。 真正的憑證從不進入 VM。代理伺服器在線路上把佔位符換成真正的
權杖;客體裡的 kubeconfig 是合成的,用的是一次性的客戶端憑證;AWS 拿到的是一個
credential_process 輔助程式,遞給 SDK 一組四十字元的假值,同時由主機用真正的金鑰重新簽出
SigV4,因此任何繞過代理的東西,只會從 Amazon 收到一個 InvalidSignatureException。讀取
~/.aws/credentials 的安裝期程式碼會找到一個檔案、讀完它,然後外送一份誘餌。每一份憑證還
帶有一項在主機代理上強制執行的寫入政策(關閉、封鎖破壞性操作,或唯讀),外加使用時需要
核准,能把任何一次使用變成一個同意對話框,授權範圍可選五分鐘、一小時,或本次工作階段的
其餘時間。
開放的對外連線,得聽你寫的規則。 在防護欄底下,對外連線表是一份按設定檔劃分的防火牆:
一條規則一列,每列有動作、通訊協定(tcp、udp、web 或 any)、主機或 CIDR、連接埠,
web 還可指定 HTTP 方法清單。規則由上往下比對,第一條命中者勝出,而未命中的流量是一個
你設為允許或拒絕的開關。同一套規則由兩層一起執行:虛擬交換器依目的地 IP,以及依它從客體
自己的 DNS 回應中學到的主機名稱;代理伺服器則依 TLS SNI。透明攔截預設開啟,所以就算建置
腳本把 HTTPS_PROXY 清掉,哪些連線出得去也完全不受影響。
上週的 crates.io 攻擊,正好示範了這條規則攔住了什麼。在 StepSecurity 的分析裡,投放程式的 建置腳本 解出一個 base64 編碼的網址,從一個裸 IP 的 9089 連接埠抓取對應平台的執行檔, 並關閉憑證驗證,接著把子行程分離,好讓 Cargo 不會等它。只要未命中的流量設為拒絕,這次抓取 就永遠完成不了,而建置腳本的結束代碼也不再是個值得追問的問題。
八十六分鐘
回到同一起攻擊,就能看出時鐘為什麼勝過判斷力。arrayref、internment 與 append-only-vec
被下毒的版本,在 crates.io 撤下它們之前分別活了 86、90 與 107 分鐘。為了把解析器導向這些
版本,攻擊者把乾淨的版本從 0.3.9 一路 yank 到 0.3.5,整串動作只花了十六秒,只留下一個
沒人撤回的發行版。StepSecurity 對這起事件最銳利的一句話是:「攻擊者把登錄檔自身的安全機制
變成了投遞管道。」而 arrayref 本身並沒有帶任何惡意程式碼。酬載是搭著建置期對 proc-macro2
的拼字仿冒進來的。
兩天的發布時間閘門完全不需要認出上面任何一件事。一個八十六分鐘大的版本比門檻還新,而等它 夠老到可以被安裝時,crates.io 早就把它刪了。攻擊者打造的那扇窗,比閘門原本就會忽略的那扇 還要短。
第五十七起
報告以一句值得記住的話作結:「12 個月 56 起攻擊。第 57 起攻擊已經在製作中了。」
你不會知道它裝在哪個套件裡,你也不會去讀它。你的代理同樣不會。五個月維持三天一起的節奏, 早已遠遠超出任何人能夠審查的頻率,把它說成粗心大意,誰都得不到好處。但它落在什麼上面, 是你可以決定的:它需要的那個版本,你的解析器會不會收;它來找的那些機密,是不是真的;它想 連的那個位址,你的機器會不會替它送出去。三個設定,全都在邊界的你這一側。
資料來源:StepSecurity,「The State of Open Source Supply Chain Attacks」(2026 年 8 月 22 日) · StepSecurity,「Rust Supply-Chain Attack: arrayref, internment, and append-only-vec Poisoned by the proc-macro1 Build-Time Dropper」(2026 年 8 月 20 日) · StepSecurity,「Team PCP Stole 78,330 Secrets From 2,186 Organizations」(2026 年 8 月 13 日)