CVE:CVE-2008-5557
CNNVD:CNNVD-200812-427
Php Mbstring（Multi-Byte String）是Php社区的PHP（PHP：HypertextPreprocessor，PHP：超文本预处理器）中的一个语言编码扩展库。
Qemu和KVM的VNC服务器在处理特制的报文时可能出现死循环，导致拒绝服务的情况。 
PHP是广泛使用的通用目的脚本语言，特别适合于Web开发，可嵌入到HTML中。
PHP的mbstring扩展的ext/mbstring/libmbfl/filters/mbfilter_htmlent.c文件中存在缓冲区溢出漏洞，远程攻击者可以通过包含有HTML实体的特制字符串来触发这个溢出，导致执行任意代码。
以下是mbfilter_htmlent.c中有问题的HTML实体解码器，这里解码器实现为一个回调函数，输入字符串中的每个字符都会用包含有解码器状态的结构(mbfl_convert_filter)顺序调用该回调函数。
mbfl_convert_filter中的output_function字段指向一个函数，解码后的数据逐字符的传送给该函数，在出现错误的时候函数应返回负值，但如果参数是没有分配给任何字符的Unicode值时就可能失效。具体来说，由于output_function的符号是int(*)(int, void *)而缓冲区是无符字符数组，因此任何大于127的字符代码都会在将其值取反后传送给该函数，导致无条件的失效。
------------------------------------------------------------------------------
#define CK(statement)   do { if ((statement) > 0) return (-1); } while (0)
...
int mbfl_filt_conv_html_dec(int c, mbfl_convert_filter *filter)
{
   if (!filter-<status) {
        ...
    } else {
        if (c == ';') {
            ...
        } else {
           /* add character */
            buffer[filter-<status++] = c;
            /* add character and check */
            if (!strchr(html_entity_chars, c) ||
filter-<status+1==html_enc_buffer_size || (c=='#' && filter-<status<2))
            {
               /* illegal character or end of buffer */
               if (c=='&')
                   filter-<status--;
               buffer[filter-<status] = 0;
                /* php_error_docref("ref.mbstring" TSRMLS_CC, E_WARNING,
"mbstring cannot decode '%s'", buffer)l */
               mbfl_filt_conv_html_dec_flush(filter);
                if (c=='&')
                {
                   filter-<status = 1;
                   buffer[0] = '&';
               }
            }
        }
    }
}
int mbfl_filt_conv_html_dec_flush(mbfl_convert_filter *filter)
{
    int status, pos = 0;
    char *buffer;
   buffer = (char*)filter-<opaque;
    status = filter-<status;
    /* flush fragments */
    while (status--) {
        CK((*filter-<output_function)(buffer[pos++], filter-<data));
    }
    filter-<status = 0;
    /*filter-<buffer = 0; of cause NOT*/
    return 0;
}
------------------------------------------------------------------------------
如果用户输入中的字符序列包含有一个或多个不属于html_entity_chars的字符，在mbfl_filt_conv_html_dec_flush()中调用输出函数就会失败。由于CK()宏中的返回语句，这可能导致未经重置filter-<status就回到调用函数，最终允许随意的访问mbfl_filt_conv_html_dec()中的缓冲区。
solution:Upgrade php php to a higher version than 4.3.0,4.3.1,4.3.2,4.3.3,4.3.4,4.3.5,4.3.6,4.3.7,4.3.8,4.3.9,4.3.10,4.3.11,4.4.0,4.4.1,4.4.2,4.4.3,4.4.4,4.4.5,4.4.6,4.4.7,4.4.8,4.4.9,5.0.0,5.0.0:beta1,5.0.0:beta2,5.0.0:beta3,5.0.0:beta4,5.0.0:rc1,5.0.0:rc2,5.0.0:rc3,5.0.1,5.0.2,5.0.3,5.0.4,5.0.5,5.1.0,5.1.1,5.1.2,5.1.3,5.1.4,5.1.5,5.1.6,5.2.0,5.2.1,5.2.2,5.2.3,5.2.4,5.2.5,5.2.6,and avoid the version 4.3.0,4.3.1,4.3.2,4.3.3,4.3.4,4.3.5,4.3.6,4.3.7,4.3.8,4.3.9,4.3.10,4.3.11,4.4.0,4.4.1,4.4.2,4.4.3,4.4.4,4.4.5,4.4.6,4.4.7,4.4.8,4.4.9,5.0.0,5.0.0:beta1,5.0.0:beta2,5.0.0:beta3,5.0.0:beta4,5.0.0:rc1,5.0.0:rc2,5.0.0:rc3,5.0.1,5.0.2,5.0.3,5.0.4,5.0.5,5.1.0,5.1.1,5.1.2,5.1.3,5.1.4,5.1.5,5.1.6,5.2.0,5.2.1,5.2.2,5.2.3,5.2.4,5.2.5,5.2.6