三天前,KingCope 向 DoS Apache 发布了一个简单的 Perl 脚本,恰当地命名为 Apache Killer。
该脚本启动了大约 50 个线程以使用可选的 GZIP 编码从服务器请求部分内容。这要么会消耗过多的内存,操作系统必须杀死所有其他进程,要么会消耗过多的 CPU 以致服务器不堪重负。
Apache Foundation 尚未发布补丁。
对抗这种情况的最佳方法是什么?
三天前,KingCope 向 DoS Apache 发布了一个简单的 Perl 脚本,恰当地命名为 Apache Killer。
该脚本启动了大约 50 个线程以使用可选的 GZIP 编码从服务器请求部分内容。这要么会消耗过多的内存,操作系统必须杀死所有其他进程,要么会消耗过多的 CPU 以致服务器不堪重负。
Apache Foundation 尚未发布补丁。
对抗这种情况的最佳方法是什么?
Apache 邮件列表中讨论了五种解决方法。去阅读每个细节:
1) 使用 SetEnvIf 或 mod_rewrite 检测大量范围,然后忽略 Range: 标头或拒绝请求。
2) 将请求字段的大小限制为几百字节。
3) 使用 mod_headers 完全禁止使用 Range 标头:
4) 部署 Range 标头计数模块作为临时权宜之计:
5) 应用讨论中的任何当前补丁
通过阅读 Mark Davidson 提供的脚本,显而易见的临时解决方案是在不需要时禁用 apache 的部分功能。
这个问题似乎是一个老问题,通过禁用部分内容请求已经“解决”了。这里有两个针对以前版本的 apache 的补丁。
我为 debian squeezy 下载了当前的 apache 源代码来检查这个补丁的痕迹。不幸的是,这似乎没有实现。
我对apache2的源代码不熟悉,所以我不会尝试为它写补丁。这可以作为读者的练习:)
http://www.guerilla-ciso.com/archives/2049对资源线程耗尽的 DoS 进行了出色的分析,以及一些对策的思考,包括:
阅读 - 好文章。
这里的游戏有点晚了,但WAF(Web 应用程序防火墙)很可能也是一个有用的缓解措施。
即使它不知道这种开箱即用的攻击,任何现代 WAF 都应该很容易地支持阻止这些类型的请求,甚至在它们到达网络服务器之前。