CPDoS:Cache投毒DoS

ang010ela 新闻 2019年10月29日发布
Favorite收藏

导语:​本文介绍一种针对CDN的Cache投毒的DoS攻击。

CPDoS

Cache-Poisoned Denial-of-Service (CPDoS) 是一种禁用web资源和网站的新类型的web缓存投毒攻击。

攻击原理

基本攻击流如下所示:

1. 攻击者发送含有针对web服务器提供的针对受害者资源的恶意header的简单HTTP请求。请求是由中间缓存处理的。

2. 缓存会转发请求到原始服务器,而且没有保存目标资源的新副本。在原始服务器上,由于请求中含有恶意header,处理请求时就会引发错误。

3. 因此,原始会返回缓存中保存的错误页而非请求的资源。

4. 攻击者在响应中提取错误页时就说明攻击成功了。

5. 合法用户会尝试用随后的请求来获取目标资源。

6. 任何获取缓存错误页而非原始内容。

在CPDoS攻击中,恶意客户端可以拦截所有通过CDN或代理缓存分发和传播的web资源。注:一个伪造的简单请求就可以限制随后的访问目标内容的请求。

CPDoS变种

研究人员共检测到3种CPDoS的变种,分别是:

· HTTP Header Oversize (HHO)

· HTTP Meta Character (HMC)

· HTTP Method Override (HMO)

HTTP Header Oversize (HHO)

HTTP请求header中含有中间系统和web服务器的重要信息。其中包括客户端支持的媒体类型、语言和编码的缓存相关的header域或元数据。HTTP标准并没有对HTTP请求header的大小进行限制。因此,中间系统、web服务器、web框架都有自己的限制。大多数web服务器和代理都将请求header大小限制为8192字节。但也有中间系统将限制设置为大于8192字节。比如,Amazon Cloudfront CDN的限制就是20480字节。

攻击者可以利用请求header大小限制这个语义的差距来执行缓存污染攻击,引发DoS攻击。

HHO CPDoS攻击的场景中,web应用会使用可以接受比原始服务器的header大小限制的缓存。为了攻击这样的web应用,恶意客户端会发送一个含有比原始服务器支持的大小更大的header的HTTP GET请求。为此,攻击者有2个选项。第一个是,攻击者会伪造一个含有许多恶意header的请求header,另一个选项是包含过大的key或值的单个header。

require 'net/http'uri = URI("https://example.org/index.html")req = Net::HTTP::Get.new(uri)num = 200i = 0# Setting malicious and irrelevant headers fields for creating an oversized headeruntil i > num  do
	req["X-Oversized-Header-#{i}"] = "Big-Value-0000000000000000000000000000000000"
	i +=1;endres = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') {|http|
	http.request(req)}

下图是HHO CPDoS攻击流,其中恶意客户端会发送上面代码段创建的请求。因为header大小仍然是小于20480字节的限制,所以缓存会转发含有所有到终端的header的请求。因为请求header会超过header大小的限制,因此web服务器会拦截请求并返回错误页面。状态为400 Bad Request的错误页面就保存在缓存中了。随后所有攻击资源的请求都会看到错误页面。 HRS attack

下面的视频证明了HHO CPDoS攻击。在攻击活动中,嵌入的web资源会被错误页面替换。

https://cpdos.org/videos/HHO.mp4

HTTP Meta Character (HMC)

HTTP Meta Character (HMC) CPDoS攻击与HHO CPDoS攻击类似。但HMC CPDoS攻击并非发送过大的header,而是尝试绕过含有有害元字符的请求header的缓存。元字符可以控制换行(\n)、回车(\r)、响铃(\a)等。

没有意识到的缓存会转发这样的请求到原始服务器,而不会拦截消息或处理元字符。如果其中含有有害的元字符,原始服务器可能会将这些请求分类为恶意的。因此,原始服务器会返回缓存保存或重用的错误消息。

HTTP Method Override Attack (HMO)

HTTP标准为web服务器和客户端提供许多HTTP方法在web上执行事务。GET, POST, DELETE, PUT 都是web应用和基于REST的web服务中最常用的HTTP方法。代理、负载均衡、防火墙等中间系统只支持GET和POST。也就是说含有DELETE 和 PU的请求都会被拦截。为了绕过这些限制,许多基于REST的API或web框架会为拦截HTTP方法的通道来提供header,如X-HTTP-Method-Override, X-HTTP-Method或X-Method-Override 。请求到达服务器后,header会让web应用覆写请求中的HTTP方法。

POST /items/1 HTTP/1.1
Host: example.orgX-HTTP-Method-Override: DELETEHTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 62

Resource has been successfully removed with the DELETE method.

上面的代码是一个可以绕过安全策略的请求,安全策略是用X-HTTP-Method-Override header来禁止DELETE请求。在服务器端,POST请求会被翻译为DELETE请求。

这些覆盖header的方法在一些中间系统拦截不同的HTTP方法时是非常有用的。但如果web应用支持这样的header,使用优化性能的CDN或反向代理缓存的web缓存系统,恶意客户端就可以利用这些方法来执行CPDoS攻击。下图介绍了使用X-HTTP-Method-Override header的TTP Method Override Attack (HMO) CPDoS攻击流。

HRS attack

攻击者发送了含有POST的X-HTTP-Method-Override header的GET 请求。有漏洞的缓存会将请求翻译为针对资源https://example.org/index.html的非恶意的GET请求。因为X-HTTP-Method-Override header会让服务器替换请求行中的HTTP方法,因此web应用会将该请求翻译为POST请求。Web应用会返回基于POST的响应。假设目标web应用并不会在 /index.html上实现POST的任何商业逻辑。在这样的例子中,web框架会返回状态码为404 Not Found的错误消息。但缓存会认为返回的含有错误码的响应是https://example.org/index.html的GET请求的结果。根据 HTTP Caching RFC 7231的状态码 404 Not Found 是允许被缓存的,缓存会保存和重用该错误消息。每个发送到https://example.org/index.html 的GET请求的非恶意客户端会接收到状态码为404 Not Found的保存的错误消息而非真实的web应用开始页。

下面的视频证明了针对web应用的HMO攻击。

https://cpdos.org/videos/HMO.mp4

影响

下图表明针对CND的CPDoS攻击的影响。一旦被注入了错误页,CDN就会将其传播到其他边缘缓存服务器。下图说明了错误页被传播到不同的位置。

更多参见论文Your Cache Has Fallen: Cache-Poisoned Denial-of-Service Attack,下载地址https://cpdos.org/paper/Your_Cache_Has_Fallen__Cache_Poisoned_Denial_of_Service_Attack__Preprint_.pdf

本文翻译自:https://cpdos.org/如若转载,请注明原文地址: https://www.4hou.com/info/news/21172.html
点赞 3
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论