Web Cache Deception 攻击诱骗用户访问看似指向静态资源但实际从源站返回动态、个性化内容的 URL。
当源站将不存在路径的请求视为等同于父路径时,此攻击会生效——例如,当 http://www.example.com/newsfeed 是为每个已认证用户返回不同内容的动态页面,且源站对 /newsfeed/foo.jpg 也返回相同响应时。由于路径以 .jpg 结尾,Cloudflare 默认会缓存该响应。攻击者随后访问同一 URL 并收到该用户个性化内容的缓存副本。
您可以通过创建缓存规则保护用户免受 Web Cache Deception 攻击。使用此规则,您可以继续缓存静态资源,但规则会验证 URL 的扩展名是否与返回的 Content-Type 匹配。
在上面的 newsfeed 示例中,如果 http://www.example.com/newsfeed 是输出网页的脚本,则 Content-Type 为 text/html。另一方面,http://www.example.com/newsfeed/foo.jpg 预期 Content-Type 为 image/jpeg。当发现可能导致 Web Cache Deception 攻击的不匹配时,Cloudflare 不会缓存该响应。
- 如果返回的
Content-Type为application/octet-stream,扩展名无关紧要,因为这通常是向浏览器发出保存而非显示资源的信号。 - Cloudflare 允许
.jpg以image/webp提供,或.gif以video/webm提供,以及其他不太可能是攻击的情况。 - 请记住,Cache Deception Armor 依赖于源站 Cache Control。来自源站的
Cache-Control标头,或 Edge Cache TTL Cache Rule 可能会覆盖此保护。
要启用 Cache Deception Armor,您需要先创建缓存规则。请按照以下步骤操作:
-
在 Cloudflare 仪表板中,前往 Cache Rules(缓存规则) 页面。
Go to Cache Rules ↗ -
选择 Create rule(创建规则)。
-
在 When incoming requests match(当传入请求匹配时) 下,定义规则表达式。
-
在 Then(然后) 下的 Cache eligibility(缓存资格) 部分,选择 Eligible for cache(符合缓存条件)。
-
向规则添加 Cache Key(缓存键) 设置并开启 Cache deception armor(缓存欺骗防护)。
-
要保存并部署规则,选择 Deploy(部署)。如果尚未准备好部署,选择 Save as Draft(保存为草稿)。