我相信最近泄露的消息是,美国国家安全局有一长串针对各种软件的零日漏洞利用列表“以备不时之需”,即:只要它对他们有用。
问题是,他们如何找到这些零日?是否有人必须亲自坐在电脑前并尝试一大堆随机的事情(即:远程代码执行在 PDF 中的脚本内以 base64 编码),或者是否有自动化系统可以主动渗透测试软件的漏洞权限提升或远程代码执行在哪里可以工作?
我相信最近泄露的消息是,美国国家安全局有一长串针对各种软件的零日漏洞利用列表“以备不时之需”,即:只要它对他们有用。
问题是,他们如何找到这些零日?是否有人必须亲自坐在电脑前并尝试一大堆随机的事情(即:远程代码执行在 PDF 中的脚本内以 base64 编码),或者是否有自动化系统可以主动渗透测试软件的漏洞权限提升或远程代码执行在哪里可以工作?
零日漏洞的发现方式与任何其他类型的漏洞完全相同。是什么让安全漏洞成为“零日”完全取决于谁知道漏洞的存在,而不是任何其他技术特征。
漏洞通常是由好奇的人发现的,他们注意到一个时髦的行为,或者想象一个可能的错误,然后尝试看看程序员是否上当了。例如,我可以想象任何处理字符串内容并努力不受大小写差异影响的代码(即处理“A”等同于“a”)在土耳其计算机上执行时可能会遇到问题(因为在土耳其语言中, “I”的小写字母是“ı”,而不是“i”)这可能会导致有趣的错误,甚至是安全漏洞(例如,如果系统的某些部分以区域设置敏感的方式检查字符串等价,而其他部分则不会) . 因此,我可以尝试使用土耳其语言环境配置我的计算机,
部分错误搜索可以通过尝试大量“不寻常的组合”来自动化。这称为模糊测试。作为第一步,它可以帮助找到触发崩溃的输入组合;任何导致目标系统崩溃的事情都应该被调查,因为崩溃通常意味着内存损坏,而内存损坏有时会被滥用到远程代码执行等漂亮的事情上。然而,这样的调查仍然必须由人脑来完成。
(如果有一种全自动的方法来检测安全漏洞,那么软件开发人员将使用它来生成无错误的代码。)
为了补充 Thomas Pornin 的出色答案,通常通过源代码审计、逆向工程和模糊测试(或模糊测试)发现零日漏洞。
技术的选择通常取决于手头可用的信息。例如,如果软件是开源的,那么筛选源代码并寻找漏洞是首选方法。通过源代码审计发现的漏洞通常更容易被利用,因为您可以通过查看源代码来检查和理解所有执行分支。源代码审计的过程可以像 grep 一样简单地查找危险的函数调用(如 strcpy),也可以像自动代码覆盖测试一样复杂,寻找每个分支代码的执行和分析。
如果源代码不可用,漏洞研究人员的下一个选择是对应用程序进行逆向工程并分析低级代码。当通过调试器或更优选地通过诸如 IDA 的反编译器分析应用程序时,代码块和汇编助记符被映射到易于分析的相对高级的语言例程结构。然后,漏洞研究人员可以跟踪执行流程并静态或动态分析行为以发现不同的安全漏洞。例如,分配一个固定大小的缓冲区,然后将用户控制的输入复制到分配的缓冲区中,通常意味着它可以通过缓冲区溢出漏洞利用。
在软件中发现新漏洞的最后一种方法是通过模糊测试。这也可以认为是通过暴力破解发现的错误,因为随机输入会生成并提供给应用程序的所有可用输入接口,希望特制的字符串(例如过长的字符串或带有特殊字符的字符串)可以导致软件崩溃。一旦软件崩溃,模糊测试就会停止,让漏洞研究人员分析应用程序崩溃的输入。如果可以可靠地触发崩溃(例如,每次提供给应用程序的特定字节集导致崩溃时)并且执行流程可以转移到可执行内存中的用户控制数据,则该错误被归类为远程代码执行错误。否则,