| 项目 | 详情 |
|---|
| CVE 编号 | CVE-2026-XXXXX |
| 影响产品 | Mastodon(流媒体服务器) |
| 影响版本 | ≤ 4.5.9 |
| 漏洞文件 | streaming/index.js 第 188–206 行 |
| 漏洞类型 | HTTP 响应头注入 / CRLF 注入 |
| CWE | CWE-74:输出特殊元素不当中和 |
| CVSS 3.1 | 6.5(中危) |
| 攻击方式 | 网络远程,无需认证 |
当 WebSocket 升级请求鉴权失败时,Mastodon 流媒体服务器在 streaming/index.js 第 188–206 行捕获异常,并通过 socket.end() 手动拼接 HTTP 响应字符串的方式,将 errorMessage 直接写入 X-Error-Message 响应头,未对回车符(\r)和换行符(\n)进行过滤。
攻击者可利用 \r\n 序列注入任意 HTTP 响应头,或执行 HTTP 响应拆分攻击。
// streaming/index.js 第 188–206 行
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 // ← 用户可控数据直接写入原始 HTTP 头
};
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://<目标>:4000/api/v1/streaming/user
返回 HTTP 401,X-Error-Message: Missing access token,说明存在漏洞。
const sanitizedMessage = String(errorMessage || '')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A');
res.writeHead(statusCode, headers);
res.end();
| 日期 | 事件 |
|---|---|
| 2026-04-22 | 漏洞发现,PoC 编写完成 |
| 2026-04-22 | 通知官方(邮件投递失败) |
| 2026-04-22 | 提交 MITRE CVE / VDB |
免责声明:本 PoC 仅供安全研究和教育目的使用。未经授权禁止使用。