缓解 Tomcat 8 上的慢速 HTTP Post 漏洞

nas*_*spy 3 java security tomcat ddos spring-mvc

我们用于安全测试的第三方工具是在Tomcat 8 上提供慢速HTTP POST漏洞。我们在应用程序中有一个简单的Spring Controller 和JSP。

现有的 Tomcat 连接器配置如下:

<Connector port="8643" protocol="HTTP/1.1" SSLEnabled="true"
  maxThreads="150" scheme="https" secure="true" compression="on" 
  clientAuth="false" sslProtocol="TLS" maxPostSize="20480" 
  maxSwallowSize="20480" maxHeaderCount="25" maxParameterCount="100"/>
Run Code Online (Sandbox Code Playgroud)

请注意,我们在 tomcat 前面没有 Apache 或 Nginx。请建议我们可以直接在 Tomcat 上使用的配置。

Eug*_*ell 6

慢速 HTTP 攻击的一个例子是SLOWLORIS

为了使用 Tomcat 缓解它,解决方案是使用NIO 连接器,如本教程中所述

您的问题不清楚的是,Tomcat 已经在 Tomcat 8 上默认使用了 NIO 连接器,这是您的配置:

默认值为 HTTP/1.1,它使用自动切换机制来选择基于 Java NIO 的非阻塞连接器或基于 APR/本机的连接器。

也许您应该设置一些其他连接器参数来专门限制POST滥用,我建议:

maxPostSize="1048576" (1 MByte)
connectionTimeout="10000" (10 seconds between the connection and the URI request)
disableUploadTimeout="false" (activate the POST maximum time allowed)
connectionUploadTimeout="20000" (maximum POST of 20 seconds)
Run Code Online (Sandbox Code Playgroud)

一个选项也是限制标头数量(默认为 100),但这会对使用智能手机的人产生副作用(众所周知,智能手机会发送许多标头):

maxHeaderCount="25"
Run Code Online (Sandbox Code Playgroud)

但这取决于您的流量是来自 Internet,还是具有已知用户的专业内部网。在后一种情况下,您可以将设置调整为更宽松。

编辑 1:使用 MultipartConfig 进行强化

正如其他一些帖子所述, maxPostSize 可能无法用于限制上传。使用Java 7 内置的 uploads 时,可以通过对 Servlet 的注释或配置来配置限制。正如您所问的,这不是纯粹的 Tomcat 配置,但有必要了解它并与 DEV 团队交谈,因为从开发的早期阶段就必须考虑安全性。

编辑 2:禁用分块传输编码

一些慢速 HTTP POST攻击基于使用Transfer-Encoding : chunked标头发送的请求,然后发送许多或无限数量的块。为了对抗这种攻击,我建议配置一个Rewrite Valve

要实现这一点,请在您的主机定义中添加阀门server.xml

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
Run Code Online (Sandbox Code Playgroud)

假设您的主机名是默认的(localhost),您需要$CATALINA_BASE/conf/Catalina/localhost/rewrite.config使用以下内容创建文件:

RewriteCond %{HTTP:Transfer-Encoding} chunked
RewriteRule ^(.*)$ / [F]
Run Code Online (Sandbox Code Playgroud)

如有必要,您可以调整 RewriteRule 以使用除 F 标志导致的 403 Forbidden 之外的其他内容进行回复。这是纯 Tomcat 配置且灵活。

  • 我们减少了 connectionTimeout="8000" 并通过了扫描。这么晚才回复很抱歉。感谢帮助。 (2认同)