Tomcat 是否容易受到 CVE-2011-3192 中的 Apache DoS 漏洞的攻击?

Tomcat 是否容易受到 CVE-2011-3192 中的 Apache DoS 漏洞的攻击?

Tomcat 是否受此漏洞影响?公告

答案1

本质上,此漏洞使 Apache 服务器构建一个大量的单个文件请求的响应,比文件本身大得多。而 RFC(2616) 告诉 Web 服务接受多个范围,但没有任何规定说您不能让范围重叠。Apache 的实现很糟糕,但其他 Web 服务器也很有可能存在漏洞。

大多数 Tomcat servlet 不允许Range请求,因为它是过滤器的自定义实现,用于输出正确的内容块。但是,默认 servlet(处理静态内容)则是另一回事。

当前 Tomcat 代码 (这里) 接受多个范围集,逐个验证每个范围集是否在文件大小范围内,并将其放入要服务的范围列表中。但是,范围会按顺序从 servlet 的内部缓存中流出,如果请求数据的客户端断开连接,则应立即停止该过程;在大多数情况下,这应该使重叠范围请求大致相当于服务大型文件的性能影响。


并且,为了确认,进行快速测试..

我们将向 / 发送快速请求以获取尺寸..

要求:

HEAD / HTTP/1.1
Host: 192.168.100.200
Accept-Encoding: gzip
Connection: close

回复:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"1887-1314245401000"
Last-Modified: Thu, 25 Aug 2011 04:10:01 GMT
Content-Type: text/html
Content-Length: 1887
Date: Thu, 25 Aug 2011 04:18:05 GMT
Connection: close

结论是,可爱的“它起作用了!”页面占用 1887 个字节。这告诉我们可以使用的范围,而 Tomcat 不会将该范围视为超出范围而丢弃。

好的,让我们检查它是否允许快速重叠,字节 0 到 10,然后字节 5 到 15:

要求:

GET / HTTP/1.1
Host: 192.168.100.200
Range: bytes=0-10,5-15
Accept-Encoding: gzip
Connection: close

回复:

HTTP/1.1 206 Partial Content
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"1887-1314245401000"
Last-Modified: Thu, 25 Aug 2011 04:10:01 GMT
Content-Type: multipart/byteranges; boundary=CATALINA_MIME_BOUNDARY
Content-Length: 224
Date: Thu, 25 Aug 2011 04:17:11 GMT
Connection: close


--CATALINA_MIME_BOUNDARY
Content-Type: text/html
Content-Range: bytes 0-10/1887

<?xml versi
--CATALINA_MIME_BOUNDARY
Content-Type: text/html
Content-Range: bytes 5-15/1887

 version="1
--CATALINA_MIME_BOUNDARY--

是的,确实如此 -<?xml versi而且version="1。因此重叠有效。

并且,它是否允许请求比实际提供的文件中更多的数据:

要求:

GET / HTTP/1.1
Host: 192.168.100.200
Range: bytes=0-1800,1-1886
Accept-Encoding: gzip
Connection: close

回复:

HTTP/1.1 206 Partial Content
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"1887-1314245401000"
Last-Modified: Thu, 25 Aug 2011 04:10:01 GMT
Content-Type: multipart/byteranges; boundary=CATALINA_MIME_BOUNDARY
Content-Length: 3893
Date: Thu, 25 Aug 2011 04:19:51 GMT
Connection: close


--CATALINA_MIME_BOUNDARY
Content-Type: text/html
Content-Range: bytes 0-1800/1887

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Apache Tomcat</title>
</head>

...(lots more data)...

是的 - 小于 2KB 的文件占用了近 4KB 的空间。

将这种方法扩大到包含大量范围,这就是攻击的基本结构。在 Tomcat 的案例中,真正的影响似乎是它允许攻击者在对相对较小的资源的请求中获取大量数据,这可能有助于针对带宽进行拒绝服务。我还怀疑其他边缘情况下的影响;当反向代理尝试缓存 206 个响应时,或者当请求的资源是一个大于 Tomcat 缓存的文件时。

答案2

这不是一个弱点。读取默认 servlet 代码。它加载资源一次。它还读取所有范围偏移量。然后它遍历所有基于原始资源提供内容的偏移量。这与 apache httpd 的做法不同。因此它不会触发 OOM 异常。

您可能会争辩说,您可以发送大量的 Range 标头来生成要返回的详尽列表或范围。但这是发送过多标头而遭受 DOS 攻击的一个具体示例。在这种情况下,tomcat 和 httpd 有办法限制过多的请求标头及其大小。

--2011 年 10 月 4 日更新--
Tomcat 可能受到攻击,因为连接可以保持打开状态的时间比正常时间长。但这种攻击与标准的 DOS 攻击没有什么不同。它只是允许攻击者通过使请求比正常情况下提供的字节数更多来“提高效率”。

此类攻击唯一消耗的额外资源是带宽和开放套接字连接。因此,它与标准 DOS 攻击没什么不同。唯一的区别是攻击者的效率可能略高一些。但是,让 Tomcat 尝试对范围执行额外的验证并不能为您带来任何额外的保护。

答案3

tl;dr:可能不是。

鉴于 Apache httpd 和 Tomcat 是不同的产品,而且我找不到 Tomcat 中类似的漏洞公告,因此我倾向于“否”。公告中没有关于具体漏洞的详细信息,因此很难说这可能是常见的编程漏洞,还是 Apache httpd 特有的漏洞。

相关内容