这种攻击被称为 CPDoS,是缓存中毒拒绝服务的缩写。CDN 中间服务器被错误配置为缓存 web资源或页面,其中包含原始服务器返回的错误响应。根据三位德国学者(Hoai Viet Nguyen、Luigi Lo Iacono 和 Hannes Federrath)的说法,CPDoS 攻击仅通过发送一个包含格式错误的标头的 HTTP 请求,就威胁到网站 web 资源的可用性。“当攻击者可以为可缓存的资源生成 HTTP 请求时,问题就出现了,其中的请求包含不准确的字段,这些字段被缓存系统忽略,但是在原始服务器处理时引发错误。”远程攻击者通过发送包含格式错误的标头的 HTTP 请求来请求目标网站的 web 页面。
如果中间的 CDN 服务器没有所请求资源的副本,它将把请求转发给源 web 服务器,而源 web服务器将由于格式错误而崩溃。因此,原始服务器随后返回一个错误页面,该错误页面最终由缓存服务器存储,而不是由请求的资源存储。现在,每当合法的访问者试图获取目标资源时,他们将获得缓存的错误页面,而不是原始内容。CDN 服务器也会将相同的错误页面传播到 CDN 网络的其他边缘节点,导致受害者网站的目标资源不可用。值得注意的是,一个简单的请求就足以用一个错误页面替换缓存中的真实内容。这意味着这样的请求仍然低于 web 应用程序防火墙(WAFs)和 DDoS 保护的检测阈值,特别是当它们扫描大量不规则网络流量时。”
要对 CDNs 执行这种缓存中毒攻击,有三种类型的 HTTP 请求:
HTTP 头文件大小过大(HHO)——在 web 应用程序使用比原始服务器接受更大的头文件大小限制的缓存的情况下,包含超大头文件的 HTTP 请求。
HTTP 元字符(HMC)——这种攻击不发送过大的报头,而是尝试使用包含有害元字符的请求报头绕过缓存,如换行/回车(\n)、换行(\r)或铃声(\a)。
HTTP 方法覆盖(HMO)——使用 HTTP 覆盖头绕过禁止删除请求的安全策略。
目前有对付 CPDoS 攻击的缓解措施。最简单的解决办法是,网站所有者配置其 CDN 服务,以便默认情况下不缓存 HTTP 错误页面。Amazon Web Services (AWS)团队确认了 CloudFront 上的漏洞,并通过禁止在默认情况下缓存状态码为 400 Bad Request 的错误页面解决了这个问题。这是 AWS 团队针对 CPDoS 所进行的一个默认设置,我们可以自定义错误页响应进一步加强对 CPDoS 的防护。
实施方法一:通过 AWS Console
1. AWS Console 进入 CloudFront 界面(https://console.aws.amazon.com/cloudfront/),点击分配设置或者 distribution ID 进入分配设置;
进入错误页设置
点击创建自定义错误相应按钮,开始设置错误自定义相应。
选择相应的 http 代码,配置错误缓存的最小时间(可以设置为 0,借此防御 CPDoS 攻击)。
自定义错误响应,可以将错误跳转至已配置错误页面(如果服务器端已经配置,该配置可以省略)
二、通过 AWS CLI
Json 文件案例如文件末尾所示
已有分配,通过更新来添加;
简单命令
aws cloudfront update-distribution–distribution-config file://xxx.json–idxxxxxxxx
详细命令参数
新建分配,错误页面配置的 distribution-config 参数 CustomErrorResponses 中;
简单命令
aws cloudfront create-distribution–distribution-config file://xxx.json
详细命令参数
JSON Syntax, 修改 CustomErrorResponses 实现错误页面配置: