← Back to CVE Explorer

CVE-2026-86146

Full vulnerability record from the local CVENow database.

Description

Inconsistent interpretation of HTTP requests (HTTP request/response smuggling) in the bundled HTTP/1.1 parser of Apache bRPC (version < 1.18.0) on all platforms allows remote attackers to smuggle requests and inject headers when bRPC is deployed behind a proxy or load balancer that parses the same bytes differently. Root Cause: The bRPC fork of http-parser accepts and acts on several HTTP/1.1 header forms that a conforming front-end either rejects or interprets differently, so the framing or the header set of a message can differ between the front-end and bRPC: 1. A space before the colon of framing headers (e.g. Content-Length : 5) is accepted; the value still drives bRPC's framing while the reported field name contains the trailing space. 2. Interior spaces inside a Content-Length value (e.g. Content-Length: 1 3) are skipped, so bRPC reads 13 where a front-end reads 1 or rejects the message (same class as CVE-2022-32213 in Node.js). 3. Obsolete line folding (obs-fold, RFC 7230 3.2.4) of Content-Length and Transfer-Encoding values is accepted, so a folded framing value drives bRPC's framing while a front-end that does not unfold sees a different message. 4. Chunked trailer fields are fed to the same header callbacks as the header section and are merged into the header map like real headers. A front-end only inspects the header section, so any chunked request can smuggle fields such as Authorization or X-Forwarded-For past it. 5. Transfer-Encoding lists with optional whitespace after a comma (e.g. Transfer-Encoding: gzip, chunked) are not recognized as chunked: such requests are rejected, and responses are read until connection close instead of as chunked, causing response desync. Affected Scenarios: bRPC server or client communicating over HTTP/1.1 with a front proxy, load balancer, or any peer that parses the message independently. An attacker able to send requests through the front-end can desynchronize the two parsers to smuggle requests, forge headers (e.g. Authorization, X-Forwarded-For) via chunked trailers, or desynchronize responses. How to Fix: (Choose one of the following options) 1. Upgrade bRPC to version 1.18.0, which fixes this issue. 2. Apply this patch: https://github.com/apache/brpc/pull/3521 Note: After applying the fix, the four header forms above are rejected by default and chunked trailers are dropped instead of merged into the header map. Two gflags are provided for compatibility: http_allow_obs_fold=true restores acceptance of folded Content-Length/Transfer-Encoding values, and http_strict_header_token=true additionally rejects spaces inside any header field name (not only the ones that decide framing). Legitimate clients that do not use these obsolete forms are unaffected.

Severity
HIGH
CVSS score
7.5 (v3.1)
Vulnerability status
Deferred
Source identifier
Published
2026-10-21 13:20:04.137000
Last modified
2026-10-30 15:16:56.480000
View original CVE JSON
{
  "id": "CVE-2026-86146",
  "sourceIdentifier": "[email protected]",
  "published": "2026-10-21T13:20:04.137",
  "lastModified": "2026-10-30T15:16:56.480",
  "vulnStatus": "Deferred",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "Inconsistent interpretation of HTTP requests (HTTP request/response smuggling) in the bundled HTTP/1.1 parser of Apache bRPC (version < 1.18.0) on all platforms allows remote attackers to smuggle requests and inject headers when bRPC is deployed behind a proxy or load balancer that parses the same bytes differently.\n\nRoot Cause:\nThe bRPC fork of http-parser accepts and acts on several HTTP/1.1 header forms that a conforming front-end either rejects or interprets differently, so the framing or the header set of a message can differ between the front-end and bRPC:\n1. A space before the colon of framing headers (e.g. Content-Length : 5) is accepted; the value still drives bRPC's framing while the reported field name contains the trailing space.\n2. Interior spaces inside a Content-Length value (e.g. Content-Length: 1 3) are skipped, so bRPC reads 13 where a front-end reads 1 or rejects the message (same class as CVE-2022-32213 in Node.js).\n3. Obsolete line folding (obs-fold, RFC 7230 3.2.4) of Content-Length and Transfer-Encoding values is accepted, so a folded framing value drives bRPC's framing while a front-end that does not unfold sees a different message.\n4. Chunked trailer fields are fed to the same header callbacks as the header section and are merged into the header map like real headers. A front-end only inspects the header section, so any chunked request can smuggle fields such as Authorization or X-Forwarded-For past it.\n5. Transfer-Encoding lists with optional whitespace after a comma (e.g. Transfer-Encoding: gzip, chunked) are not recognized as chunked: such requests are rejected, and responses are read until connection close instead of as chunked, causing response desync.\n\nAffected Scenarios:\nbRPC server or client communicating over HTTP/1.1 with a front proxy, load balancer, or any peer that parses the message independently. An attacker able to send requests through the front-end can desynchronize the two parsers to smuggle requests, forge headers (e.g. Authorization, X-Forwarded-For) via chunked trailers, or desynchronize responses.\n\nHow to Fix:\n(Choose one of the following options)\n1. Upgrade bRPC to version 1.18.0, which fixes this issue.\n2. Apply this patch:  https://github.com/apache/brpc/pull/3521 \n\nNote:\nAfter applying the fix, the four header forms above are rejected by default and chunked trailers are dropped instead of merged into the header map. Two gflags are provided for compatibility: http_allow_obs_fold=true restores acceptance of folded Content-Length/Transfer-Encoding values, and http_strict_header_token=true additionally rejects spaces inside any header field name (not only the ones that decide framing). Legitimate clients that do not use these obsolete forms are unaffected."
    },
    {
      "lang": "es",
      "value": "Interpretación inconsistente de solicitudes HTTP (smuggling de solicitudes/respuestas HTTP) en el analizador HTTP/1.1 incluido de Apache bRPC (versiones anteriores a 1.18.0) en todas las plataformas permite a atacantes remotos introducir solicitudes y inyectar encabezados cuando bRPC se despliega detrás de un proxy o balanceador de carga que interpreta los mismos bytes de forma diferente.\\n\\nCausa raíz:\\nEl fork bRPC de http-parser acepta y actúa sobre varias formas de encabezados HTTP/1.1 que un front?end conforme rechaza o interpreta de manera distinta, de modo que el encuadre o el conjunto de encabezados de un mensaje pueden diferir entre el front?end y bRPC:\\n1. Se acepta un espacio antes de los dos puntos de los encabezados de encuadre (p. ej., Content?Length : 5); el valor sigue determinando el encuadre de bRPC mientras que el nombre del campo reportado contiene el espacio final.\\n2. Los espacios internos dentro del valor de Content?Length (p. ej., Content?Length: 1 3) se omiten, de modo que bRPC lee 13 donde un front?end lee 1 o rechaza el mensaje (misma clase que CVE?2022?32213 en Node.js).\\n3. Se acepta el plegado de línea obsoleto (obs?fold, RFC 7230 3.2.4) de los valores de Content?Length y Transfer?Encoding, de modo que un valor de encuadre plegado determina el encuadre de bRPC mientras que un front?end que no lo despliega ve un mensaje diferente.\\n4. Los campos de remolque chunked se envían a los mismos callbacks de encabezado que la sección de encabezados y se fusionan en el mapa de encabezados como encabezados reales. Un front?end solo inspecciona la sección de encabezados, por lo que cualquier solicitud chunked puede introducir campos como Autorización o X?Forwarded?For.\\n5. Las listas de Transfer?Encoding con espacio opcional después de una coma (p. ej., Transfer?Encoding: gzip, chunked) no se reconocen como chunked: esas solicitudes son rechazadas y las respuestas se leen hasta el cierre de la conexión en lugar de como chunked, lo que provoca una desincronización de la respuesta.\\n\\nEscenarios afectados:\\nServidor o cliente bRPC que se comunican mediante HTTP/1.1 con un proxy frontal, balanceador de carga o cualquier par que analice el mensaje de forma independiente. Un atacante que pueda enviar solicitudes a través del front?end puede desincronizar los dos analizadores para introducir solicitudes, falsificar encabezados (p. ej., Autorización, X?Forwarded?For) mediante remolques chunked, o desincronizar respuestas.\\n\\nCómo solucionar:\\n1. Actualice bRPC a la versión 1.18.0, que corrige este problema.\\n2. Aplique este parche: https://github.com/apache/brpc/pull/3521\\n\\nNota:\\nDespués de aplicar la corrección, las cuatro formas de encabezado descritas anteriormente se rechazan por defecto y los remolques chunked se descartan en lugar de fusionarse en el mapa de encabezados. Se proporcionan dos gflags para compatibilidad: http_allow_obs_fold=true restaura la aceptación de valores plegados de Content?Length/Transfer?Encoding, y http_strict_header_token=true rechaza adicionalmente los espacios dentro de cualquier nombre de campo de encabezado (no solo los que determinan el encuadre). Los clientes legítimos que no utilizan estas formas obsoletas no se ven afectados."
    }
  ],
  "affected": [
    {
      "source": "[email protected]",
      "affectedData": [
        {
          "vendor": "Apache Software Foundation",
          "product": "Apache bRPC",
          "defaultStatus": "unaffected",
          "collectionURL": "https://github.com",
          "packageName": "apache/brpc",
          "packageURL": "pkg:github/apache/brpc",
          "versions": [
            {
              "version": "0",
              "lessThan": "1.18.0",
              "versionType": "semver",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV31": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "type": "Secondary",
        "cvssData": {
          "version": "3.1",
          "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "baseScore": 7.5,
          "baseSeverity": "HIGH",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "privilegesRequired": "NONE",
          "userInteraction": "NONE",
          "scope": "UNCHANGED",
          "confidentialityImpact": "NONE",
          "integrityImpact": "NONE",
          "availabilityImpact": "HIGH"
        },
        "exploitabilityScore": 3.9,
        "impactScore": 3.6
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-10-30T14:40:46.501949Z",
          "id": "CVE-2026-86146",
          "options": [
            {
              "exploitation": "none"
            },
            {
              "automatable": "yes"
            },
            {
              "technicalImpact": "partial"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "[email protected]",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-444"
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://lists.apache.org/thread/2pf15ojj0vr7rtx95677kgtl1mx3gdgb",
      "source": "[email protected]"
    }
  ]
}