### 哪些漏洞可以用 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 可以通过分析程序的输出或返回值,来检测程序是否泄露了不应被公开的敏感信息,比如内存地址或调试信息