摘要
本報告提供了對
CVE-2025-11953
的詳細技術分析,這是一個在
@react-native-community/cli-server-api
套件中發現的重大(CVSS 9.8)遠端程式碼執行(Remote Code Execution, RCE)漏洞,該套件是 React Native Community CLI 的一個組件。此漏洞源於 Metro 開發伺服器中
/open-url
端點的不安全實作,當與伺服器預設綁定到外部網路介面的設定結合時,允許未經驗證的攻擊者執行任意作業系統命令。分析重點放在有漏洞的程式碼路徑、攻擊機制以及版本 20.0.0 中實作的修補程式的技術細節。
1. 簡介
React Native 框架被廣泛用於跨平台行動應用程式開發。命令列介面對於開發人員至關重要,它管理專案初始化並執行 Metro 開發伺服器。追蹤為 CVE-2025-11953 的漏洞影響
@react-native-community/cli-server-api
套件,特別是版本 4.8.0 到 20.0.0-alpha.2
[1]
。此缺陷特別嚴重,因為它透過預設設定將本機命令注入漏洞轉變為重大的 RCE,使開發機器暴露於外部網路攻擊
[1]
。
2. 漏洞技術分析
2.1. 有漏洞的程式碼路徑
漏洞的核心在於 Metro 開發伺服器中負責處理對
/open-url
端點請求的中介軟體。此端點旨在協助開發任務,例如在開發人員的機器上開啟 URL 或檔案。在
@react-native-community/cli-server-api/src/middleware.ts
(或受影響版本中的類似位置)發現的有漏洞程式碼片段,展示了直接使用 User 提供的輸入:
- // Snippet from @react-native-community/cli-server-api/src/middleware.ts (Vulnerable Logic)
- // ...
- if (req.url === '/open-url') {
- const url = getBody(req).url;
- if (url) {
- open(url); // * VULNERABLE LINE *
- }
- res.end('OK');
- return;
- }
- // ...
open()
函式是從
open
NPM 套件匯入的。該套件旨在使用作業系統的預設應用程式來開啟檔案、URL 和可執行檔。關鍵的安全缺陷在於,從 POST 請求主體提取的使用者提供
url
參數,在傳遞給
open(url)
之前未經過任何驗證或清理
[1]
。這種模式是典型的作業系統命令注入範例,其中外部輸入在用作作業系統命令之前未經過適當的中和(neutralized)處理
[3]
。
2.2. 攻擊機制
攻擊向量是雙重的。首先,命令注入漏洞存在於
open()
函式的實作中,特別是在 Windows 作業系統上。在 Windows 上,
open
套件執行 shell 命令,通常使用
start
命令,來開啟指定的 URL 或檔案。透過注入 shell metacharacters(例如
&
、
|
、
;
),攻擊者可以突破預期命令並執行任意作業系統命令。例如,攻擊者可以傳送 POST 請求到
http://<developer-ip>:8081/open-url
,並帶有 JSON 主體:
{ "url": "calc.exe" }
雖然這個例子很簡單,但原始報告確認在 Windows 上,這會導致具有完整參數控制的任意作業系統命令執行 [1] 。在 macOS 和 Linux 上,該漏洞導致具有有限參數控制的任意可執行檔執行,儘管透過進一步研究可能實現完整的 shell 命令執行 [1] 。
第二個同樣關鍵的因素是 Metro 開發伺服器的預設設定。預設情況下,伺服器綁定到外部網路介面,使得同一網路上的任何未經驗證的攻擊者都可以存取它 [1] 。這將漏洞從本機問題提升為重大的遠端程式碼執行缺陷。
2.3. 漏洞資料流程圖
下圖說明了從攻擊者請求到最終命令執行的資料流程,突出了關鍵的失敗點:
圖 1:說明透過
/open-url
端點導致遠端程式碼執行的資料流程路徑。
3. 緩解措施與修補程式分析
3.1. 修補程式實作
該漏洞在
@react-native-community/cli-server-api
版本
20.0.0
中得到解決
[1]
。在
Commit 1508990
中實作的修復,在將輸入傳遞給
open()
函式之前,引入了對 URL 協定的嚴格驗證。此驗證確保僅處理具有
http:
或
https:
協定的 URL,從而有效防止注入任意命令或本機檔案路徑
[4]
。修補程式的核心邏輯如下:
- // Snippet from packages/cli-server-api/src/openURLMiddleware.ts (Patched Logic)
- async function openURLMiddleware(
- req: IncomingMessage,
- res: ServerResponse,
- next: (err?: Error) => void,
- ) {
- // ... existing logic ...
- const {url} = req.body as {url: string};
- try {
- // 註解: 引入 URL 驗證,確保只有 http: 或 https: 協定被允許
- const parsedUrl = new URL(url);
- if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {
- res.writeHead(400);
- res.end('Invalid URL protocol');
- return;
- }
- } catch (error) {
- res.writeHead(400);
- res.end('Invalid URL format');
- return;
- }
- await open(url);
- res.writeHead(200);
- res.end('OK');
- }
透過強制執行此協定檢查,應用程式確保傳遞給可能不安全的
open()
函式的
url
變數只能包含標準的網路協定。這顯著限制了攻擊者注入作業系統命令的能力,因為
open
套件在處理有效的網路 URL 時不太可能執行任意 shell 命令。
3.2. 一般安全原則:不安全執行
該漏洞凸顯了軟體安全中反覆出現的主題:將未清理的使用者輸入傳遞給執行程式碼或 shell 命令的函式的危險性。一個類似的漏洞 CVE-2025-4318 在 AWS Amplify Studio 的 UI 生成框架中被發現,其中未清理的輸入被傳遞給 JavaScript 的
eval()
函式,導致 RCE
[2]
。該案例中的有漏洞程式碼是:
// Snippet from AWS Amplify Studio (Vulnerable Logic in CVE-2025-4318) export function evaluateExpression(expression: string): any { return eval(expression); // ⚠️ 直接使用未受信任輸入進行 eval }
CVE-2025-11953(使用
open()
)和 CVE-2025-4318(使用
eval()
)都表明,任何基於外部輸入動態執行程式碼或命令的函式都必須被視為安全邊界。必須進行嚴格的輸入驗證和清理,以防止命令注入和類似的 RCE 缺陷。
4. 結論
CVE-2025-11953 是一個重大的 RCE 漏洞,對 React Native 開發人員構成了重大威脅。該缺陷是
/open-url
端點中的作業系統命令注入漏洞與將開發伺服器外部暴露的風險預設設定的結合。對修補程式的技術分析確認,修復是驗證輸入協定的關鍵步驟,從而減輕了 RCE 風險。強烈建議開發人員將其
@react-native-community/cli-server-api
套件更新到版本 20.0.0 或更高版本。作為次要緩解措施,建議使用
--host 127.0.0.1
標誌明確將開發伺服器綁定到本機位址介面,以防止外部存取
[1]
。