德国一组网络安全研究人员发现了一种针对网络缓存系统的新的缓存中毒攻击,攻击者可以利用这种攻击迫使目标网站向大多数访问者提供错误页面,而不是合法的内容或资源。
这个问题影响到Varnish等反向代理缓存系统,以及一些广泛使用的内容分发网络(CDNs)服务,包括Amazon CloudFront、Cloudflare、Fastly、Akamai和CDN77。
简而言之,内容分发网络(CDN)是一组地理上分布的服务器,它们位于网站的原始服务器和访问者之间,以优化网站的性能。
CDN服务只是简单地存储/缓存来自源服务器的静态文件(包括HTML页面、java文件、样式表、图像和视频),并更快地将它们交付给访问者,而无需一次又一次地返回到源服务器。
每个地理上分布的CDN服务器也共享缓存文件的副本,并根据其位置将其提供给访问者。
通常,在定义时间或手动清除之后,CDN服务器通过从原始服务器检索每个web页面的新更新副本来刷新缓存,并将它们存储起来以备将来的请求。
CPDoS攻击是如何对付CDNs的?
这种攻击被称为CPDoS,是缓存中毒拒绝服务的缩写。CDN中间服务器被错误配置为缓存web资源或页面,其中包含原始服务器返回的错误响应。
根据三位德国学者(Hoai Viet Nguyen、Luigi Lo Iacono和Hannes Federrath)的说法,CPDoS攻击仅通过发送一个包含格式错误的标头的HTTP请求,就威胁到网站web资源的可用性。
“当攻击者可以为可缓存的资源生成HTTP请求时,问题就出现了,其中的请求包含不准确的字段,这些字段被缓存系统忽略,但是在原始服务器处理时引发错误。”
CPDoS攻击的工作原理:
远程攻击者通过发送包含格式错误的标头的HTTP请求来请求目标网站的web页面。
如果中间的CDN服务器没有所请求资源的副本,它将把请求转发给源web服务器,而源web服务器将由于格式错误而崩溃。
因此,原始服务器随后返回一个错误页面,该错误页面最终由缓存服务器存储,而不是由请求的资源存储。现在,每当合法的访问者试图获取目标资源时,他们将获得缓存的错误页面,而不是原始内容。
CDN服务器也会将相同的错误页面传播到CDN网络的其他边缘节点,导致受害者网站的目标资源不可用。
值得注意的是,一个简单的请求就足以用一个错误页面替换缓存中的真实内容。这意味着这样的请求仍然低于web应用程序防火墙(WAFs)和DDoS保护的检测阈值,特别是当它们扫描大量不规则网络流量时。”
此外,可以利用cpdo来阻止通过缓存分发的补丁或固件更新,从而防止设备和软件中的漏洞被修复。攻击者还可以禁用关键任务网站(如网上银行或官方政府网站)上的重要安全警报或消息。”
3种CPDoS攻击类型
要对CDNs执行这种缓存中毒攻击,有三种类型的HTTP请求:
HTTP头文件大小过大(HHO)——在web应用程序使用比原始服务器接受更大的头文件大小限制的缓存的情况下,包含超大头文件的HTTP请求。
HTTP元字符(HMC)——这种攻击不发送过大的报头,而是尝试使用包含有害元字符的请求报头绕过缓存,如换行/回车(\n)、换行(\r)或铃声(\a)。
HTTP方法覆盖(HMO)——使用HTTP覆盖头绕过禁止删除请求的安全策略。
易受CPDoS攻击的CDN服务
研究人员针对web缓存系统和HTTP实现的不同组合进行了三次攻击,发现Amazon的CloudFront CDN最容易受到CPDoS攻击。
测试结果如下:
该团队于2019年2月19日向受影响的HTTP实现供应商和缓存提供商报告了他们的发现。
Amazon Web Services (AWS)团队确认了CloudFront上的漏洞,并通过禁止在默认情况下缓存状态码为400 Bad Request的错误页面解决了这个问题。
微软在其2019年6月的月度安全更新中也承认了报告的问题,并发布了一个更新来缓解这一漏洞,命名为CVE-2019-0941。
Play Framework还通过限制Play Framework版本1.5.3和1.4.6中X-HTTP-Method-Override头文件的影响,确认了报告的问题,并为其产品打了针对CPDoS攻击的补丁