PHP在5.4發佈的時候, 引入了一個新的配置項:
max_input_vars
攻擊的原理很簡單, 目前很多語言, 使用hash來存儲k-v資料, 包括常用的來自使用者的POST資料, 攻擊者可以通過構造請求頭, 並伴隨POST大量的特殊的”k”值(根據每個語言的Hash演算法不同而定制), 使得語言底層保存POST資料的Hash表因為”衝突”(碰撞)而退化成鏈表.這個預防的攻擊, 就是”通過調用Hash衝突實現各種語言的拒絕服務攻擊漏洞”(multiple implementations denial-of-service via hash algorithm collision).
這樣一來, 如果資料量足夠大, 那麼就可以使得語言在計算, 查找, 插入的時候, 造成大量的CPU佔用, 從而實現拒絕服務攻擊.
PHP5.4是通過增加一個限制來儘量避免被此類攻擊影響:
- - max_input_vars – specifies how many GET/POST/COOKIE input variables may be
- accepted. default value 1000.
目前已知的受影響的語言以及版本有::
Java, 所有版本
JRuby <= 1.6.5
PHP <= 5.3.8, <= 5.4.0RC3
Python, 所有版本
Rubinius, 所有版本
Ruby <= 1.8.7-p356
Apache Geronimo, 所有版本
Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22
Oracle Glassfish <= 3.1.1
Jetty, 所有版本
Plone, 所有版本
Rack, 所有版本
V8 JavaScript Engine, 所有版本
不受此影響的語言或者修復版本的語言有::
PHP >= 5.3.9, >= 5.4.0RC4
JRuby >= 1.6.5.1
Ruby >= 1.8.7-p357, 1.9.x
Apache Tomcat >= 5.5.35, >= 6.0.35, >= 7.0.23
Oracle Glassfish, N/A (Oracle reports that the issue is fixed in the main codeline and scheduled for a future CPU)
目前PHP官方已經發佈5.2的補丁:
補丁使用方法:
1. cd 到 php src,運行: patch -p1 < php-5.2.*-max-input-vars.patch
2.重新編譯php。
PHP 5.3.9和PHP 5.4.0已經包含了針對此漏洞的補丁,但由於兩個版本目前仍然在RC狀態,無法用於生產伺服器升級。
如果您不想更新到一個RC版本,那麼也可以很簡單的修改上面這個補丁,應用到 5.3 的相應版本上。
微軟也針對這一漏洞發佈了緊急更新補丁,自己去找就好。
CVE: CVE-2011-4885 (PHP), CVE-2011-4461 (Jetty), CVE-2011-4838 (JRuby), CVE-2011-4462 (Plone), CVE-2011-4815 (Ruby)