Jun 18, 2026·6 min read·11 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.
CVE-2026-58263 is a high-severity Mutation Cross-Site Scripting (mXSS) vulnerability affecting Jodit Editor prior to version 4.12.28. The flaw exists in Jodit's built-in clean-html sanitizer plugin, which fails to securely parse and sanitize nested elements containing foreign namespaces like MathML and SVG. Attackers can bypass sanitization by smuggling malicious payload elements inside rawtext container tags like style inside a MathML node, leading to DOM mutation and unauthenticated arbitrary script execution in the context of the user's browser session.
Jodit Editor versions prior to 4.13.6 are vulnerable to client-side Cross-Site Scripting (XSS). The clean-html plugin's sanitization routine performs case-sensitive lookups against uppercase-only element blacklists. When processing XML-based foreign namespaces such as SVG or MathML, DOM engines preserve the lowercase format of tags. Because Jodit's denyTags check fails to normalize tag casing, malicious script blocks nested inside foreign namespace elements completely bypass validation and serialize directly into the editor output.
A critical code injection vulnerability exists in Savon, a widely used SOAP client library for Ruby, prior to version 2.17.2. The vulnerability resides within the Savon::Model.all_operations module, where operation names fetched from a target Web Services Description Language (WSDL) document are dynamically evaluated via module_eval without sanitization. An attacker capable of manipulating the target WSDL document (e.g., through Man-in-the-Middle attacks, DNS hijacking, or Server-Side Request Forgery) can execute arbitrary Ruby code in the context of the parent application process.
An integer conversion overflow vulnerability exists in the XCF decoder of ImageMagick before version 6.9.13-51 and 7.1.2-26. The issue arises from mixed-type arithmetic that promotes calculation results to floating-point representations, causing an undefined cast back to integer. Under optimizing compilers, this undefined behavior results in bounds checks being bypassed, allowing out-of-bounds heap reads.
An authenticated file upload validation bypass vulnerability exists in the REDAXO CMS Mediapool addon in versions 5.18.2 through 5.21.0. Under permissive web server configurations, this allows authenticated users with media upload privileges to achieve remote code execution via multi-segment extension file uploads.
A critical SQL injection vulnerability exists in the @nocobase/plugin-notification-in-app-message plugin of NocoBase prior to version 2.0.61. The flaw is caused by direct string interpolation of user-controlled input into a Sequelize.literal() query, allowing authenticated users to execute stacked PostgreSQL queries and achieve remote code execution on the underlying database server.