任何基于Unix的操作系统都配备了sudo命令,允许预期需要临时提升root权限的用户执行操作。Sudo提供了一个关键功能,如果被滥用,可能会导致系统安全性和可靠性的损害。由于其在整个操作系统中的重要性,sudo的源代码经常受到测试和代码审查。这些审查发现了一个基于堆的溢出漏洞,命名为CVE-2021-3156,令人惊讶的是,这个漏洞已经隐藏了近10年。即使是模糊测试技术——最常用的漏洞发现技术之一——也未能在此之前发现它。在本文中,我们详细分析了CVE-2021-3156 sudo漏洞,从缓冲区溢出漏洞开始,一直到如何利用它来获取root shell,即使是非特权用户或不被允许使用sudo命令的用户也可以做到。
在Visualization目录中,我们提供了几个脚本,用于可视化参数在有无反斜杠字符时的解析方式,并分析环境变量如何影响堆布局,以便进一步理解所提出利用的结构。
在Fuzzing目录中,包含对sudo易受攻击版本执行模糊测试所需的文件。我们还报告了如何进行模糊测试,以及如何解决阻止AFL开箱即用的问题,从而解释该漏洞为何隐藏了近10年。
在Exploit目录中,包含对另一个易受攻击的sudo版本执行攻击所需的文件。我们通过环境变量利用内存填充来执行堆风水(heap feng shui),并覆盖service_user对象的名称,以便执行我们自己的代码而非加载库。
在Patch目录中,有一个overflow_simulation_patch.c脚本,用于模拟溢出的行为,并使用我们编写的额外代码进行修补。由于Sudo项目的开发者决定修复漏洞流程而非代码本身,我们展示了一种不同的方法,以及如何只用几行代码修复它。