我刚刚开始学习 fuzzing,并制作了一个愚蠢的 fuzzer,它将 pdf 文件中的几个随机字节更改为随机值,打开它并检测 Acrobat Reader 是否崩溃。使用这种方法可以找到哪些类型的错误?
我假设如果愚蠢的模糊器碰巧在正确的位置插入格式字符串参数,则可以发现格式字符串漏洞。我还假设可以找到整数溢出。但还能找到什么?
是否有可能找到缓冲区溢出?由于我只更改了几个随机字节,我假设溢出缓冲区的机会实际上很小或没有。还是我错了?
我刚刚开始学习 fuzzing,并制作了一个愚蠢的 fuzzer,它将 pdf 文件中的几个随机字节更改为随机值,打开它并检测 Acrobat Reader 是否崩溃。使用这种方法可以找到哪些类型的错误?
我假设如果愚蠢的模糊器碰巧在正确的位置插入格式字符串参数,则可以发现格式字符串漏洞。我还假设可以找到整数溢出。但还能找到什么?
是否有可能找到缓冲区溢出?由于我只更改了几个随机字节,我假设溢出缓冲区的机会实际上很小或没有。还是我错了?
我刚刚开始学习 fuzzing,并制作了一个愚蠢的 fuzzer,它将 pdf 文件中的几个随机字节更改为随机值,打开它并检测 Acrobat Reader 是否崩溃。使用这种方法可以找到哪些类型的错误?
没有任何。这种“愚蠢的”模糊测试的覆盖范围非常有限。如果该应用程序实际上只是因为输入中的几个字节随机更改而崩溃,我会感到非常惊讶。即使模糊器每秒尝试数百万个样本,情况也会如此。但是,您还说您的 fuzzer打开它并查看它是否崩溃。这只会得到什么,每秒尝试几次?每隔几秒试一次?甚至不值得。
顺便一些专业的模糊器的工作是产卵的过程,暂停其内存状态的权利之前,它是要分析目标数据(跳过引导状态),然后恢复它。如果它在几十毫秒内没有崩溃,它将恢复到之前的暂停状态。这允许以最慢的每秒数百次或最快的速度进行数万次模糊测试。
我假设如果愚蠢的模糊器碰巧在正确的位置插入格式字符串参数,则可以发现格式字符串漏洞。我还假设可以找到整数溢出。但还能找到什么?
这取决于解析器的工作方式。如果没有 Acrobat Reader 源代码,我什至无法开始回答这个问题。缓冲区溢出、字符串格式漏洞、整数溢出、逻辑错误等都是可能的。您还必须注意,并非所有漏洞都很容易被发现,因为输入的某些部分可能会受到校验和、复数幻数的保护,或者可能会被压缩。
想象一下,您有一个使用简单校验和保护的字段。随机更改导致冲突的可能性非常低,因为这是校验和的设计目的,因此可能永远不会采用易受攻击的代码路径。然而,实际的利用可以简单地确保校验和是有效的。这是新用户模糊 rar 格式的常见问题。整个文件都覆盖着校验和,所以无论某人做了多少天真的模糊测试,它都不会崩溃。当校验和代码被删除时,它变得非常有问题并且很容易崩溃。为避免此问题,您必须了解格式并删除校验和代码,或确保您的输入始终使用正确的校验和。
是否有可能找到缓冲区溢出?由于我只更改了几个随机字节,我假设溢出缓冲区的机会实际上很小或没有。还是我错了?
如果您更改一个最终指定缓冲区大小的值,那么即使您不更改缓冲区的大小,它仍然可能导致溢出。例如,假设一个内存内容here is some text17
。这由缓冲区here is some text
和大小组成17
。修改大小以使其较小的排列将导致缓冲区在处理后溢出。现在 Acrobat Reader 不太可能有这么明显的东西,但一个错误可能会在内部产生类似的结果。我可以想象几种可能性。
专业的 fuzzer 不只是向程序抛出随机输入以查看它是否崩溃。他们以可能导致目标行为变化的特定方式修改输入。该程序使用插入的特殊代码进行编译,使其在每个分支处向 fuzzer 报告其内部状态,从而允许 fuzzer 知道给定输入何时导致采用不同的代码路径,即使其外部行为没有改变。这是最流行的通用模糊器之一AFL使用的技术。它足够智能,可以凭空创建有效的 JPEG 文件,只需检查 JPEG 解码器在输入时的状态即可。
为了编写一个能发现现实错误的模糊器,你需要使用像 AFL 这样能够自动分析格式的二进制工具,或者编写一个特定于应用程序的格式感知模糊器(即一个深入了解PDF 格式的细节,并且能够基于每个语法关键字而不是每个字节创建排列)。
我认为这种方法不会帮助找到此范围内的任何漏洞,因为 Adobe PDF 格式非常复杂。您不太可能在合理的时间内实现良好的代码覆盖率。
相反,请查看PDF 格式和 Adobe 扩展的参考,然后开始为您感兴趣的特定部分编写测试。(这可能会引导您了解可以嵌入的其他文件格式的规范。)如果您关注特定的实现细节,您可以很好地使用字节翻转。