如何在野外发现漏洞(尤其是缓冲区溢出)?

逆向工程 开发
2021-07-03 03:49:18

我希望这个问题不是 RE 的 OT,但我很好奇通常如何发现漏洞。

当然,我知道公司正在进行代码审计以识别安全问题,但我怀疑此类审计的结果是否公开可用。寻找潜在攻击的另一种方法当然是考虑特定技术的细节并找到它的弱点(定时攻击可能就是这样)。

然而,在缓冲区溢出的情况下,我总是想知道人们是如何发现它的。我的意思是,如果有一些软件的发布,考虑到这是多少工作,逆向它并希望以这种方式找到缓冲区溢出对我来说似乎是无望的。如果您的软件由于某些特殊输入而崩溃,那么当然可以对其进行分析并可能导致安全漏洞。那么恶意软件作者是否只是在监视各种来源(错误报告站点或类似站点)以希望听到此类案例以进行调查?不知怎的,我不敢相信。

2个回答

闭源产品中的大多数漏洞都是通过模糊测试和静态逆向工程发现的。

考虑到这是多少工作,逆转它并希望以这种方式找到缓冲区溢出对我来说似乎毫无希望

通常,您不需要分析整个程序,而只需分析用户输入的入口点。是的,这仍然有很多工作要做,但如果结果富有成效,那才是最重要的。

那么恶意软件作者是否只是在监视各种来源(错误报告站点或类似站点)以希望听到此类案例以进行调查?

大多数恶意软件不是通过安全漏洞传播,而是通过简单的社会工程(“在这里,运行这个 .exe”)。对于确实利用安全漏洞的恶意软件,作者要么依赖Metasploit 的模块,要么从黑市购买漏洞利用程序。一个人既是漏洞发现者是恶意软件作者是极其罕见的

到目前为止,模糊测试发现大多数缓冲区溢出。逆向工程既可以帮助模糊测试,也可以自行发现其他问题。如果 fuzzer 知道“特殊”值会导致代码以不同方式分支或在没有它们存在的情况下更早退出解析,则它可以对这些值的包含进行加权,保证输入将通过某个点,或填写 CRC永远正确。

就其本身而言,如果您从想要找到哪种缺陷的想法开始,逆向工程可以非常好。例如,如果您认为使用 atoi() 的人不会期望负数,那么很容易在代码中找到这些位置并向前看数据会发生什么。另一个例子可能是从内存分配大小可能是整数溢出的假设开始,所以查看对分配的每次调用,看看它之前的计算是否有必要的检查。如果没有,请查看输入是否会影响分配以达到缺陷。

使用逆向工程的另一种方法是让其他人为您进行缺陷查找。只需比较供应商发布更新时修补的内容,您就会看到修复的内容。

正如 Jason 所说,编写恶意软件的人通常与发现缺陷甚至开发漏洞的人不同。