在进行模糊测试时,很容易出现许多错误(许多崩溃)。这使得有一种方法来对检测到的每个错误进行分类非常重要,这样我们就可以对它们进行优先级排序,并将我们的精力集中在最有可能代表可利用安全漏洞的那些上。
是否有任何工具可以自动化分类过程?我对 Linux 的工具最感兴趣。
在 Windows 上,我们有!exploitable分析器,它分析崩溃的程序执行以确定它是否代表可能可利用、可能不可利用等的错误。对于 Linux 有类似的东西吗?
在进行模糊测试时,很容易出现许多错误(许多崩溃)。这使得有一种方法来对检测到的每个错误进行分类非常重要,这样我们就可以对它们进行优先级排序,并将我们的精力集中在最有可能代表可利用安全漏洞的那些上。
是否有任何工具可以自动化分类过程?我对 Linux 的工具最感兴趣。
在 Windows 上,我们有!exploitable分析器,它分析崩溃的程序执行以确定它是否代表可能可利用、可能不可利用等的错误。对于 Linux 有类似的东西吗?
这是我所知道的最好的启发式方法。在Valgrind memcheck下运行程序,然后查看 Valgrind 输出的警告。我们可以将它们分为几类:
无效写入:查看地址。如果地址很小(例如,在 0x0 到 0xFFF 之间),那么这是一个 NULL 指针解引用:可能不可利用,低优先级。否则,这是一个写越界:潜在可利用,一个严重的高优先级错误。
无效读取:查看地址。如果地址很小(比如说,在 0x0 到 0xFFF 之间),那么这是一个 NULL 指针解引用:可能不可利用,低优先级。否则,这是一个越界读取:如果你不走运,可能会被利用,但通常这些错误是不可利用的;称之为中优先级。
无效的 free():这可能是一个双重释放错误,并且很有可能被利用。高优先级。
不匹配的 free() / delete / delete[]: 可能被利用,具体取决于具体情况。中优先级。
有条件的跳转或移动取决于未初始化的值:虽然有时可以利用此类错误,但绝对不能保证利用,而且可能不容易。通常,这些都是良性误报。中到低优先级。
系统调用参数...指向未初始化的字节或系统调用参数...包含未初始化的字节:同上。中到低优先级。
源和目标在...中重叠:极不可能被利用。低优先级。
内存泄漏:(例如,仍然可访问、绝对丢失、间接丢失、可能丢失):极不可能被利用。低优先级。
这是我所知道的最好的启发式方法。我不知道有什么工具可以为您实现它,但是自己编写脚本并不难。有谁知道用于 Linux/Unix 系统的更好的分类启发式或工具?
我喜欢使用peach fuzzing 平台。这包含一个测试工具,它将记录崩溃的内存转储并将它们链接到模糊测试用例。当流程崩溃时,测试工具将重新启动它并继续直到测试完成。
据我所知!exploitable非常独特。Valgrind 在确定像悬空指针这样的缺陷时很有用。 确定崩溃是否可利用的老式方法EIP
是查看, 0x41414141 始终是受欢迎的景象。但是,应用程序可能会在函数返回之前崩溃,因为您已经覆盖了堆栈上的指针。因此,即使对像 ebx 0x41414141 这样的通用寄存器的读/写崩溃也可能被利用,并且该进程在返回之前只是崩溃了。确保查看调用堆栈以查看它是否已损坏。
CERT 的开源 Linux 分类工具可用于分类通过模糊测试发现的错误。这些工具包括一个类似于 MSEC 的 !exploitable 的 GDB 扩展,但适用于 Linux。
http://www.cert.org/blogs/certcc/2012/04/cert_triage_tools_10.html
American Fuzzy Lop 的一些姊妹项目有一些可能有用的工具。特别是:
afl-crash-analyzer有一些自动化来帮助分析崩溃的测试用例,包括运行exploitable
GDB 脚本来测试崩溃是否可以利用。
crashwalk有一些自动化来测试哪些崩溃是可重现的,并使用exploitable
Linux 的 GDB 脚本对它们进行分类;它也有一个用于 Mac OS X 的类似脚本。