一家安全研究公司周一報告稱,已發現42個第三方GitHub代碼庫遭到入侵,攻擊者在其中部署了體積足夠大的負載文件,從而「逃避了通常用於發現此類入侵的GitHub搜索和API路徑」。
JFrog安全研究團隊的報告指出,受害代碼庫中包含針對AI編程助手和集成開發環境(IDE)的執行鉤子,以及體積高達13.7MB的多態封裝器
,這些封裝器「最終都解碼為同一個隱藏的CI發布者負載。該攻擊活動中攻擊者所控制的代碼庫同時還充當著活躍的加密數據匯集點,接收快照信封數據
,此次攻擊還採用了一種新的偽裝手段:一個不包含任何自身負載的已編譯原生插件,它會在運行時解密一個名為.napi_cache的文件,從而揭示出真正的負載內容。」
JFrog表示,調查還發現了帳戶劫持、偽造的提交時間線、短期存在的發布分支以及泄露的npm憑證。同一被劫持所有者集群中的Shellpanel相關痕跡,將此次GitHub受害基礎設施與此前報告過的針對面向網際網路的cPanel系統的GitHub Actions攻擊活動聯繫在了一起。
「10月21日期間,我們的掃描系統發出警報,在npm生態系統中發現了shai-hulud相關的惡意包,」JFrog寫道。「SafeDep在10月22日的分析首次記錄了此次活動中涉及npm包的部分,並解碼了[email protected]這一樣本。SafeDep將該負載描述為Miasma家族成員,但同時明確表示對其具體來源存在不確定性。」
SafeDep最初認為,其發現的這一名為testmetest的攻擊活動中所涉及的包,僅僅是威脅行為者的一次測試,但本周進一步發現了現有代碼庫已遭到惡意內容入侵的情況。
JFrog的報告還重點關注了npm攻擊鏈所帶來的影響。
「npm攻擊鏈提供了連接到更廣泛攻擊活動的線索。惡意的testmetest版本利用binding.gyp命令擴展功能,在安裝過程中執行index.js,即便這些包並未聲明傳統意義上的安裝腳本,」該報告寫道。「該加載程序對字符代碼數組應用了逐版本變化的凱撒密碼變換
,解密出一個AES-128-GCM
階段的內容,並查找或下載Bun 1.2.18。根據具體版本的不同,解密後的負載會被管道傳輸至bun run命令執行,或寫入一個臨時的.b-*目錄中,並在執行完成後被刪除。完整的npm負載會收集憑證資訊,污染代碼庫和CI配置,並通過包註冊表進行傳播。」
JFrog表示,那些由攻擊者控制的代碼庫,充當了與之匹配的npm包的掩護項目來源。
「惡意版本發布傳播了這一npm蠕蟲,該蠕蟲會竊取GitHub和npm憑證,而這些憑證可能被用於訪問第三方代碼庫。在被劫持的代碼庫中,此次攻擊活動留下了測試占位文件或已激活的負載,」研究人員寫道。「對已激活的ci.js文件進行解碼後發現,其中的發布程序被設計用於通過GitHub Actions運行,並利用npm令牌或可信發布機制
生成更多惡意的testmetest版本發布,從而將包的分發反饋回代碼庫入侵環節,形成循環。」
JFrog的報告中提出了多種用於檢測和緩解此類攻擊的防禦策略建議,其中包括建議首席資訊安全官「應將完整蠕蟲版本的安裝視為主機已被入侵」。報告還建議用戶撤銷並輪換所有GitHub、GitLab、npm、PyPI、RubyGems、雲服務、SSH、Vault、Kubernetes以及AI服務提供商相關的憑證,同時對「受影響身份可訪問的所有代碼庫進行審計,檢查是否存在.github/init.js、.claude/settings.json、.gemini/settings.json、.cursor/mcp.json、.cursor/rules/setup.mdc、.vscode/tasks.json文件,以及異常的composer.json或Makefile執行鉤子,和帶有skip-checks:true標記的提交記錄。」
JFrog還建議企業直接枚舉代碼庫文件樹結構,並指出由於前述封裝器文件體積問題,IT部門不應依賴GitHub代碼搜索功能或內容API進行檢測。
JFrog建議,「刪除未經授權的chore/ci-*和deps/upd-*分支,禁用惡意工作流,移除名為scan-output的偽造CodeQL相關文件。在網路控制層面封鎖hxxp[:]//43[.]228[.]157[.]68:80以及相關惡意基礎設施」,並「在GitHub Actions日誌和運行器中排查/tmp/.svc、ipscan、CVE-2026-41940、針對特定架構的/api/dl/
鑑於GitHub代碼庫的高人氣,其未來很可能仍將是攻擊者的重點攻擊目標。
總部位於紐約市的科技諮詢公司Tribeca Softech首席戰略官阿曼·馬哈帕特拉表示,此次攻擊的具體細節,很可能預示著未來一段時間內新型AI相關攻擊的發展路徑。
他說:「十年來,供應鏈威脅模型一直假定惡意代碼會在用戶安裝或執行某個程序時運行。而此次攻擊活動植入了Claude Code的SessionStart鉤子
、Gemini的配置文件、Cursor
的MCP
配置及相關規則,以及VS Code的文件夾打開任務,這意味著只要開發者在其工具中打開相關代碼庫,負載就會運行。.claude/settings.json已經成為了新時代的autorun.inf文件。」
馬哈帕特拉表示:「攻擊者已經將觸發點從『運行代碼』轉移到了『打開文件夾』,他們精心設計了能夠從設計層面逃避沙箱檢測的惡意軟體,並將整個行業此前採取的最終修複方案,變成了下一個攻擊目標。那些圍繞安裝時掃描構建的供應鏈防禦體系,如今防範的早已不是正確的時機點了。」
他還表示,自己對攻擊者所採用的文件體積偽裝策略尤為擔憂。
馬哈帕特拉說:「這些13MB大小的封裝器還採用了一種更為粗暴的手段。它們的體積超過了GitHub代碼搜索功能所能索引的範圍,也超過了內容API所能返回的內容範圍,這正是早期分析能發現相關鉤子,卻誤判負載文件為空文件的原因所在。攻擊者顯然研究過貴方檢測工具的文檔說明,並刻意將文件體積填充至超出其檢測限制。」
Dickson Research首席分析師弗蘭克·迪克森表示,他對攻擊者使用原生插件的手法也印象深刻。
他說:「這個插件本身不攜帶任何負載,並且會拒絕在CI系統、容器環境、小型虛擬機,或處於調試器監控狀態下運行。在Windows系統中,若檢測到Wireshark或Process Monitor正在運行,它同樣會停止運行。掃描工具看到的只是一個占位程序,而開發者的筆記本電腦上運行的才是真正的惡意程式。」
迪克森表示,此次攻擊確實涉及AI相關風險,但這屬於次要風險敞口,只有當攻擊者竊取到有效憑證後才會真正顯現。不過,由於智能體相關應用的普及,這一風險的嚴重性有所上升。
迪克森說:「此次植入的文件是針對Claude、Gemini、Cursor以及VS Code的執行鉤子。在受支持的工具中打開一個項目,就可能觸發負載運行。開發者的一次常規操作,就會變成攻擊的引爆點。可以說,開發者的筆記本電腦掌握著『王國的鑰匙』:包括GitHub令牌、npm令牌、雲服務密鑰以及AI服務提供商的憑證。攻擊者已經找到了一種獲取這些憑證的新方式。」「客觀來說,這些鉤子本身屬於正常功能,而非安全缺陷。此次事件的根本原因在於憑證被竊取,而非AI工具本身存在問題。但即便如此,一個『打開文件夾就會運行代碼』的功能,理應受到與構建腳本同等嚴格的安全審查。」






