那個指令叫作aipoison
Socket 發現一批共 18 個 npm 套件,冒充 Alibaba 的私有 @ali scope。所有 tarball 裡都沒有惡意軟體。這隻 RAT 在安裝時,從攻擊者至今仍掌控的 GitHub 儲存庫裡的一個 JSON 檔案把自己組裝起來,而它的持久化計畫包括修補 AI 程式編寫工具 .skills 目錄裡的 Python,所用指令名為 aipoison、aipoison_inject 和 aipoison_deploy。讀程式碼不可能發現這些。Bromure Agentic Coding 判斷的是一直可見的東西:沒有信譽的套件會在主機代理停下來等你同意,組裝酬載的三次抓取撞上一條只跟你核准的目的地說話的線路,而 RAT 寫入的每個檔案都落在一台只活一個任務的 VM 裡。
最終酬載的某處有一個名為 aipoison 的指令。它的工作是伸手進你的
AI 程式編寫工具的 skills 目錄,修補一個 Python 檔案,讓你下次開工
時,攻擊者也一起開工。
2026 年 8 月 3 日,The Hacker News
報導了 Socket 在七月底發表的研究:
一批約十八個 npm 套件,四月底就位,在登錄庫上待了三個月才被人抓到。
它們冒充 Alibaba 私有的 @ali scope 套件,以不帶 scope 的方式發布
相同名稱(aone-cloud-cli、def-open-client、open-worker-cli、
uniapi-bridge),於是目標組織裡的開發者或建置流程解析到公開的
冒牌貨,依賴樹上就被接上了一隻遠端存取木馬。Socket 研究員
Karlo Zanki 把動機解讀為產業間諜活動。
套件裡沒有任何東西是惡意的
打開其中任何一個 tarball,你找不到可以回報的東西。沒有
postinstall 掛鉤——那是所有人第一個 grep 的目標。誘餌套件依賴
smart-config-manager,它依賴 cloud-config-fetcher 和
local-config-parser。一個設定管理器、一個抓取器、一個解析器:
無聊的工具程式,每個一分鐘就能讀完。
惡意藏在組合裡,藏在一個攻擊者從未隨附出貨的檔案裡。匯入時,
抓取器從攻擊者掌控、而且至今仍掌控的 GitHub 儲存庫下載
defaults/preferences.json,寫到磁碟成為 .cloud-preferences.json。
解析器在 Node 的 vm 裡評估該檔案的「轉換規則」,攻擊就住在那裡。
其中一條規則是已成民間傳說的沙箱逃逸:
var F = items.constructor.constructor; // recover Function
var p = F('return process')(); // recover process
從 process 出發,它沿著一道後備階梯往下走(getBuiltinModule、
mainModule.require、mainModule.constructor._load),直到其中一個
在它落地的 Node 版本上交出 require。接著它從 Alibaba Cloud 的
儲存 bucket 抓取 setting.js,對主機採集指紋並安裝酬載:在
Windows 上,殺掉 Alibaba 自家的安全程式 Alilang,把它的
app.asar 換成木馬化的副本;在 Linux 上,往 /tmp 丟一個二進位
檔,分離執行,刪掉檔案;在 macOS 上,注入 ~/.zshrc 並註冊一個
每十分鐘觸發的 LaunchAgent。
GBHackers 把這個設計寫進了標題:攻擊者把 RAT 拆散到多個套件裡, 以躲過孤立的程式碼審查。 攻擊者打造這場行動,就是為了在被人閱讀後存活。單獨審查任何一個 套件,它過關。審查整棵樹,它照樣過關,因為敵意的部分是伺服器上的 一個 JSON 檔案,在你審完之後才被抓取,而且攻擊者可以在你的稽核與 你的安裝之間隨時改寫。
持久化計畫裡有你的代理程式
Socket 取回的最終酬載名為 aone-cli。它做這類東西都做的事:
shell 指令、檔案上傳下載、主機偵察、螢幕截圖、一條加密的反向
TCP 代理,還有一個透過 DingTalk 橫向移動的 dws_lateral 指令。
它的 C2 流量戴著偽造的 Origin 與 Referer 標頭,聲稱來自
Alibaba 內部文件網域。
有一組指令讓這變成程式編寫代理的故事。在常見動詞之外,這隻 RAT
還帶著 aipoison、aipoison_inject 和 aipoison_deploy。它們
修補特定開發工具 .skills 目錄裡的 Python 指令碼,在注入片段上
標記 # __INJECT_MARKER__,讓一段從 C2 拉下來的指令碼稍後從
工具內部、以你的身分執行。被點名的目標之一是
Qoder,
Alibaba 自家的代理式 IDE,去年八月推出後幾個月內就突破五百萬
使用者。
有人坐下來,端詳現代開發者的機器,挑中了代理程式的 skills 資料夾
作為持久的立足點:一個在每次工作階段開始時以你的權限執行、卻幾乎
沒有人 diff 過的指令碼目錄。這一招我們見過,當時一隻蠕蟲把自己
複製進 .claude,讓下一次代理
程式啟動時重新感染機器。它已經從蠕蟲的即興小技,升級成間諜工具箱
裡的具名指令。
攻擊者藏不住的部分
讀程式碼永遠找不到這些。但這場攻擊仍有前提條件,而且全都看得見: 一個沒有歷史、沒有信譽的套件;行動之前的三條對外連線(GitHub 上的 規則檔、雲端儲存的階段、C2);還有一台明天仍會在的機器。
Bromure Agentic Coding 在每一項上放了一個決定,而且是在你的 Mac 上、在代理程式運行的箱子之外做的, 裡面的任何東西都無從爭辯。
安裝在登錄庫前暫停。 每次套件抓取都會穿過主機端代理,在任何一
個位元組進入 VM 之前,代理就把你工作區的供應鏈政策套用到回應上。
開啟套件過濾後,代理會針對每個產出物查詢信譽提供者。兩個可選的
提供者之一就是 Socket——本文所談研究的作者。當所有啟用的來源都
無法為某個套件背書時,代理會扣住下載並詢問你。冒充私有 scope、
上一季才發布、下載量寥寥、到處都沒有信譽的冒牌貨,就停在那裡。
強制執行刻意放在主機上:VM 裡的 .npmrc 只能收緊政策、不能放
鬆,所以就算被入侵的東西正是負責把關的東西,
規則依然成立。
線路拒絕組裝。 這個設計在出口同意面前碎裂,因為 tarball 裡
沒有任何敵意的東西,網路本身就是攻擊。主機代理把三次抓取(攻擊者
的 GitHub raw 檔案、供應 setting.js 的儲存 bucket、C2 主機)
逐一比對你為這個設定檔核准的目的地。你安裝所用的登錄庫在清單上。
陌生人的 raw 內容路徑,和一個以你從沒聽過的 CLI 命名的 bucket,
不在。代理對 items.constructor.constructor 沒有意見,也不需要
有。它讀取目的地,找不到任何核准項目,然後切斷連線。你的安裝完成,
你的建置照跑,而 RAT 永遠組裝不起來,因為它的零件永遠到不了同一個
房間。
持久化拿到的是一台壽命只有一個任務的機器。 假設整條鏈還是跑完
了,因為你核准的目的地比你想的更寬,各階段都落了地。~/.zshrc
裡的那一行、十分鐘一次的 LaunchAgent、木馬化的 app.asar、被修補
的 .skills Python:這一切都寫進一台用完即丟的 Linux VM,與
macOS 隔著一層 hypervisor,裝著這個任務的工作區,工作合併後你就把
VM 扔掉。aipoison 賭的是它修補的工具和它入侵的主機是同一台長壽
機器。在設定檔裡,這個賭注輸了。最先跑的偵察帶回來的是中介的
誘餌:你真正的憑證住在主機
上,只在核准的目的地才於線路上注入,所以它們從來不在 VM 裡
,無從收集。
審查一個產出物,只能告訴你這個產出物的事
研究人員每週都在不同的函式庫裡重新教這一課。昨天,一個信任旗標 失守,因為檢查和載入發生在不同的時刻。 六月,一個儲存庫保持乾淨,因為反向 shell 住在一筆 DNS 紀錄裡 。如今十八個套件讀起來 都乾淨,因為惡意的部分是一個攻擊者仍握在手裡的 JSON 檔案。
代理程式讓這一切更尖銳,因為它們快。被要求接上內部 API 的代理程式 會加入依賴、執行安裝、進到任務的下一步,快到你切換視窗的工夫都 不夠。這個速度正是你買它的全部理由。把判斷放在速度追不上的地方: 在登錄庫抓取處和線路上,讓你的 Mac 依照你設定過一次的政策,為代理 程式的每個套件、每條連線做決定。
繼續讓代理程式安裝東西,因為槓桿就在那裡。安裝 Bromure Agentic Coding,開啟供應鏈各層防護,並給設定檔一份對 這份工作合理的目的地清單。下一場攻擊行動會把酬載藏到別的地方—— 這是這一行唯一穩妥的預測——但它仍然得跨過一條先問你的線路才能 拿到手。