BREACH Attack on HTTP Compression
针对 HTTP 压缩的 BREACH 攻击
描述
该漏洞表明服务器易受 BREACH 攻击的影响,这些攻击利用 HTTP 压缩,通过测量压缩响应大小,从加密的 HTTPS 响应中提取敏感信息。
当机密(CSRF 令牌、会话数据)和用户输入出现在同一个压缩的 HTTP 响应中时,就会发生 BREACH(通过自适应超文本压缩进行浏览器侦察和数据渗出)。压缩算法会创建可检测的模式,从而泄露有关机密的信息。
工作原理:
- 恶意 JavaScript 使用受害者的 Cookie 向目标网站发出请求
- 攻击者通过URL参数或表单数据注入猜测
- 当猜测量与机密的一部分匹配时,响应压缩得更好(大小更小)
- 通过测量响应大小,攻击者逐步提取机密
要求:
- 启用了HTTP压缩(gzip/deflate)
- 用户输入反映在 HTTP 响应正文中
- 与用户输入在同一响应中的机密
- 允许进行多次请求
示例场景: Web 应用程序在 JSON 响应中包含 CSRF 令牌以及用户提供的搜索词。攻击者使用部分匹配 CSRF 令牌模式的不同搜索词来制作请求,观察压缩的响应大小以逐渐提取整个令牌。
该攻击可以在一分钟内通过数千次请求提取机密,从而导致会话劫持、CSRF绕过和敏感数据泄露。
建议
为了缓解 BREACH 攻击,请实施以下策略:
主要缓解措施:
-
禁用敏感页面的HTTP压缩 - 关闭包含机密的响应的gzip/deflate压缩,仅压缩静态资产,不压缩包含机密的动态内容。
-
将机密与用户输入分开 - 确保敏感数据绝不会与用户控制的输入出现在同一个 HTTP 响应中。对于不反映用户输入的敏感操作,使用单独的端点。
-
对每个请求随机化机密 - 频繁生成新的CSRF令牌,并定期轮换会话标识符,以限制攻击者的机会窗口。
实施示例:
# 禁用敏感端点的压缩
location /api/csrf { gzip off; }
location /user/ { gzip off; }
# Flask:禁用压缩中间件
app.config['COMPRESS_MIMETYPES'] = []
# Django:从MIDDLEWARE设置中删除GZipMiddleware
MIDDLEWARE = [
# ... 其他中间件,但不要包含:
# 'django.middleware.gzip.GZipMiddleware',
]
附加防御措施:
- 向包含机密的响应添加随机填充
- 实施速率限制(用户输入端点每分钟 10 个请求)
- 监视表明潜在攻击的可疑请求模式。
- 使用双重提交Cookie CSRF保护方法
链接
标准
- SOC2_CONTROLS:
- CC_6_7
- CC_7_1
- CCPA:
- CCPA_1798_150
- GDPR:
- ART_32
- PCI_STANDARDS:
- REQ_4_1
- REQ_6_5
- REQ_11_3
- HIPAA_CONTROLS:
- SECURITY252
- SECURITY212
- SECURITY213