LinkedIn 工作機會後門:社交工程攻擊分析
一位軟體工程師最近詳細說明了一起精密的社交工程攻擊,該攻擊透過一名自稱「加密新創」的假 LinkedIn 招募人員,試圖在受害者的機器上安裝後門。攻擊者利用開發者常見的工作流程——為潛在職位審查程式碼庫——來欺騙受害者執行 npm install,從而觸發遠端程式碼執行 (RCE) 載荷。
攻擊向量:npm install 作為觸發器
此攻擊的主要機制是使用 npm 生命週期腳本。攻擊者提供了一個公開的 GitHub 倉庫,並指示目標「檢查已棄用的 Node 模組問題」,實際上是誘使他們執行 npm install 以建立環境。
在提供的倉庫中,package.json 檔案的設定如下:
prepare腳本被設定為執行npm run app:pre。app:pre腳本執行node app/index.js。
由於 npm 會在 npm install 後自動執行 prepare 腳本,惡意程式碼會在安裝相依套件的同時立即執行,使用者甚至不需要手動啟動應用程式。
後門的技術拆解
惡意載荷隱藏在 app/test/index.js 中,偽裝成測試套件。程式碼使用了多種混淆技術以避免被偵測:
字串碎片化:C2(指揮與控制)伺服器的 URL 由多段字串組合而成,以避免簡單的字串搜尋:
const protocol = "https", domain = "store", separator = "://", path = "/icons/", token = "77", subdomain = "rest-icon-handler", bearrtoken = "logo";這會組合成 URL:
https://rest-icon-handler.store/icons/77。透過註解混淆:實際的執行載荷被埋在單行最小化程式碼(第 225 行)中,四周被大量註解掉的測試程式碼包圍,以阻止手動審查。
執行流程:入口檔
app/index.js包含const test = require('./test'),此行會在啟動時載入並執行app/test/index.js中的程式碼。
身分盜用與冒充
攻擊者使用被盜或借用的身分來建立信任。GitHub 倉庫的提交歷史(共 39 次提交)被歸屬於一位與該專案毫無關聯的真實全端工程師。該工程師在被聯繫後確認自己曾在 GitHub 上被冒充過,且與此倉庫無關。
同樣地,招募人的 LinkedIn 個人檔案屬於一位真實的藝術記者。冒充的招募人展示出突如其來且不合常理的技術熟練度,從非技術性個人檔案突然轉變為在受害者遇到安裝問題時討論特定的 Node.js 版本(例如 Node.js v24)。
社群見解與模式
開發者在 Hacker News 上的討論顯示,這是一種廣泛針對軟體工程師,特別是加密/Web3 領域的攻擊模式。
常見手法
- 高壓招聘:攻擊者常使用假冒個人檔案,堅持候選人在本機執行程式碼以「修復」破損的概念驗證。
- 冒充:利用真實人物的身分,使倉庫透過提交歷史看起來合法。
- AI 增強的社交工程:部分受害者回報稱面試過程長且自然,包括關閉鏡頭的視訊通話,以在最終要求安裝惡意軟體前建立信任。
安全建議
- 沙箱化:原始報告的作者使用 Hetzner 的一次性 VPS 以及只讀的 AI 代理來分析程式碼,數秒內即偵測出後門。
- 對 npm 保持警惕:在不可信的倉庫上執行
npm install時務必極度小心,因為生命週期腳本可以執行任意程式碼。 - 身分驗證:對於在面試過程中要求本機執行程式碼的招募人保持警惕,特別是當其個人檔案與其技術專長不符時。
"這已經非常接近正常的面試任務了。有人傳給你一個 repo,說安裝壞了,然後請你檢查。很多開發者會在未多加思考的情況下先執行 npm install,尤其是當他們疲憊或在找工作時。"
平台回應
作者已向 GitHub 舉報該倉庫,並向 LinkedIn 舉報該招募人。然而報告指出,GitHub 與 LinkedIn 常常對這類惡意倉庫與個人檔案的處理速度緩慢,使得活躍的威脅持續存在較長時間。