CVE-2015-4024漏洞,据发布时间过去了好几天,我来总结一下。
这个的DOS漏洞炒得很火,百度安全攻防实验室的小伙伴也很给力。我个人认为漏洞的影响确实很大,毕竟对于一个web应用,拒绝服务攻击可以说是杀死它最简单的方法。这样大张旗鼓地说也很必要,也是一种加速杀死php 5.2/5.3的方式。
前不久才说了要赶紧弃用php 5.2/5.3事情,这次出了这么大的漏洞,很多用5.3的同学就着急了,各种求5.3的patch。
漏洞原理在drops的中文文章中(http://drops.wooyun.org/papers/6077)已经解释过了,是由于php没有妥善处理multipart/form-data请求的body part请求头,对于换行内容多次重新申请内存,导致耗尽CPU资源,拒绝服务计算机。
其实在C语言里会常常遇到这种现象,当你不知道某个buffer究竟要申请多长空间时,就必须先申请部分资源,再根据用户输入多次重新申请内存。而如果不加限制的话,就可能导致耗尽系统资源的问题。
Ryat哥很给力地带来了PHP低版本一个民间patch:https://gist.github.com/chtg/4aecda8ae4928f8fb1b2 ,方式就是限制换行次数,大于100的话就不继续分配内存了:
--- a/php-5.3.29/main/rfc1867.c +++ b/php-5.3.29-fixed/main/rfc1867.c @@ -464,6 +464,8 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T char *line; mime_header_entry prev_entry, entry; int prev_len, cur_len; + int newlines = 0; + long upload_max_newlines = 100; /* didn't find boundary, abort */ if (!find_boundary(self, self->boundary TSRMLS_CC)) { @@ -489,6 +491,7 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T entry.value = estrdup(value); entry.key = estrdup(key); + newlines = 0; } else if (zend_llist_count(header)) { /* If no ':' on the line, add to previous line */ @@ -501,6 +504,10 @@ static int multipart_buffer_headers(multipart_buffer *self, zend_llist *header T entry.value[cur_len + prev_len] = '