一个自己写的用于HHVM的PHP Multipart/form-data remote dos Vulnerability(CVE-2015-4024)补丁|a patch of PHP Multipart/form-data remote dos Vulnerability(CVE-2015-4024) for HHVM

日志|SPARTA wdlth 5248℃ 0评论

百度安全中心自行打脸

最近几天PHP这个最好的语言又被推到风头浪尖了,原因是一个百度的安全大牛提交了一个PHP的低级漏洞(Bug #69384),可以通过简单的代码对使用PHP的网站进行攻击,使其CPU占用率升高,甚至PHP后端程序崩溃。

这个漏洞出来后,一大群PHP网站被攻击,包括各种论坛,CMS官网等。某个著名的和谐网站这几天也暂停运行,不知道是不是因为这个漏洞。

漏洞出来后,经过检测,HHVM也受影响,由于我使用HHVM作为后端,我一直在寻找用于HHVM的补丁,Google搜索中没有发现,在Github上HHVM项目的Commits和Issues也没有发现,不知道是不是HHVM运行速度太快,影响可以忽略不计。但是有了漏洞进行修补是个好习惯,既然官方没有发布补丁那我只能自己写个了。虽然对PHP和HHVM的代码一知半解,但是经过我的修改,漏洞算是检测不到了,也成功的编译通过,但是目前不知道是否有Bug或者会引起其他的问题。

修改的文件是hphp/runtime/server/upload.cpp,patch如下:

--- upload.cpp  2015-05-21 01:40:46.385001624 -0400
+++ upload_patched.cpp  2015-05-21 09:12:30.673999984 -0400
@@ -22,6 +22,7 @@
 #include "hphp/runtime/base/zend-printf.h"
 #include "hphp/runtime/base/php-globals.h"
 #include "hphp/runtime/ext/apc/ext_apc.h"
+#include "hphp/runtime/ext_zend_compat/php-src/ext/standard/php_smart_str.h"
 #include "hphp/util/logger.h"
 #include "hphp/runtime/base/string-util.h"
 #include "hphp/util/text-util.h"
@@ -424,9 +425,9 @@
 static int multipart_buffer_headers(multipart_buffer *self,
                                     header_list &header) {
   char *line;
-  std::pair<std::string, std::string> prev_entry;
   std::pair<std::string, std::string> entry;
-
+  smart_str buf_value = {0};
+  char *key = NULL;
   /* didn't find boundary, abort */
   if (!find_boundary(self, self->boundary)) {
     return 0;
@@ -438,7 +439,6 @@
   {
     /* add header to table */
 
-    char *key = line;
     char *value = nullptr;
 
     /* space in the beginning means same header */
@@ -447,19 +447,30 @@
     }
 
     if (value) {
-      *value = 0;
+      if (buf_value.c && key) {
+          smart_str_0(&buf_value);
+          entry = std::make_pair(key, buf_value.c);
+          header.push_back(entry);
+          key = NULL;
+          buf_value.c = NULL;
+      }
+      *value = '\0';
       do { value++; } while(isspace(*value));
-      entry = std::make_pair(key, value);
-    } else if (!header.empty()) {
+      key = estrdup(line);
+      smart_str_appends(&buf_value, value);
+    } else if (buf_value.c) {
       /* If no ':' on the line, add to previous line */
-      entry = std::make_pair(prev_entry.first, prev_entry.second + line);
-      header.pop_back();
+      smart_str_appends(&buf_value, line);
     } else {
       continue;
     }
+  }
 
+  if (buf_value.c && key)
+  {
+    smart_str_0(&buf_value);
+    entry = std::make_pair(key, buf_value.c);
     header.push_back(entry);
-    prev_entry = entry;
   }
 
   return 1;

如果不会用patch的,完整的代码如下:
upload.cpp补丁文件

转载请注明:WDLTH's 斯巴达 » 一个自己写的用于HHVM的PHP Multipart/form-data remote dos Vulnerability(CVE-2015-4024)补丁|a patch of PHP Multipart/form-data remote dos Vulnerability(CVE-2015-4024) for HHVM

喜欢 (219)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
cnzz1000134333