返回所有文章
發佈於 · 作者 Renaud Deraison

那個指令叫作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-clidef-open-clientopen-worker-cliuniapi-bridge),於是目標組織裡的開發者或建置流程解析到公開的 冒牌貨,依賴樹上就被接上了一隻遠端存取木馬。Socket 研究員 Karlo Zanki 把動機解讀為產業間諜活動。

套件裡沒有任何東西是惡意的

打開其中任何一個 tarball,你找不到可以回報的東西。沒有 postinstall 掛鉤——那是所有人第一個 grep 的目標。誘餌套件依賴 smart-config-manager,它依賴 cloud-config-fetcherlocal-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 出發,它沿著一道後備階梯往下走(getBuiltinModulemainModule.requiremainModule.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 流量戴著偽造的 OriginReferer 標頭,聲稱來自 Alibaba 內部文件網域。

有一組指令讓這變成程式編寫代理的故事。在常見動詞之外,這隻 RAT 還帶著 aipoisonaipoison_injectaipoison_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 裡 ,無從收集。

RAT 如何組裝:套件裡沒有惡意1 · npm installtarball 乾淨沒有 postinstall3 個工具套件2 · preferences.json來自攻擊者的 GitHub「規則」裡的 vm 逃逸審查後仍可修改3 · setting.js來自雲端儲存依 OS 選酬載.zshrc · LaunchAgent4 · C2shell · 檔案 · 代理aipoison → .skills修補你的 AI 工具步驟 2、3、4 是網路事件。你能讀到的程式碼只做了步驟 1。同樣四個步驟,在 Bromure 設定檔裡用完即丟的 Linux VM代理程式 · npm · 酬載寫入的一切.zshrc、LaunchAgent、.skills → 只在這台機器伸手可及的憑證:中介誘餌任務結束即丟棄每一跳主機代理,在你的 Mac 上1 · 登錄庫 → 信譽檢查,否則問你2 · 攻擊者的 GitHub raw → 拒絕3 · 不明儲存 bucket → 拒絕4 · C2 → 拒絕
攻擊靠三次抓取把自己組裝起來。npm 的 tarball 裡沒有任何惡意的東西:敵意邏輯來自攻擊者至今仍掌控的 GitHub 檔案,各階段來自雲端儲存,然後 RAT 打電話回家。在 Bromure 設定檔裡,主機代理把其中每一跳都比對你為這個工作區核准的目的地,而酬載寫入的每個檔案都落在一台只為一個任務存在的 VM 裡。

審查一個產出物,只能告訴你這個產出物的事

研究人員每週都在不同的函式庫裡重新教這一課。昨天,一個信任旗標 失守,因為檢查和載入發生在不同的時刻。 六月,一個儲存庫保持乾淨,因為反向 shell 住在一筆 DNS 紀錄裡 。如今十八個套件讀起來 都乾淨,因為惡意的部分是一個攻擊者仍握在手裡的 JSON 檔案。

代理程式讓這一切更尖銳,因為它們快。被要求接上內部 API 的代理程式 會加入依賴、執行安裝、進到任務的下一步,快到你切換視窗的工夫都 不夠。這個速度正是你買它的全部理由。把判斷放在速度追不上的地方: 在登錄庫抓取處和線路上,讓你的 Mac 依照你設定過一次的政策,為代理 程式的每個套件、每條連線做決定。

繼續讓代理程式安裝東西,因為槓桿就在那裡。安裝 Bromure Agentic Coding,開啟供應鏈各層防護,並給設定檔一份對 這份工作合理的目的地清單。下一場攻擊行動會把酬載藏到別的地方—— 這是這一行唯一穩妥的預測——但它仍然得跨過一條先問你的線路才能 拿到手。