HTTP request smuggling primitive: bare LF accepted as a request-line terminator in strict mode
Les mainteneurs répondent en général sous 6 jours
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 55/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- node.js, typescript
- Domaine
- backend-api-design, security
Piste de recherche
Commencez dans url.ts:176 et suivez url.exit.toHTTP09 jusqu'à headers_start, en comparant le chemin avec LF seul à la vérification LENIENT_OPTIONAL_CR_BEFORE_LF utilisée pour les autres terminateurs de la ligne de requête. Ajoutez une couverture de régression pour les requêtes sans version et avec version en mode strict, puis vérifiez que le mode strict rejette le cas du LF seul sans analyser les en-têtes HTTP/0.9 ni un corps.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
llhttp_set_lenient_optional_cr_before_lf documents that llhttp "would error when a LF is not
preceded by CR when terminating the request line", and that relaxing this exposes request smuggling.
url.ts:176 exits on a bare \n straight to the HTTP/0.9 adapter with no
LENIENT_OPTIONAL_CR_BEFORE_LF check — the only line terminator in the grammar that is ungated.
url.exit.toHTTP09 then continues into headers_start with no http_minor guard, so the message is
labelled HTTP/0.9 but headers and a Content-Length body are still parsed.
PoC
const http = require('http'), net = require('net');
const srv = http.createServer((req, res) => { // default parser, no options
let body = '';
req.on('data', c => body += c);
req.on('end', () => {
console.log(` ACCEPTED HTTP/${req.httpVersion} ${req.method} ${req.url}` +
` headers=${JSON.stringify(req.headers)} body=${JSON.stringify(body)}`);
res.end('ok');
});
});
srv.on('clientError', e => console.log(` REJECTED ${e.code}`));
const cases = [
['versionless + bare LF', 'GET /x\nHost: a\r\nContent-Length: 5\r\n\r\nhello'],
['versioned + bare LF', 'GET /x HTTP/1.1\nHost: a\r\n\r\n'],
];
srv.listen(0, async () => {
for (const [name, raw] of cases) {
console.log(name);
await new Promise(done => {
const c = net.connect(srv.address().port, '127.0.0.1', () => c.write(raw));
c.on('close', done); c.on('error', done);
setTimeout(() => c.destroy(), 300);
});
}
srv.close();
});
versionless + bare LF
ACCEPTED HTTP/0.9 GET /x headers={"host":"a","content-length":"5"} body="hello"
versioned + bare LF
REJECTED HPE_INVALID_VERSION
The same terminator is rejected when a version is present and accepted when it is absent. The
accepted message is reported as HTTP/0.9 yet carries headers and a body, neither of which HTTP/0.9
defines.
Scope, stated plainly: this path sets keepalive=0, and a pipelined follow-up request is rejected
with HPE_CLOSED_CONNECTION, so on its own it is a divergence from the documented strict-mode
guarantee rather than a demonstrated desync. Two requests parse on one connection only with
lenient_keep_alive also enabled.
- Langage dominant
- TypeScript
- Étoiles
- 2k
- Forks
- 236
- Merge moyen
- 5 j 2 h
- PR mergées (30 j)
- 1
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de nodejs/llhttp
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 6 jours
-
Difficulté 4/5 3-5 jours Accessibilité débutants 52/100
nodejs/llhttp#876 · 1 commentaire ·
Les mainteneurs répondent en général sous 6 jours
-
Not easy to get the number of methods llhttp hasPeut-être pris @official-burak l’a pris il y a 54 jours. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 54/100
Les mainteneurs répondent en général sous 6 jours
-
Should there be a way to block requests with multiple hosts or none are sent?Peut-être pris @Vizonex l’a pris il y a 201 jours. Ouverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 32/100
nodejs/llhttp#816 · 1 commentaire ·
Les mainteneurs répondent en général sous 6 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 45/100
nodejs/llhttp#782 · 2 commentaires · 4 réactions ·
Les mainteneurs répondent en général sous 6 jours
Toutes les issues de nodejs/llhttp
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
outline/outline#14348 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug needs-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: Agent import retains quotes in .env API keys followed by inline commentsPeut-être pris @yxr-2025 l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
elie222/rakazo#2322 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
awslabs/visual-asset-management-system#804 ·
Les mainteneurs répondent en général sous 1 jour
-
用户目录有单引号时,热加载时YAML解析崩溃Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
dsh-market/dsh-market#1027 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour