CVE-2026-109237 Overview
CVE-2026-109237 is an untrusted-config gate bypass in Crawl4AI versions 0.9.0 through 0.9.3. Non-admin API clients can smuggle forbidden configuration objects past server-side validation by wrapping them in dict-type wrappers. The weakness falls under CWE-502: Deserialization of Untrusted Data. Attackers abuse the /config/dump endpoint to send a laundered LLMConfig where api_token references an environment variable. The server resolves the reference and returns the value, exposing SECRET_KEY and provider API keys. With SECRET_KEY in hand, an attacker forges admin JSON Web Tokens (JWTs) and takes over the application.
Critical Impact
Low-privileged API clients can read server environment variables and forge administrative JWTs, resulting in full application compromise and theft of third-party LLM provider credentials.
Affected Products
- Crawl4AI 0.9.0
- Crawl4AI versions after 0.9.0 and before 0.9.4
- Deployments exposing the /config/dump endpoint to authenticated non-admin users
Discovery Timeline
- 2026-10-12 - CVE-2026-109237 published to the National Vulnerability Database (NVD)
- 2026-10-15 - Last updated in NVD database
Technical Details for CVE-2026-109237
Vulnerability Analysis
Crawl4AI enforces an allow/deny policy over configuration objects submitted by API clients. The policy inspects the top-level type of the submitted payload to decide whether sensitive classes such as LLMConfig are permitted. The gate check does not recurse into dict-type wrappers that contain nested config descriptors. When a client wraps a forbidden object inside a permitted dict container, the server unwraps and reconstructs the nested object after the policy check has passed. The reconstructed LLMConfig honors environment-reference tokens in fields such as api_token. The /config/dump endpoint then returns the resolved object back to the caller, which includes the secret value pulled from the host environment.
Root Cause
The gating logic validates untrusted input at a single boundary without recursive type checks on nested containers. This is a classic deserialization flaw [CWE-502] in which trust decisions are made on the outer object type while inner objects are instantiated with full privileges. Environment reference resolution is performed server-side without an authorization check that matches the sensitivity of the resolved value.
Attack Vector
An authenticated non-admin client sends a POST request to /config/dump with a payload that wraps an LLMConfig inside a dict wrapper. The nested LLMConfig sets api_token to an environment reference such as env:SECRET_KEY or env:OPENAI_API_KEY. The server bypasses the forbidden-type gate, resolves the reference, and returns the plaintext secret in its response. The attacker uses the leaked SECRET_KEY to sign a JWT with the admin role claim and submits it to privileged endpoints. Exploitation requires only network access and valid low-privilege credentials; no user interaction is needed.
Refer to the GitHub Security Advisory GHSA-5w5p-vcv6-mm3f and the VulnCheck Advisory on Config Bypass for additional technical context.
Detect Identity Attacks the Moment Authentication Fails
Singularity™ Identity surfaces credential misuse, lateral movement, and privilege escalation in real time, so you can contain the breach before it spreads.
Stop Identity AttacksDetection Methods for CVE-2026-109237
Indicators of Compromise
- POST requests to /config/dump originating from non-admin API tokens, especially those containing nested dict wrappers around LLMConfig or similar config descriptors.
- Response bodies from /config/dump that include plausible secret material such as values matching patterns for SECRET_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, or similar provider keys.
- Sudden appearance of newly issued admin JWTs whose iat or kid claims do not correlate with any legitimate administrative login event.
- Outbound requests to LLM provider APIs from unexpected source accounts or at anomalous volumes shortly after a /config/dump call.
Detection Strategies
- Deploy application-layer logging that captures full request bodies for /config/dump and alert on payloads containing nested LLMConfig, api_token, or env: reference strings.
- Correlate /config/dump responses with subsequent JWT issuance and privileged API calls from the same client identifier within a short time window.
- Baseline normal callers of /config/dump and alert on new principals, user agents, or IP ranges invoking the endpoint.
Monitoring Recommendations
- Forward Crawl4AI access logs and application logs to a centralized analytics platform with retention sufficient to reconstruct attacker sessions.
- Monitor host-level process telemetry for Crawl4AI containers reading /proc/self/environ or dumping environment state during request handling.
- Track usage and billing metrics on connected LLM provider accounts to catch credential abuse that follows a successful leak.
How to Mitigate CVE-2026-109237
Immediate Actions Required
- Upgrade Crawl4AI to version 0.9.4 or later on every host and container image.
- Rotate SECRET_KEY, all LLM provider API keys, and any other secrets exposed via environment variables on affected deployments.
- Invalidate all outstanding JWTs by rotating the signing key and forcing re-authentication for every client.
- Audit /config/dump request logs since deployment of 0.9.0 for payloads containing nested config wrappers or env: references.
Patch Information
The maintainers fixed the gate bypass in Crawl4AI 0.9.4. See the GitHub Security Advisory GHSA-5w5p-vcv6-mm3f for the full remediation details and patched release notes.
Workarounds
- Block or restrict access to the /config/dump endpoint at a reverse proxy or API gateway so that only administrative principals can reach it.
- Remove sensitive values from the Crawl4AI process environment and inject them through a secrets manager that is not addressable via env: references.
- Disable or filter environment-reference resolution in configuration payloads submitted by non-admin clients.
# Example NGINX restriction for /config/dump until upgrade to 0.9.4
location = /config/dump {
allow 10.0.0.0/24; # admin management subnet
deny all;
proxy_pass http://crawl4ai_upstream;
}
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

