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的话就不继续分配内存了:
代码语言:javascript复制--- 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] = '