QEMU和KVM都是开放源码的模拟器软件。 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=='#' &&...
QEMU和KVM都是开放源码的模拟器软件。 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()中的缓冲区。