Critical OS Command Injection Report: CVE-2025-11953

Critical OS Command Injection Report: CVE-2025-11953
Photo by Ilnur / Unsplash

1. Executive Summary

CVE-2025-11953 is a Critical (CVSS 9.8) OS Command Injection vulnerability found in the React Native Community CLI's Metro development server.

Component Vulnerability Type CVSS Score Impact
@react-native-community/cli-server-api (4.8.0 - 20.0.0-alpha.2) OS Command Injection (CWE-78) 9.8 (Critical) Unauthenticated Remote Code Execution on the developer's machine.

The flaw exists because the Metro dev server's /open-url HTTP endpoint improperly processes user input, passing it directly to an unsafe open() function that executes a system shell command. Since the server binds to all network interfaces by default, an unauthenticated attacker on the same network can send a crafted POST request to this endpoint to execute arbitrary OS commands on the developer's system.

This results in a complete loss of Confidentiality, Integrity, and Availability, potentially leading to full system compromise.


2. Basic Identification & Classification

Category Detail
CVE ID CVE-2025-11953
Title React Native Metro Development Server OS Command Injection (Critical RCE)
CWE Type CWE-78 – Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)
Affected Product React Native Community CLI (Metro dev server) and its component: @react-native-community/cli-server-api
Vulnerable Versions 4.8.0 through 20.0.0-alpha.2
Fixed Version v20.0.0 and later of both the CLI and cli-server-api

3. Technical Description

The vulnerability is rooted in the Metro dev server's openURLMiddleware.

  1. Default Configuration: When a React Native project starts, the CLI launches the Metro dev server (default port 8081). By default, it listens on all network interfaces (0.0.0.0), making it remotely accessible.
  2. Vulnerable Endpoint: The server exposes the POST /open-url HTTP endpoint, which is used internally during development to open files or URLs (e.g., refreshing documentation).
  3. Unsafe Command Execution: This endpoint takes a JSON payload, such as `{\"url": ""}`, and calls the open() function from the open NPM package. Crucially, the open() call executes a system shell command to open the provided URL.
  4. OS Command Injection: Metro does not sanitize the user-supplied url value before passing it to the command execution. An attacker can embed shell metacharacters (like &&, ;, |) into the url value to inject and execute arbitrary OS commands.

🗺 Attack Mapping

The attack requires no authentication or specific user interaction. An attacker only needs network access to the developer's machine on port 8081.

Example Payload (Windows):
A request containing {"url":"C:\Windows\system.ini" && calc.exe"} will cause the server to execute the system command, launching calc.exe in addition to its intended function. This technique grants the attacker full shell command execution.

Note: Frameworks like Expo that use a different development server are generally not affected by this specific vulnerability.

4. Risk Assessment (CVSS v3.1)

Metric Value Description
Base Score 9.8 (Critical) Reflects maximum severity due to network accessibility and full impact.
Vector String AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H AV:N (Network Attack Vector), AC:L (Low Attack Complexity), PR:N (No Privileges Required), UI:N (No User Interaction Required), C:H (High Confidentiality Impact), I:H (High Integrity Impact), A:H (High Availability Impact).
Impact High Successful exploitation leads to full remote code execution on the developer's system, allowing for data theft, code modification, and complete system disruption.
Exploit Status Proof-of-Concept (PoC) Exists Security researchers have publicly demonstrated the exploit, but there are no confirmed reports of in-the-wild attacks as the patch was released promptly.

5. Remediation and Mitigation

✅ Primary Solution (Patch)

The immediate and definitive solution is to upgrade the affected packages:

  • Target Version: Update the @react-native-community/cli-server-api package to v20.0.0 or later.
  • CLI Upgrade: Alternatively, update the main React Native CLI to v20.0.0+, which includes the patched component.

🛡 Temporary Mitigations/Workarounds

These steps should be implemented immediately until the patch can be deployed:

  1. Bind Metro to Localhost: Prevent remote connections by starting the development server with the --host flag.
    • Example: npx react-native start --host 127.0.0.1
  2. Restrict Network Access: Use firewall rules or network access controls (ACLs) to block incoming connections to the Metro port (default 8081) from all untrusted external sources.
  3. Monitor & Audit: Watch development logs for suspicious POST requests targeting the /open-url endpoint.

6. References

Read more