2021年1月26日,Qualys发布了一个博客,描述了他们在sudo中的堆溢出漏洞CVE-2021-3156中的发现,他们将其命名为“ Baron Samedit”。
Sudo是许多不同Linux / Unix发行版中的中央工具,它允许用户运行具有更高安全性特权的程序。该组件通常包含在Linux,BSD,macOS,AIX,Solaris等操作系统中,并已安装在该组件中。

2021年1月26日,Qualys发布了一个博客,描述了他们在sudo中的堆溢出漏洞CVE-2021-3156中的发现,他们将其命名为“ Baron Samedit”。
Sudo是许多不同Linux / Unix发行版中的中央工具,它允许用户运行具有更高安全性特权的程序。该组件通常包含在Linux,BSD,macOS,AIX,Solaris等操作系统中,并已安装在该组件中。
使用Insure++分析Baron Samedit(CVE-2021-3156)
我将演示使用此漏洞的Parasoft Insure++内存过度读取和覆盖检测。 Insure++是一种内存调试工具,它使用获得专利的检测技术来快速识别泄漏和其他内存问题。
与使用传统的调试工具和技术相比,Insure++使发现,理解和修复此类错误变得容易得多。
Baron Samedit(CVE-2021-3156)漏洞概述
如果在外壳模式下使用命令运行易受攻击的sudo版本(v1.8.2 – v1.9.5p1),并且命令行参数以单个反斜杠结束,则由于un方式存在缺陷,导致user_args字符串的缓冲区溢出–对命令行参数进行转义。
当取消转义最后一个“ ”字符时,该函数将覆盖字符串的空终止符,从而导致缓冲区溢出。要彻底了解此漏洞,请查看原始的Qualys博客。当我们分析Insure++的结果时,我将介绍类似的详细信息。
使用Insure++进行设置
要在Insure++中复制该漏洞,我们需要下载sudo的漏洞版本并使用Insure++对其进行编译。最新的易受攻击版本sudo v1.9.5p1的源可在sudo 站上找到。解压缩源代码后,请确保Insure++位于PATH上,并在运行configure之前将CC设置为“ insure gcc”。
您也应该考虑设置一个不同的前缀,以不覆盖系统sudo(如果适用)。从这里运行make并像往常一样进行安装。
运行漏洞利用
Qualys文章提供了一个简单的概念证明命令,该命令演示了缓冲区溢出漏洞。如下:
sudoedit -s '' 'perl -e 'print "A" x 65536''
将sudoedit替换为您编译的路径并运行命令。

从malloc消息中可以看出,概念验证已正确执行。
分析结果
我们通过检查Insra窗口中的结果,来查看Insure++的发现。

我们可以看到,第一个内存错误是sudoers.c在971行发生的读取溢出。Insra告诉我们from指针读取了它所指向的两字节内存块之外的一个字节。
请注意,内存块是两个字节,因为第一个是”字符,第二个是空终止符。堆栈跟踪向我们显示这发生在set_cmnd()函数中。

下一个内存错误是从第972行的sudoers.c中的错误地址中读取的。由于from指针已经超出范围,正如我们在第一个内存错误中所看到的那样,任何使用from的索引访问都将是错误索引。

下一个内存错误是发生在第974行的读溢出。在这里,我们从to指针指向的缓冲区中取消引用越界指针并将其写入缓冲区。

下一个内存错误是与以前相同的语句中的写溢出。现在,Insure++在将缓冲区指向的指针写入缓冲区时触发。请注意,要指向的缓冲区的大小为65539字节。我们在概念证明中提供的溢出命令字符串是一个”字符,一个空格,65536个‘A’字符以及一个总计65539字节的隐式空终止符。

如果不检查”字符,则会发生下一个内存错误。为什么这现在导致写溢出于先前的内存错误已损坏指向指针的指向其内存块外部的指针,因此对该指针的所有后续写入操作都将导致写入溢出。

在这里,我们看到了最终的内存损坏,其中程序null终止了字符串。这绝对是正确的行为!但是,发生写溢出是因为to指针已损坏,并且已经指向了它应该位于的内存块之外。
结论
我们可以看到,Parasoft Insure++使此内存漏洞的分析变得更加容易。 我们能够快速确定读取和后续写入溢出的位置,知道涉及哪些变量,并查看无效指针如何影响后续的内存操作。 与良好的测试覆盖范围和模糊测试结合使用时,Insure++可以使许多复杂的内存错误更易于理解,诊断和修复。

标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!