Apache - 如何限制 Content-Type 标头长度以避免 CVE-2014-0050?

Apache - 如何限制 Content-Type 标头长度以避免 CVE-2014-0050?

周四拒绝服务问题雄猫在 Tomcat 邮件列表中发布(“[安全]CVE-2014-0050Apache Commons FileUpload 和 Apache Tomcat DoS”)。

content-type据我第一眼看到的消息,攻击者似乎可以通过在上传文件时发送过长的标头来导致无限循环(如果在 Web 应用程序中使用了 Servlet 3.0+ 上传功能)。

如果有人在 Apache httpd 服务器后面运行 Tomcat 服务器(使用 AJP 和 mod_jk),那么可以做些什么来实施该建议“将 Content-Type 标头的大小限制为小于 4091 字节”

当然,一旦有错误修复版本可用(通过下载页面或 Linux 发行版特定的软件包存储库),就应该更新。毫无疑问。但目前当前可用的 Tomcat 版本 7.0.50似乎仍受到影响。

但是在修复版本发布之前,可以采取什么快速防御措施呢?

(无需...

  • 卸载当前的 Tomcat 包(从包存储库安装),
  • 从源代码(SVN)手动构建版本,
  • 手动部署(不使用apt-getaptitude),
  • 稍后再次卸载所有手动构建的内容,以便从软件包存储库轻松更新版本)

是否有与该主题的临时解决方法类似的方法:http://wiki.apache.org/httpd/CVE-2011-3192

那时人们可以使用mod_headersmod_setenvif或者mod_rewrite来处理这个问题。是否有类似的 Apache httpd 技巧来防止格式错误的多部分上传请求远离下游 Tomcat 服务器?

答案1

apache(包括 Shane 的修改版本;阅读请求函数我不会打赌的长度Content-String总是<129

RewriteEngine On
RewriteCond %{HTTP:Content-Type} "multipart\/form-data;(\s*)boundary=[a-zA-Z0-9_-]{3000}"
RewriteRule ^/(.*)$ /405.html [R=301,L]

# modified 
SetEnvIf Content-Type ^.{3000,}$ bad-content-type=1
RequestHeader unset Content-Type env=bad-content-type

nginx(没有找到解决 if() 的方法)

server {
  ...
  if ($http_content_type ~* "multipart\/form-data;(\s*)boundary=[a-zA-Z0-9_-]{3000}" ) {
  return 403; 
  }
  ...

}

答案2

是的,应该可以。CVE 公告说 4091 字节,但意外泄露电子邮件似乎开发人员倾向于将 70-128 字节作为限制。我们以 128 字节为限,但可以根据需要进行调整:

SetEnvIf Content-Type ^.{129,}$ bad-content-type=1
RequestHeader unset Content-Type env=bad-content-type

仅取消设置标头(而不是完全 403 请求)可能对明显的攻击请求过于温和,但这应该可以完成工作。

相关内容