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请求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的错误页面就保存在缓存中了。随后所有攻击资源的请求都会看到错误页面。
下面的视频证明了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攻击流。
攻击者发送了含有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