Summer @ Trail of Bits
这个夏天,我有幸作为高中实习生加入Trail of Bits工作。作为回报,我需要写一篇关于这次实习的博客文章。那么,事不宜迟,正文开始。
从模糊测试开始
夏季从模糊测试开始,这是一种我听说过但从未尝试过的技术。基本概念是向程序输入数据直到它崩溃,然后分析崩溃以发现漏洞。由于时间限制,自己编写模糊测试器并不现实,因此我开始在网上寻找现有的模糊测试工具。
我找到的第一个工具是CERT的故障观察引擎(FOE),它看起来很有前景。FOE有许多选项可以精确调整模糊测试器,使其能够针对特定目标进行定制。然而,我对FOE的体验并不稳定。对于某些目标,该工具运行一次后就停止,而不是持续运行(正如模糊测试器应该做的那样)。为了尽快开始,我决定转向其他工具。最终我选择了Linux的american fuzzy lop(AFL)和Windows的Microsoft MiniFuzz。它们各有优缺点。AFL最适合源代码,这限制了其适用范围为开源软件(虽然对闭源二进制文件有实验性支持,但速度明显较慢)。使用AFL从源代码编译允许模糊测试器确定代码覆盖率并在其界面中提供有用的反馈。MiniFuzz则相反:它运行在闭源Windows软件上,运行时提供的反馈很少。然而,崩溃数据非常有用,因为它提供了程序崩溃时所有寄存器的值——这是其他模糊测试器没有提供的功能。与AFL更复杂的编译设置相比,MiniFuzz非常即点即用。
分析崩溃
一旦模糊测试器在目标上设置并运行(例如Video Lan的VLC、Wireshark和Image Magick等),就开始分析崩溃。AFL在VLC中报告了几个崩溃。在验证这些崩溃是否可重现时,我注意到有几个是在尝试释放地址0x7d时出现的段错误。这让我感到奇怪,因为地址太小了,所以凭直觉我在十六进制编辑器中打开了崩溃输入文件并搜索‘7d’。果然,在文件深处有一个匹配项:0x0000007d。我将其改为容易识别的0x41414141,并再次运行文件。这次段错误发生在,你猜对了,0x41414141!受到可以从文件中控制程序地址的鼓舞,我开始寻找漏洞。这涉及一个漫长的过程,让我不情愿地熟悉了gdb和VLC源代码。该漏洞允许释放两个任意的、用户控制的指针。
漏洞详情
VLC将文件的不同部分读取为盒子(boxes),并在标记联合(tagged union)中分类。漏洞是由于文件中stsd盒子的大小被更改时产生的类型混淆,增加其大小使其认为后续的stts盒子是其子盒子。VLC通过根据盒子类型及其父类型索引函数表来读取文件中的盒子。但由于错误的父类型,它找不到匹配项,而是使用默认读取,将文件读取为vide类型盒子。后来,在释放盒子时,它仅通过检查自身类型来查找函数,因此触发了正确的函数。VLC尝试释放一个被读取为通用vide盒子的stts盒子,并直接从stts盒子释放两个地址。
QuickTime容器原子
CVE-2015-5949
控制两个释放的地址可能被利用,因此是时候报告漏洞了。我通过oCERT进行报告,他们非常帮助地与VLC开发者沟通修复问题并分配了CVE(CVE-2015-5949)。经过一些来回沟通后,问题得到解决,是时候转向新事物了。
转向Web安全
夏季过半,还有另一半时间学习新东西,我开始探索Web安全。我从一些CTF和NYU Hack Night中对此有一些背景,但我想获得更深入和实用的理解。与模糊测试容易上手不同,Web安全需要更多的事先知识。我花了一周时间尽可能从《Web应用程序黑客手册》和相应的MDSec实验室中学习。有了扎实的基础后,我将这些训练付诸实践。
漏洞赏金猎取
HackerOne有一个拥有漏洞赏金计划的公司的目录,这似乎是最好的起点。我按加入日期排序,选择了最新的公司——它们可能还没有被太多人查看过。使用不可或缺的工具BurpSuite,我探查了这些网站,寻找任何异常。通过查看ok.ru、marktplaats.nl和united.com等网站,我搜索了易受攻击的功能和安全问题,并提交了一些报告。我有一些成功,但它们仍在披露过程中。
安全评估
为了结束实习,我对纽约的一家科技初创公司进行了安全评估,应用了我所获得的技能。我发现了应用程序逻辑、访问控制和会话管理中的漏洞,其中最严重的是一个逻辑缺陷,对公司构成了重大的财务风险。然后我有机会在与公司的会议中展示这些漏洞。报告受到了好评,公司正在实施修复。
结束语
在Trail of Bits的这段经历非常棒。我在应用程序和Web安全方面打下了坚实的基础,这是一个很棒的工作场所。我将休息一周去看大学,但高年级时我会回来兼职工作。
如果你喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News