新發布SkillSec:把 Skills 安全從惡意檢測,升維到能力審計SkillSec瞭解更多 →
安全研究

npm 惡意包的四種藏匿術:從代碼混淆到延遲觸發

安勢研究院·2026.08.11·2 分鐘閲讀
npm 惡意包的四種藏匿技術與對應防禦層
npm 惡意包的四種藏匿技術與對應防禦層

攻擊者要解決的問題

在公共倉庫投放一個惡意包,攻擊者面對的核心矛盾是:包必須看起來正常到能被安裝,同時又要在某個時刻做不正常的事。

早期的投毒相當粗糙——安裝腳本里直接一行 curl 把 ~/.ssh 打包外傳,肉眼可見。隨着自動化掃描的普及,這類樣本活不過幾小時。於是手法開始進化,目標只有一個:推遲被發現的時刻

下面四種是當前最常見的技術路線。它們經常組合使用。

一、代碼混淆:讓人和機器都讀不懂

最直接的思路是讓惡意邏輯不可讀。常見形態包括多層 base64 編碼、字符串數組打散重組、eval 與動態屬性訪問、以及把關鍵字符串拆成字符碼數組在運行時拼接。

一個典型樣本可能在源碼裏完全看不到 httpexec 這樣的關鍵詞——它們是運行時才被組裝出來的。

為什麼靜態查殺會漏:基於特徵字符串或關鍵詞匹配的掃描,面對拼接和編碼幾乎無能為力。而混淆本身又不能直接判定為惡意——很多合法的壓縮產物也是混淆的。

能識別的信號:混淆度與包的聲明用途不匹配(一個工具類小包不需要三層編碼)、存在 eval 加動態拼接的組合、以及構建產物與源碼倉庫對不上。

二、延遲觸發:安裝時什麼都不做

第二種思路是把時間拉長。惡意代碼在安裝時完全靜默,等待若干天、等待特定日期、或者等待某個使用次數閾值之後才激活。

這個手法針對的正是自動化審查的窗口期:多數掃描發生在包發佈後的短時間內,而人工審查往往只看安裝那一刻的行為。等到激活時,包已經出現在數千個項目的 lockfile 裏。

能識別的信號:代碼中存在與功能無關的時間判斷、首次運行時寫入本地狀態文件用於計數、以及網絡請求被包裹在延遲執行的邏輯裏。

三、環境檢測:發現被觀察就裝死

更進一步,惡意包會主動判斷「我現在是不是在被分析」。檢測項包括:是否運行在 CI 環境(檢查環境變量)、是否在容器或虛擬機中、是否存在調試器、主機名或用户名是否符合沙箱特徵、以及網絡出口是否被代理。

一旦判定為分析環境,包就表現得完全正常。這直接擊穿了動態沙箱分析——沙箱看到的是無害行為,真實開發者機器上看到的是另一回事。

能識別的信號:讀取大量與功能無關的環境信息、存在針對已知沙箱指紋的比對邏輯、以及在不同環境下行為不一致。

四、分階段加載:首包乾淨

最隱蔽的一類:發佈的包本身完全無害,惡意載荷在運行時從遠程拉取。

第一個版本可能真的是個可用的工具包,積累下載量和信任。某個後續小版本加入一行「從配置服務器獲取更新」,惡意邏輯從此不在包裏,而在服務器上——攻擊者可以隨時開關,對特定目標投放,且不留下可供分析的樣本。

為什麼這是最難的:包的靜態內容永遠是乾淨的。你審計一百遍源碼也發現不了問題,因為問題不在源碼裏。

能識別的信號:包在運行時發起未聲明的網絡請求、從外部獲取並執行代碼、以及請求地址與包的功能毫無關係。

三層防禦

單一手段對付不了這四類,需要組合:

第一層:引入時的靜態與元數據審查。 除了代碼掃描,更有效的往往是元數據信號——包的年齡、維護者歷史、下載量曲線的異常跳變、與流行包的名稱相似度、以及維護者賬號最近是否變更。很多投毒包在代碼分析之前,就已經在元數據上露出破綻。

第二層:行為分析。 在受控環境中實際安裝並運行,觀察文件訪問、進程創建、網絡連接。針對環境檢測手法,需要讓分析環境儘可能貼近真實開發機——這本身是一場持續的對抗。

第三層:出口流量監控。 這是兜底層,也是對付分階段加載最有效的一層。無論惡意代碼藏得多深,它最終需要把數據送出去。開發環境與構建環境的出口白名單,能把「已經被感染」變成「感染了但沒造成損失」。

對企業的實際建議

優先建內部製品倉庫鏡像。 所有依賴經由內部鏡像獲取,配合白名單與准入審查。這一條的收益是結構性的——它同時緩解了投毒、依賴混淆和幻覺包三類風險。

對新引入依賴設置觀察期。 一個剛發佈不久、下載量還在爬升的包,進入生產依賴前值得多等一段時間。時間是最便宜的過濾器。

盯住 lockfile 的變化。 依賴更新應當是顯式決策,而不是構建時的意外。lockfile 的每次變動都應當出現在代碼評審裏。

保留可追溯性。 當某個包被曝出問題時,你需要在幾分鐘內回答「我們哪些項目用了它、哪些版本、什麼時候引入的」。這正是完整依賴台賬與持續監控的價值所在。

投毒不會停止,因為公共倉庫的開放性正是生態繁榮的前提。可以改變的是發現的速度和影響的範圍。

---

延伸閲讀企業開源准入制度怎麼建 · 開源 101 中的惡意包與投毒條目 · CSSA 每日安全情報

npm惡意包供應鏈攻擊投毒靜態檢測行為分析依賴安全
想看看這些能力在你的代碼庫上如何落地?預約演示

相關閲讀

技術解讀

SBOM 不止是合規清單:從「我用了什麼」到「我能承受什麼」

很多團隊把 SBOM 當成一份交差用的清單。但真正有價值的 SBOM,是能驅動決策的:哪些漏洞可被利用、哪條依賴該先修、哪個許可證會帶來風險。