CVE:CVE-2008-1887
CNNVD:CNNVD-200804-302
Python是一种开放源代码的脚本编程语言。
Python的核心API提供了多个用于分配字符串对象的函数，其中一个API调用允许分配或重新分配PyStringObject，这个函数为PyString_FromStringAndSize()，该函数获取了两个参数，分别为一个指针和一个有符整数。如果指针非空的话，就会将指向该指针的内存重新分配为第二个参数所指定的大小；如果指针为空，就会分配整数所指定的字节数并返回。
在这个操作期间，没有验证第二个参数是否为负数，而该值与PyStringObject的大小相加并用作了分配函数的长度，可能导致错误的内存分配。 PyBytes_FromStringAndSize()和PyUnicode_FromStringAndSize()函数中也可能存在类似的错误。
以下是Python-2.5.2/Objects/stringobject.c文件中的漏洞代码：
52  PyObject *
53  PyString_FromStringAndSize(const char *str, Py_ssize_t size)
54  {                                                           
55          register PyStringObject *op;
56          assert(size >= 0);
57          if (size == 0 && (op = nullstring) != NULL) {
[...]
63          }
64          if (size == 1 && str != NULL &&
65              (op = characters[*str & UCHAR_MAX]) != NULL)
66          {
[...]
72          }
73
74          /* Inline PyObject_NewVar */
75 op = (PyStringObject *)PyObject_MALLOC(sizeof(PyStringObject) +
size);
type Py_ssize_t被定义为有符型，在56行的assert()试图确认是否过滤了第二个参数，但在非调试版本中遗漏了assert()，然后在75行将字符串对象的大小参数和字符串对象的大小相加并作为参数传送给了PyObject_MALLOC()。
solution:Upgrade python python to a higher version than 2.5.2,and avoid the version (,2.5.2]; Upgrade canonical ubuntu_linux to a higher version than 6.06,7.04,7.10,8.04,and avoid the version 6.06,7.04,7.10,8.04; Upgrade debian debian_linux to a higher version than 4.0,and avoid the version 4.0