Python 处理 ctypes 中未经验证的小数时的漏洞

Python 编程语言 3.7.10 和 3.6.13 的修正版本现已推出,修复了一个漏洞 (CVE-2021-3177),该漏洞可能导致在使用 ctypes 机制调用 C 函数的处理程序中处理未经验证的浮点数时执行代码。 该问题还影响了 Python 3.8 和 3.9 分支,但它们的更新仍处于候选版本状态(计划于 1 月 XNUMX 日发布)。

该问题是由 ctypes 函数 PyCArg_repr() 中的缓冲区溢出引起的,该溢出是由于 sprintf 的不安全使用而发生的。 特别是,处理转换的结果 'sprintf(buffer, " ", self->tag, self->value.b)' 分配了 256 字节的静态缓冲区(“char buffer[256]”),而结果可能会超过该值。 要检查应用程序是否存在该漏洞,可以尝试传递值“1e300”,该值在由 c_double.from_param 方法处理时会导致崩溃,因为结果数字包含 308 个字符,无法容纳在一个字符串中。 256 字节缓冲区。 有问题的代码示例: import ctypes; x = ctypes.c_double.from_param(1e300); 代表(x)

该问题在 Debian、Ubuntu 和 FreeBSD 中仍未得到解决,但在 Arch Linux、Fedora、SUSE 中已得到修复。 在 RHEL 中,由于 FORTIFY_SOURCE 模式下的程序包组装不会出现该漏洞,该模式会阻止字符串函数中的此类缓冲区溢出。

来源: opennet.ru

添加评论