Jun 18, 2026·6 min read·6 visits
Unauthenticated remote command injection via Chromium process-replacement switches in Crawl4AI <= 0.8.9.
A critical unauthenticated remote code execution vulnerability exists in Crawl4AI versions up to 0.8.9. The flaw is caused by improper neutralization of command arguments passed to the Chromium process execution engine via the browser_config.extra_args parameter, enabling remote attackers to execute arbitrary shell commands inside the container.
Crawl4AI is an open-source, LLM-friendly web crawling and scraping library designed to be deployed as a self-hosted API server within Docker containers. To orchestrate headless browsing, Crawl4AI relies on Playwright to spawn instances of Chromium. The API server exposes several endpoints, such as /crawl, /crawl/stream, and /crawl/job, which allow remote users to configure and trigger crawling sessions.
In versions up to and including 0.8.9, the API server was unauthenticated by default. It accepted a JSON payload containing a BrowserConfig object. This object included an optional extra_args parameter designed to allow users to supply custom arguments to the Chromium browser process.
Because the API did not validate or restrict these arguments, remote unauthenticated attackers could inject specific command-line switches. This allowed the execution of arbitrary shell commands within the Docker container, bypassing intended boundaries.
The root cause of this vulnerability lies in the combination of CWE-88 (Improper Neutralization of Argument Delimiters in a Command) and CWE-94 (Improper Control of Generation of Code). The Crawl4AI API server deserialized incoming JSON payloads directly into configuration models without validating the safety of the keys or values within browser_config.extra_args.
When a crawl task is initiated, the application constructs a command to spawn Chromium via Playwright, appending the elements of extra_args directly to the command-line parameters. Chromium features several diagnostic switches that specify the path of helper binaries or prefix execution commands for subprocesses. Attackers can leverage these switches to hijack process execution.
By supplying arguments such as --utility-cmd-prefix or --renderer-cmd-prefix alongside --no-zygote, the attacker instructs the parent Chromium process to prepend a custom command wrapper whenever it spawns a helper utility or renderer process. Consequently, when Chromium forks to initialize these processes, it executes the injected shell command instead of or before the standard executable. This design flaw allows input data to influence the executable control path of the host system.
To address this vulnerability, the development team introduced a strict trust-boundary model in version 0.9.0, implemented in commit 60886d1a0c52682e4c83a7cef9dfac417fff6bd2. The patch defines two levels of configuration trust: TRUSTED for local Python SDK calls and UNTRUSTED for external network-facing API requests.
# Inside crawl4ai/async_configs.py
class Provenance(Enum):
TRUSTED = "trusted"
UNTRUSTED = "untrusted"The implementation restricts several critical parameters. Any configuration received via an untrusted request that includes blocked parameters, such as extra_args, raises an explicit UntrustedConfigError.
# Forbidden fields for untrusted network requests
UNTRUSTED_FORBIDDEN_FIELDS = {
"BrowserConfig": {
"proxy", "proxy_config", "extra_args", "user_data_dir", "channel",
"chrome_channel", "cdp_url", "debugging_port", "host", "storage_state",
"cookies", "headers", "init_scripts", "browser_context_id", "target_id",
},
"CrawlerRunConfig": {
"js_code", "js_code_before_wait", "c4a_script", "deep_crawl_strategy",
"proxy_config", "proxy_rotation_strategy", "proxy_session_id",
"proxy_session_ttl", "proxy_session_auto_release",
"fallback_fetch_function", "experimental", "base_url", "simulate_user",
"override_navigator", "magic", "process_in_browser", "shared_data",
"session_id",
},
}This approach ensures that potentially dangerous settings cannot be manipulated by external payloads. The API server returns a 400 Bad Request error if a forbidden field is detected, preventing argument injection or code execution via the network API. The architecture decouples internal process-level options from network-accessible interfaces, establishing a robust security barrier.
An attack is initiated by submitting an unauthenticated HTTP POST request to /crawl or related endpoints on an exposed Crawl4AI API instance. The payload must target the browser_config.extra_args array to supply the malicious Chromium parameters. Because the API server does not require authentication in its default configuration, any network-adjacent attacker can reach these endpoints.
The attack leverages the --no-zygote flag to disable the standard Chromium process template system. This forces the browser to spawn individual helper processes directly, facilitating the invocation of the command execution prefixes. The attacker specifies the target command inside parameters like --utility-cmd-prefix or --renderer-cmd-prefix.
{
"url": "https://example.com",
"browser_config": {
"extra_args": [
"--no-zygote",
"--utility-cmd-prefix=bash -c 'id > /tmp/rce_proof'"
]
}
}When the application processes this crawl request, Playwright launches Chromium with the specified arguments. Chromium then executes the prefix value using the system shell, running the command under the privileges of the container's runtime user. This allows full command execution within the context of the running container.
The security impact of this vulnerability is critical, as reflected in its CVSS score of 10.0. Successful exploitation yields immediate, unauthenticated remote code execution with the privileges of the container's executing user (typically appuser or root).
Once code execution is achieved, an attacker can access the container's file system, environment variables, and any integrated secrets or API keys used by the application. This could expose external database credentials, LLM API tokens, or cloud service credentials, depending on how the container environment is configured.
Additionally, because the compromised process runs inside a container, the attacker can attempt to perform lateral movement or network scanning against internal resources accessible from the container network. While the container context limits direct access to the host kernel, typical container escapes or environment compromises remain potential secondary vectors.
The primary remediation path is to upgrade Crawl4AI to version 0.9.0 or later. This version implements the necessary trust boundary checks, preventing the usage of extra_args via the API endpoints.
For environments where an immediate upgrade is not feasible, security administrators should configure the CRAWL4AI_API_TOKEN environment variable. This enforces token-based authentication on all API routes, limiting exposure to authenticated clients. Access to the API port (default 11235) should also be restricted using network firewalls or bound specifically to localhost.
Detection can be accomplished by monitoring container process creation events. Security logs should be analyzed for instances where chrome or chromium processes spawn shells such as /bin/sh or /bin/bash as child processes. Network intrusion detection rules can also scan incoming API traffic for payloads containing forbidden flags like --utility-cmd-prefix or --renderer-cmd-prefix.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H| Attribute | Detail |
|---|---|
| CWE ID | CWE-88 / CWE-94 |
| Attack Vector | Network |
| CVSS Score | 10.0 (Critical) |
| Exploit Status | PoC Available |
| Affected Component | Docker API server request parsing |
| Patched Version | 0.9.0 |
The software constructs a command line for an external execution using input parameters, but fails to prevent input from adding additional arguments or modifying existing ones.
An authentication bypass in the SiYuan personal knowledge management system before version 3.7.0 exposes a dynamic icon rendering endpoint. This endpoint processes client-supplied Go template directives. By submitting a crafted request, an unauthenticated remote attacker can leverage registered database template functions to execute arbitrary read-only SQL queries and exfiltrate workspace contents.
CVE-2026-54069 is a critical authentication bypass vulnerability in the SiYuan Note personal knowledge management system. The flaw is located in the HTTP server's middleware handling API authorization, which unconditionally trusts requests carrying a 'chrome-extension://' scheme in the Origin HTTP header, granting administrative access without validating API tokens.
CVE-2026-54089 is a critical authentication bypass vulnerability in File Browser affecting instances configured with proxy-based authentication. An unauthenticated remote attacker with direct network access can impersonate arbitrary users or register new accounts by spoofing configured HTTP headers.
The malicious Cargo package 'exploration' was uploaded to the crates.io registry. During compilation or package import, the crate executes code designed to establish an outbound TCP/HTTP connection, download an external second-stage binary, and execute the binary locally on the host machine. This creates an unauthenticated remote code execution vector impacting developer environments and continuous integration pipelines.
CVE-2026-54088 is a critical command injection vulnerability in File Browser prior to version 2.63.6. When Hook Authentication is enabled, the application interpolates unsanitized credentials into a shell command, allowing unauthenticated remote code execution.
An authenticated remote code execution vulnerability exists in NotrinosERP (versions up to and including 1.0.0) within the Human Resource Management (HRM) module. Users with employee management permissions can upload arbitrary file types, including PHP scripts, which are written directly to a web-accessible directory. This allows for arbitrary code execution in the context of the web-server user.