### 哪些漏洞可以用 fuzz 检测到

内存安全漏洞

这是 Fuzzing 最擅长的领域，也是 Fuzzing 历史上发现最多高价值漏洞的类型。这些漏洞通常会导致程序崩溃、数据损坏或信息泄露

- 缓冲区溢出（Buffer Overflows）：当程序向一个固定大小的缓冲区写入的数据超出了其容量时，就会发生溢出。Fuzzer 可以通过生成超长字符串、大文件或超大数组等输入来触发这类漏洞
- 整数溢出（Integer Overflows）：当一个整数运算的结果超出其数据类型的最大值时，会发生溢出。Fuzzer 可以提供接近最大值或负数的输入，试图触发不正确的内存分配或边界检查绕过
- 空指针解引用（Null Pointer Dereference）：当程序试图访问一个空指针指向的内存时，会发生崩溃。Fuzzer 可以提供导致函数返回空指针的输入，例如不完整的协议数据包或畸形的文件头
- UAF（Use-After-Free）：当程序在释放一块内存后，仍然使用指向这块内存的指针时，就会发生 UAF。Fuzzer 可以通过提供复杂的、有状态的输入序列来触发这种时序性漏洞
- 双重释放（Double Free）：当程序两次释放同一块内存时，会引发严重后果。Fuzzer 可以提供导致程序进入异常逻辑的输入，从而触发重复的内存释放操作
- 格式化字符串漏洞（Format String Bugs）：当程序使用 `printf` 等函数，且格式化字符串可由用户控制时，攻击者可以利用它来读写内存。Fuzzer 可以尝试在输入中插入 `%s`, `%n`, `%x` 等格式符来检测这种漏洞

逻辑漏洞和异常情况

除了内存安全问题，Fuzzing 也可以用来发现更复杂的逻辑漏洞，尽管这通常需要更智能的 Fuzzer 或额外的检测机制

- 逻辑错误（Logical Bugs）：Fuzzer 可以通过提供畸形但不会导致崩溃的输入，来发现程序中不正确的逻辑。例如，一个输入可能导致数据库返回错误的结果，或者一个视频播放器无法正确解析视频帧
- 拒绝服务（Denial of Service, DoS）：当一个输入导致程序进入无限循环或消耗大量资源时，就会引发 DoS 攻击。Fuzzer 可以通过监控程序执行时间或资源消耗来检测这类问题
- 竞态条件（Race Conditions）：在多线程或多进程程序中，Fuzzer 可以通过随机化输入发送时间或使用多个线程来触发竞态条件，从而发现漏洞
- 权限绕过（Privilege Escalation）：Fuzzing 可以用来寻找程序在处理特殊输入时，是否会错误地提升权限
- 信息泄露（Information Leakage）：Fuzzer 可以通过分析程序的输出或返回值，来检测程序是否泄露了不应被公开的敏感信息，比如内存地址或调试信息