在当今全球网络中,CDN服务扮演着很重要的角色,它的缓存系统可以极大缓解原网站的压力,并给访问者提供更好的网络体验。
但近期,有安全研究人员发现了一种针对CDN缓存功能的DoS攻击——CPDoS,它有多种变体,不过基本都是通过恶意的HTTP请求头来实现。在攻击成功后,用户就无法正常访问那些使用了CDN的网站。
通过缓存服务器进行DoS
CPDoS瞄准了CDN中的缓存系统,它会向目标网站发送一个包含恶意请求头的HTTP请求,CDN接受到请求后便会直接转发给原网站,并把原网站的响应缓存起来。由于恶意请求头的存在,原网站的响应往往是异常的,但这并不影响CDN对这种异常响应进行缓存,这就导致其他用户在访问同一个页面时会直接看到缓存中的异常响应。这就是CPDoS攻击。
攻击的变种
来自科隆应用科学大学和德国汉堡大学的Hoai Viet Nguyen、Luigi Lo Iacono和Hannes Federrath展示了CPDoS攻击的三种变体:
- HTTP Header Oversize (HHO)
- HTTP me ta Character (HMC)
- HTTP Method Override (HMO)
在HHO类型的CPDoS攻击中,攻击者主要利用服务器对HTTP请求头大小的限制来发起攻击。
如果CDN所转发的HTTP请求头大于原服务器定义的尺寸,则攻击者可以通过发送包含多个巨大请求头的请求来发动攻击。
例如在下图,CDN转发一个具有多个请求头的HTTP请求,原服务器被成功阻塞,返回一个400 Bad request
错误页面,被缓存系统所存储。
为了更好地说明这个场景,研究人员还制作了一个视频,针对一个托管在Amazon CloudFront上的应用发起测试。
- https://vimeo.com/368153261
第二种HMC类型的CPDoS攻击,是利用某些特殊字符来使服务器发生异常,例如\n
、\r
、\a
等。当把这些字符塞入请求头时,服务器也有可能发生异常,返回错误页面。接着被CDN缓存,影响正常用户的访问。
而第三种HMO类型的CPDoS攻击,是通过注入和原始请求不同的请求类型来转换请求类型,使服务器无法处理请求,从而返回异常结果。这主要基于原服务器的安全策略,有些服务器并不支持请求类型转换。
在上图中,GET请求被转换为POST请求,而原服务器又无法处理该页面的POST请求,最终返回异常页面。
在错误页面被缓存后,正常用户对于目标页面的GET请求都出现异常。
研究人员也使用了Postman来演示了这种功能。
- https://vimeo.com/368153252
影响
CDN服务器往往会影响一大片区域(甚至跨国),而CPDoS攻击所生成的错误页面也往往会影响多个缓存服务器。
当然,研究人员发现并不是所有的边缘服务器都受到这种攻击的影响,一些用户仍然可收到来自原网站的正常页面。
在整个测试中,研究人员使用了TurboBytes Pulse(全局DNS、HTTP和traceroute测试工具)和一个网站速度测试服务来统计结果。
最后发现来自德国(法兰克福)的针对科隆目标的CPDoS攻击影响了欧洲和亚洲部分地区的CDN服务器。
解决方法
要防御这种攻击,对于CDN来说,就最简单的方法就是只缓存404
,405
,410
,501
之类的常见的,符合标准的错误页面。
当然,这也需要网站开发人员的配合,切勿把所有错误都归类为同一个错误代码和页面。
此外还可以在WAF之类的安全设备上加强防御,阻止恶意内容的通过。
CDN现状
从这三位研究人员进行的测试来看,亚马逊的CloudFront CDN似乎是最容易受到CPDoS攻击的。
在研究人员测试的25种相关服务和产品中,只有3种不受CPDoS攻击影响:Apache TS、谷歌云存储和Squid。
微软在6月份更新了IIS服务,并发布了关于该漏洞的详细信息(CVE-2019-0941)。Play framework也在版本1.5.3和1.4.6中针对HMO攻击进行了修复。
但并不是所有供应商的反应都很迅速,Flask的开发者就一直无回复。
亚马逊的安全团队也承认了CloudFront确实易受该攻击影响,并在默认情况下禁止缓存400 Bad Request
错误页面。
Hoai Viet Nguyen、Luigi Lo Iacono和Hannes Federrath也在一篇题为Your Cache Has Fallen: Cache-Poisoned Denial-of-Service Attack的文章中详细介绍了该攻击。
他们也将在11月14日伦敦举行的第26届ACM计算机与通信安全(CCS)会议上发布报告。