Lucene search

K
seebugRootSSV:3787
HistoryAug 06, 2008 - 12:00 a.m.

Python多个整数溢出漏洞

2008-08-0600:00:00
Root
www.seebug.org
22

0.011 Low

EPSS

Percentile

84.9%

BUGTRAQ ID: 30491
CVE(CAN) ID: CVE-2008-2315,CVE-2008-2316,CVE-2008-3142,CVE-2008-3143,CVE-2008-3144

Python是一种开放源代码的脚本编程语言。

Python中存在多个整数溢出漏洞,可能允许恶意用户导致拒绝服务或入侵有漏洞的系统。

  1. stringobject、unicodeobject、bufferobject、longobject、tupleobject、stropmodule、gcmodule、mmapmodule等核心模块中存在各种整数溢出。

  2. hashlib模块中的整数溢出可能导致不可信任的加密摘要结果。

  3. 在处理unicode字符串时unicode_resize()中的整数溢出可能在32位系统上导致错误的内存分配。以下是有漏洞的代码段:

174 static
175 int unicode_resize(register PyUnicodeObject *unicode,
176 Py_ssize_t length)
177 {
[…]
201
202 oldstr = unicode->str;
203 PyMem_RESIZE(unicode->str, Py_UNICODE, length + 1);
[…]
209 unicode->str[length] = 0;
210 unicode->length = length;
211

95 #define PyMem_RESIZE(p, type, n)
96 ( assert((n) <= PY_SIZE_MAX / sizeof(type)) ,
97 ( (p) = (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) )

  1. 在不存在vsnprintf()函数的架构上,PyOS_vsnprintf()函数中存在整数溢出漏洞。以下是有漏洞的代码段:

53 int
54 PyOS_vsnprintf(char *str, size_t size, const char format, va_list va)
55 {
56 int len; /
# bytes written, excluding \0 /
[…]
60 assert(str != NULL);
61 assert(size > 0);
62 assert(format != NULL);
63
[…]
67 /
Emulate it. /
68 buffer = PyMem_MALLOC(size + 512);
69 if (buffer == NULL) {
70 len = -666;
71 goto Done;
72 }
73
74 len = vsprintf(buffer, format, va);
75 if (len < 0)
76 /
ignore the error */;
77
78 else if ((size_t)len >= size + 512)
79 Py_FatalError("Buffer overflow in
PyOS_snprintf/PyOS_vsnprintf");
80
81 else {
82 const size_t to_copy = (size_t)len < size ?
83 (size_t)len : size - 1;
84 assert(to_copy < size);
85 memcpy(str, buffer, to_copy);
86 str[to_copy] = ‘\0’;
87 }
88 PyMem_FREE(buffer);
89 Done:
[…]
91 str[size-1] = ‘\0’;
92 return len;
93 }

  1. 如果向PyOS_vsnprintf()函数传送了0长度的字符串的话,就可能触发整数溢出,导致内存破坏。以下是有漏洞的代码段:

53 int
54 PyOS_vsnprintf(char *str, size_t size, const char format, va_list va)
55 {
56 int len; /
# bytes written, excluding \0 */
57 #ifndef HAVE_SNPRINTF
58 char *buffer;
59 #endif
60 assert(str != NULL);
61 assert(size > 0);
62 assert(format != NULL);
[…]
65 len = vsnprintf(str, size, format, va);
[…]
91 str[size-1] = ‘\0’;
92 return len;
93 }

python 2.5.x
python 2.4.x
厂商补丁:

Gentoo

Gentoo已经为此发布了一个安全公告(GLSA-200807-16)以及相应补丁:
GLSA-200807-16:Python: Multiple vulnerabilities
链接:<a href=“http://security.gentoo.org/glsa/glsa-200807-16.xml” target=“_blank”>http://security.gentoo.org/glsa/glsa-200807-16.xml</a>

所有Python 2.4用户都应升级到最新版本:

# emerge --sync
# emerge --ask --oneshot --verbose &quot;&gt;=dev-lang/python-2.4.4-r14&quot;

所有Python 2.5用户都应升级到最新版本:

# emerge --sync
# emerge --ask --oneshot --verbose &quot;&gt;=dev-lang/python-2.5.2-r6&quot;

Python

目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

<a href=“http://svn.python.org/view?rev=65335&amp;view=rev” target=“_blank”>http://svn.python.org/view?rev=65335&amp;view=rev</a>