React Native 生態系統中的惡意 npm 套件

最後更新: 03/26/2026
作者: C 源追蹤
  • 多個攻擊活動透過帳戶劫持和網域搶注等手段濫用了受信任的 React Native npm 套件和工具,從 UI 元件到 CLI 實用程式。
  • 攻擊者越來越多地使用 Solana 或去中心化 C2 部署複雜的多階段惡意軟體,目標是開發人員機器、CI 管道以及錢包或憑證資料。
  • 安全廠商現在依靠人工智慧分析、冷卻檢查和強化的 CI 出口控制,在幾分鐘內捕獲並遏制這些供應鏈攻擊。
  • React Native 團隊必須結合嚴格的依賴管理、npm 雙重認證、鎖定檔案和持續監控,才能有效降低供應鏈風險。

React Native 中的惡意 npm 套件

React Native 已成為建立行動應用程式的首選框架,這使得其 npm 生態系統成為攻擊者入侵開發人員機器和 CI 管道的極具吸引力的目標。 在過去的幾年裡,一些高度複雜的攻擊活動濫用了受信任的 React Native 套件、圍繞該框架的流行工具,甚至濫用了拼寫錯誤的實用程序,以植入惡意軟體、竊取憑證、竊取錢包並大規模破壞 JavaScript 專案。

如果你現在建立或維護 React Native 應用,僅僅「運行 npm install 然後祈禱一切順利」已經遠遠不夠了。 多個威脅行為者正在系統性地濫用 npm,攻擊目標涵蓋從 UI 元件到 CLI 工具的方方面面,甚至包括隱藏在 lockfiles 深處的傳遞依賴關係圖。本文將回顧已知的重大事件,剖析惡意軟體的工作原理,並提出切實可行的步驟,幫助您降低自身開發環境的受影響範圍。

React Native 輸入元件中的帳戶盜用和惡意軟體

React Native 領域最令人震驚的供應鏈事件之一波及到了兩個非常常見的 UI 元件:手機和國家選擇元件。 react-native-international-phone-number 以及 react-native-country-select. 這兩個軟體包均由同一作者維護(@AstrOOnautanpm 用戶 astroonauta),每週累計下載量達數萬次,並嵌入許多生產行動應用程式中。

npm 供應鏈對 React Native 元件的攻擊

2026 年 3 月 16 日,StepSecurity 的 AI 軟體包分析器率先發現這些庫的新版本突然獲得了安裝時惡意軟體。 立即遭到洩漏的版本是 react-native-international-phone-number@0.11.8 以及 react-native-country-select@0.3.91當時最後確認的乾淨版本是 0.11.7 以及 0.3.9

最初的後門(第一波)極為簡單:一個新的 preinstall 腳本和高度混淆的 install.js 文件已打包到 tar 文件中。 惡意 package.json 程式碼片段如下所示:

"scripts": { "preinstall": "node install.js" }

因為 npm 生命週期腳本會自動執行 npm install任何從本地或 CI 系統拉取這些版本的人都會運行惡意軟體,而無需導入任何程式碼。 受損版本沒有對應的 Git 標籤、發布版本或 CI 工作流程運行記錄,而且 gitHead 與先前的良好版本一致,這強烈表明攻擊者獲得了維護者的 npm 帳戶的直接發布權限,而不是修改了 GitHub 儲存庫。

當時的下載數據凸顯了情況可能有多糟糕:每週下載量約為 9,000 次 react-native-country-select 以及超過 20,000 個 react-native-international-phone-number兩者加起來每月下載量超過 130,000 萬次。 這正是那種高容量、低可見度的依賴項,它會悄無聲息地出現在成千上萬台開發人員和 CI 機器上。

三波攻擊:從顯而易見的預安裝到隱藏的依賴鏈

React Native 遭受了一波又一波惡意 npm 攻擊

針對這些 React Native 套件的攻擊活動分三個不同的階段展開,每一階段都比上一階段更具規避性,同時重複使用相同的核心惡意軟體。 StepSecurity 近乎即時地追蹤了事態發展並與維護者協調,但攻擊者反覆重新獲得或保留了對被入侵的 npm 帳戶的存取權限。

第一波(2026年1月16日)以直射波為中心 preinstall 兩個包中都需要鉤子。 發布後大約五分鐘內,StepSecurity 的人工智慧將新版本標記為關鍵版本,並在 GitHub 上創建了問題:#165 react-native-international-phone-number 以及排名第 11 的 react-native-country-select維護者迅速做出反應,棄用了惡意版本並推送了乾淨的版本。 react-native-country-select@0.4.0從發佈到棄用的總時間約為 2 小時 21 分鐘——以生態系統標準來看速度很快。

儘管如此,攻擊者始終沒有失去對 npm 憑證的控制權,導致 2 月 17 日發生了第二波攻擊。 攻擊者沒有像以往那樣在主軟體包中植入明顯的腳本,而是部署了兩個新的、作用域限定的軟體包作為隱藏的基礎設施:

  • @usebioerhold8733/s-format@2.0.1 ——一個空心的克隆體 string-format 搭配 postinstall: "node init.js" 腳本缺失 init.js 文件,因此鉤子會靜默失敗。
  • @agnoliaarisian7180/string-argv@0.3.0 一個幾乎為空的軟體套件(README、LICENSE、package.json),其唯一真正的目的就是依賴 @usebioerhold8733/s-format,維護者位址基於 ProtonMail。

當晚晚些時候, react-native-international-phone-number@0.12.1 已出版 @agnoliaarisian7180/string-argv@0.3.0 已新增為新的依賴項,同樣沒有進行任何 GitHub Actions 操作。 當時,該鏈已準備就緒但處於休眠狀態,等待有效載荷被啟動。當 StepSecurity 報告異常情況時,維護者證實了從相關痕跡中已經顯而易見的事實:「我的 npm 帳戶遭到攻擊,庫被接管了」。

第三波(3 月 18 日)將分階段的基礎設施轉變為活躍的多層惡意軟體分發鏈,然後迅速對其進行改進。 不到一個小時,攻擊者就推送了中繼套件和主函式庫的新版本,並不斷迭代有效載荷的發射方式。

最終的鏈條看起來是這樣的:

react-native-international-phone-number@0.12.2/0.12.3 → @agnoliaarisian7180/string-argv@latest → @usebioerhold8733/s-format@latest → postinstall → node child.js → init.js (malware)

攻擊者首先啟動了有效載荷 @usebioerhold8733/s-format@2.0.2 透過添加一個大的、模糊的 init.js 該文件與前一個文件逐字節完全相同 install.js 來自第一波。 然後他們改變了 postinstall 打電話 child.js 而不是 init.js,已發布 2.0.3 腳本缺失(又一次試運行),最終發貨 2.0.4 微小 child.js 載入器僅檢查以下內容 init.js 並通過以下方式執行它 child_process.exec 同時丟棄錯誤和 stderr 輸出。

在同一時間, @agnoliaarisian7180/string-argv@0.3.1 改變了對…的依賴 s-format 從置頂版本到 "latest"以及 react-native-international-phone-number@0.12.2 也做了同樣的事情 string-argv. 這形成了一個自我更新的惡意鏈,其中主軟體包的每次安裝都會自動拉取最新的有效載荷版本。

最後, react-native-international-phone-number@0.12.3 刪除了現在不必要的預安裝鉤子(為了看起來更簡潔),保留了惡意依賴鏈,並將 npm 維護者電子郵件更改為另一個並非原作者擁有的 ProtonMail 帳戶。 這清楚地表明,攻擊者正在鞏固對 npm 身分的持久控制,而不僅僅是伺機重複使用洩漏的令牌。

針對 React Native 開發人員的 Solana 惡意軟體內部

從本質上講,這三波攻擊中運行的有效載荷都是同一個複雜的多階段惡意軟體,它利用 Solana 區塊鏈作為動態命令和控制通道。 交付機制不斷變化,但「武器」在所有迭代中都保持不變,甚至從 Wave 1 移植到 Wave 3 基礎設施時,檔案也是逐字節相同的。

腳本開始時故意延遲了 10 秒。 setTimeout一個經典的沙盒遊戲規避技巧。 許多自動化沙箱和安全工具只給腳本很短的執行窗口,之後就會判定沒有發生任何可疑事件,因此惡意軟體會等待一段時間,然後再進行任何有趣的操作。

接下來,它會執行地理過濾,以避免感染俄羅斯和獨聯體部分地區的系統。 它會檢查環境變量,例如 LANG, LANGUAGE, LC_ALL主機使用者資訊、系統時區甚至原始 UTC 偏移量,找出指示俄羅斯區域設定的值(例如 ru_RU or Russian)或俄羅斯/獨聯體時區清單中的某個時區。如果配對到其中任何一個,腳本將立即靜默退出。

只有當環境通過該檢查後,惡意軟體才會開始與 Solana 區塊鏈通訊。 它保存著一個硬編碼的錢包位址,並透過以下方式查詢該位址: getSignaturesForAddress 此方案採用 JSON-RPC 方法,跨越由不同供應商託管的九個 Solana RPC 端點。這種設計賦予攻擊者高可用性,並使簡單的網域或 IP 屏蔽失效。

訣竅在於攻擊者將下一階段有效載荷 URL 隱藏在 Solana 向該錢包發送的交易的備註字段中。 該備忘錄儲存了一段經過 base64 編碼的 JSON 數據,其 link 該欄位包含下一階段的 URL。透過發布新的事務,操作員可以隨時輪換有效負載 URL,而無需修改已發布的 npm 套件。

一旦提取出 URL,惡意軟體就會向攻擊者的伺服器發送 HTTP 請求。 http://45.32.150.251/以自訂方式傳送作業系統類型 os 頭部訊息,以便 C2 可以傳回特定於平台的二進位檔案。 響應體包含加密的有效載荷,但解密所需的 AES-256 金鑰和 IV 僅透過 HTTP 標頭傳送(secretkey 以及 ivbase64因此,任何緩存或攔截的身體資料本身都是無用的。

解密後的第二階段程式碼不會寫入磁碟;它是在記憶體中執行的。 eval(atob(...)) 在類 Unix 系統上或透過 vm.Script 在 Windows 系統上,擁有對 Node 內部環境的完全存取權。 之後,惡意軟體會釋放一個 ~/init.json 標記檔案儲存時間戳記和唯一標識符,確保同一台機器每 48 小時不會被重複感染超過一次。這種限速機制顯著降低了乾擾因素,減少了防禦者可以利用的行為指標。

研究人員透過重播相同的 Solana 和 HTTP 步驟恢復了 AES 解密的第三階段有效載荷,這是一個以 Windows 為中心的憑證和錢包竊取器以及載入器。 它與…建立了持久性 schtasksRun 註冊表項,從下載額外的加密模組 45.32.150.251並將所得贓物洩漏到 217.69.3.x 範圍內的 IP 位址。

此有效載荷會從桌面錢包和瀏覽器擴充功能(例如 MetaMask、Phantom、Exodus、Atomic、Guarda、Coinomi、Daedalus、OKX Wallet、Trust Wallet、Braavos 等)中搜尋數據,並在強制關閉 Chrome 和 Firefox 後,遍歷瀏覽器設定檔資料夾和本機錢包目錄。 除此之外,它還會直接從本機設定和憑證助理中提取 npm 令牌和 GitHub 憑證,將受感染的開發者主機變成進一步供應鏈攻擊的完美跳板。

值得注意的是,該惡意軟體甚至會下載其自身的 Node.js 執行時間環境(版本 22.9.0),同時支援 x86 和 x64 架構。 %APPDATA%\_node_x86 以及 %APPDATA%\_node_x64, 即使目標系統上未安裝 Node,也能確保其具有一致的執行環境。

與 ForceMemo 和 GlassWorm 威脅行為者的鏈接

這次 React Native npm 事件的技術特徵與先前名為「ForceMemo」的攻擊活動幾乎完全吻合,該活動曾導致 GitHub 上數百個 Python 儲存庫遭到入侵。 兩次行動都使用 Solana 作為死信箱 C2 伺服器,使用了相同的九個 RPC 端點,以及相同的 JSON 備忘錄格式。 link 字段,相同的俄羅斯/獨聯體地理過濾邏輯,相同 ~/init.json Vultr 上託管的持久鎖和類似的基礎設施範圍。

儘管兩次攻擊活動中 Solana 錢包位址有所不同,但其他所有資訊都指向同一個能力極強的攻擊者,據信就是 GlassWorm 組織。 ForceMemo 透過被竄改的 GitHub 程式碼庫攻擊開發者,而 React Native 事件則是透過 npm 套件及其依賴鏈進行攻擊。其策略顯而易見:重複使用一個複雜的模組化惡意軟體框架,並將其插入不同的分發管道,以盡可能覆蓋更多的開發環境。

其他針對 React Native 和 JavaScript 的惡意 npm 活動

AstrOOnauta 漏洞只是更廣泛的基於 npm 的攻擊浪潮中的一部分,這些攻擊直接或間接地影響 React Native 應用程式。 多家安全廠商記錄了針對 React Native UI 函式庫、核心 CLI 工具,甚至是許多 React Native 程式碼庫所依賴的通用建置外掛程式的平行攻擊活動。

Aikido Security 於 2025 年 6 月發現了一起重大供應鏈攻擊事件,該事件至少在 16 個與 React Native 相關的軟體包中植入了後門。 @react-native-aria/* 範圍加 @gluestack-ui/utils總計每週下載量約一百萬次。 首次資料外洩事件發生在2025年6月6日,始於 @react-native-aria/focus@0.2.10然後迅速擴展到其他焦點、疊加、互動、切換、開關、複選框、單選按鈕、按鈕、選單、列錶框、選項卡、組合框、披露、滑塊、分隔符號包以及 GlueStack 實用程序,時間是 6 月 7 日。

此攻擊活動中的惡意軟體是一種針對 Windows 環境量身定制的遠端存取木馬 (RAT),可在 Windows 系統下持續運作。 %LOCALAPPDATA%\Programs\Python\Python3127 並連接到 C2 伺服器 136.0.9[.]8 以及 85.239.62[.]36. 它具備執行任意命令、文件上傳/下載和長期遠端存取等功能。其持久性意味著,即使升級到乾淨版本的 React Native 庫,也無法清除已感染的機器。

Socket 威脅研究團隊揭露的另一起長期攻擊活動利用域名搶注和模仿技術植入破壞性軟體包,這些軟體包明確針對 React、Vue、Vite 和 Quill 等流行的 JavaScript 框架。 威脅行為者使用 npm 別名 xuxingfeng在兩年多的時間裡,發布了合法和惡意軟體混合的軟體包,給人一種值得信賴的維護者的印象。

類似這樣的套餐 vite-plugin-bomb, vite-plugin-bomb-extend, vite-plugin-react-extend, vite-plugin-vue-extend 以及 vue-plugin-bomb 其設計目的並非竊取數據,而是主動破壞或摧毀專案。 他們實施了由特定日期觸發的多階段攻擊,刪除了關鍵框架檔案。 node_modules (Vue、React、Vite、TypeScript、Ant Design Vue、Pinia、ECharts 等),有時也會配合每秒強制系統關機。 shutdown -s -t 5.

一個特別討厭的包裹, js-hood竄改了核心 JavaScript 原型,例如 Array.prototype.filter, map, push, pop 和多個 String 方法他們會用語法看似正確但傳回隨機資料的函數來取代這些函數。這導致應用程式雖然能夠繼續運行,但會產生錯誤且不確定的結果,極難調試。

quill-image-downloader 該系列劇轉向了另一個方向,重點關注客戶端儲存破壞。 它採用了一種三文件架構,在指定的啟動日期之後,該架構會遍歷所有金鑰。 localStorage, sessionStorage 它會對 cookie 進行處理,然後用隨機字元部分打亂其值,同時保留其結構。身份驗證令牌、購物車、使用者偏好設定以及任何瀏覽器端狀態都會被悄悄破壞,導致間歇性故障,許多團隊最初會將這些故障歸咎於應用程式錯誤。

OP Innovate 的另一項研究發現了一組包含十個惡意 npm 套件的惡意軟體,這些軟體冒充了 TypeScript、discord.js、ethers.js、nodemon 等知名函式庫。 react-router-dom 以及 zustand. 安裝完成後,這些軟體包會顯示一個偽造的驗證碼窗口,取得主機指紋,並從 C2 伺服器下載一個大型跨平台資訊竊取程式。 195.133.79.43同樣明確支援 Windows、macOS 和 Linux。

最後,Aikido 詳細介紹的 CanisterWorm 攻擊活動表明,攻擊者為了利用 npm 作為傳播工具,願意走多遠。 超過 135 個來自被入侵的發布者帳戶的軟體包被植入了安裝時腳本,這些腳本會在應用程式程式碼或建置步驟之前執行。後續階段的行為會根據部署位置(本地開發環境、持續集成作業或容器化構建節點)而有所不同,並且它們會與一個去中心化的互聯網計算機 (ICP) 容器通信,該容器充當隱蔽的 C2 伺服器——這使得操作人員無需再次修改 npm 註冊表即可動態更改其行為。

React Native 工具中的關鍵漏洞:社群 CLI 遠端程式碼執行

並非所有 React Native 安全風險都來自惡意軟體;有些風險源自於廣泛使用的工具中的嚴重漏洞。 一個值得注意的例子是 React Native Community CLI 中的 CVE-2025-11953,該軟體包每週被 Windows、macOS 和 Linux 上的開發人員拉取數百萬次。

此漏洞允許透過精心建構的 POST 請求向 CLI 啟動的本機開發伺服器執行未經身份驗證的遠端程式碼執行 (RCE)。 由於許多開發者為了調試或行動裝置測試,會將他們的 metro/dev 伺服器暴露在網路上,因此附近的攻擊者(或能夠將流量路由到這些連接埠的人)可以在開發者的機器上執行任意命令。

影響遠不止一台開發人員工作站: 一旦攻擊者在開發機上獲得了程式碼執行權限,他們就可以入侵企業網絡,竊取憑證,篡改建置版本,或操縱從該機器同步的 CI/CD 管線。這正是一個典型的例子,說明在雲端連接系統中,「僅僅是一個本地開發工具」是如何成為生產環境攻擊面的一部分的。

建議的緩解措施很簡單,但不容商量:更新到 React Native Community CLI 12.5.1 或更高版本,審核日誌中是否存在可疑的 POST 請求或開發伺服器啟動的意外進程,限制對本地伺服器的訪問,並將開發工具納入威脅檢測策略。 將任何 DevOps 或開發人員端點視為高價值目標,因為現代攻擊者正是這樣看待它們的。

防守方的因應措施:人工智慧分析、冷卻時間與強化CI

這些事件帶來的正面影響是,安全社群在發現針對 React Native 和更廣泛的 JavaScript 領域的供應鏈威脅方面,速度越來越快,技術也越來越精湛。 StepSecurity、Socket 和 Aikido Security 等工具在行為分析、自動差異比較和機器學習模型方面投入大量資金,可以在發布後幾分鐘內掃描新的 npm 版本。

在 AstrOOnauta 攻擊中,StepSecurity 的 AI 套件分析師在不到五分鐘的時間內檢測到了惡意版本,在 GitHub 上創建了包含完整技術分析的問題,隨後將攻擊者的基礎設施套件報告給 npm 以便刪除。 團隊記錄了每一波更新,追蹤了 git 版本,分析了混淆的程式碼,證明了 Solana C2 的使用情況,並向維護者提供了逐步的修復指導。

除了偵測之外,預防性控制措施在持續整合管道中也開始受到重視。 例如,StepSecurity 的 npm 套件冷卻檢查功能允許組織阻止僅幾小時前發布的依賴項,從而為掃描程式和人工檢查爭取時間。其受損更新檢查會交叉引用一個不斷更新的已知問題包列表,並拒絕任何試圖添加或升級這些套件的 PR。

像 Harden-Runner 這樣的網路感知工具會將 GitHub Actions 和其他 CI 作業中的出站連線限制為預期端點的允許清單。 在惡意軟體可以從 Solana RPC 節點、Google 日曆 URL、Vultr IP 範圍或 ICP 容器中獲取有效載荷的世界裡,鎖定建置系統的出口可能是避免糟糕的軟體包差異和全面入侵之間的區別。

在回應方面,組織範圍內的包裹搜尋和威脅中心等功能可以幫助團隊快速繪製爆炸半徑圖。 一旦發現被入侵的 React Native 套件或插件,安全團隊就可以查看哪些儲存庫、分支和鎖定檔案包含它,哪些作業執行了它,以及哪些機器與可疑 IP 位址通訊——然後根據數十個或數百個程式碼庫的情況,確定修復的優先順序。

React Native 團隊面對 npm 惡意軟體的實用因應措施

對於 React Native 開發人員和安全工程師來說,防禦 npm 等級的攻擊意味著將個人機器上的安全措施與 CI/CD 和依賴管理中的防護措施結合。 沒有任何單一的控制措施可以完全保護你,但多層防禦可以大大降低惡意軟體感染導致系統完全崩潰的機率。

如果您使用了前面提到的受感染軟體包,則需要立即執行一些檢查。 關於 AstrOOnauta 事件,請置頂 react-native-international-phone-number 到版本 0.11.7 以及 react-native-country-select0.4.0避免使用所有被標記為惡意或解析為 @latest 目前這對應到一個被篡改的版本。

檢查您的主目錄,尋找名為“ init.json 在使用者個人資料下(例如) ~/init.json 在 Unix 系統上 ~\init.json 在 Windows 上)。 它的存在表明基於 Solana 的惡意軟體至少執行過一次。此外,還要審核開發人員工作站和 CI 執行程式的出站網路日誌,以尋找與該惡意軟體的連線。 45.32.150.251例如,活動中使用的 Solana RPC 端點,或前面提到的其他 C2 位址(例如)。 136.0.9[.]8, 85.239.62[.]36, 195.133.79.43, 217.69.3.152).

請查看 node_modules 以及用於檢測關鍵依賴關係的鎖定文件,例如 @agnoliaarisian7180/string-argv, @usebioerhold8733/s-format 和惡意的 @react-native-aria/* or @gluestack-ui/utils 公告中列出的版本。 如果發現任何此類漏洞,請將該機器視為可能已被入侵,並輪換所有敏感憑證:npm 令牌、GitHub 存取權杖、SSH 金鑰、雲端提供者金鑰以及其中存在的任何金鑰。 .env 或在安裝時提供設定檔。

展望未來,加強 React Native 專案的供應鏈管理: 始終提交並強制執行鎖定檔(package-lock.json, yarn.lock, pnpm-lock.yaml),在所有具有發布權限的 npm 帳戶上啟用雙重認證,並將 CI 配置為在出現未經審核的新依賴項時建置失敗。考慮運行 --ignore-scripts 在不受信任的環境中安裝第三方軟體包時,將依賴項掃描工具整合到本機工作流程和 CI 中。

最後,要將開發環境(尤其是用於連接行動、Web 和後端 API 的 React Native 應用的環境)視為生產攻擊面的一部分。 無論是帳號被盜用並將 Solana 支援的惡意軟體植入手機輸入元件,還是網域被搶注的 Vite 外掛程式刪除 React,這種威脅都可能導致問題。 node_modules無論是惡意 Quill 整合導致客戶端儲存混亂,還是 React Native Community CLI 中的遠端程式碼執行 (RCE),共同點是攻擊者現在將開發者工具視為入侵組織核心資產的最有效途徑之一。

相關文章: