最近sudo发现缓存溢出提权漏洞严重CVE-2021-3156,这很正常。不正常的是,这个漏洞已经潜伏了10年。为什么要发现10年?如果需要多长时间才能找到常规的测试方法?有人做到了Fuzz测试,请和虫虫一起学习过程。
概述
在本文试验中使用AFL模糊器。AFL模糊器(American Fuzzy lop)是面向安全的模糊器,AFL使用新型编译时检测和遗传算法,自动发现干净有趣的测试用例,这些用例会在目标二进制文件中触发新的内部状态。用这样的方法可以大大改善了模糊代码的功能覆盖范围。
AFL模糊器生成的紧凑合成语料库也可以用来复制其他测试人员更多的人力或资源。
测试准备
sudo是setuid二进制文件,以root用户随机输入运行潜在错误的二进制文件并不是最安全的方法。虚拟机环境用于设置测试,以避免任何潜在的意外系统损坏。并选择最近一个涉及漏洞的sudo版本sudo 1.9.5.p1。
AFL旨在将输出生成到文件或stdout但要模糊命令行参数。因此,需要自行修复sudo,忽略实际的argv并将其改为从stdin。
AFL它提供了一个能的提供者argv-fuzz-inl.h:
示例argv-fuzz-inl.h从stdin读取NUL分离参数。sudo同时提供单个二进制文件sudo和sudoedit实用程序,需要测试两者fuzzer公开argv[0]。输入代码argv-fuzz-inl.h这个操作不会执行,需要修复:
sudo补丁本身很简单,只需要main的开头连接AFL_INIT_ARGV即可:
快速测试表明sudo/sudoedit选择无法从stdin由于某种原因,传递的测试用例正常工作__progname。快速解决方案:
最后,设置不需要等待密码输入,因此只需要无条件失败:
因为某种原因afl-gcc工具不能正常工作,因此基于工具使用LLVM的工具。需要重写CC为./configure:
两个简单的测试用例用于测试,两个可用的实用程序用于调用:
准备就绪后,四个开始并行模式AFL例子。半小时后,出现了一个例子。crash:
结果:
确实在sudoedit -s崩溃了。假设4个例子并行运行,大约2小时CPU时间。2小时CPU可以测试时间setuid发现严重的安全漏洞。
总结
为什么在十年内发现如此严重的问题,以及其他重要的基础系统是否也存在类似的潜在漏洞。我不知道以前是否有人对sudo做过模糊测试或社区粗心大意,只测试过sudo,遗漏了不太引人注目的东西sudoedit了。
但无论如何,需要指出的是,在广泛使用的实用程序中,使用快速使用模糊测试程序仍然存在严重错误。