跳转至

BREACH Attack on HTTP Compression

针对 HTTP 压缩的 BREACH 攻击

描述

该漏洞表明服务器易受 BREACH 攻击的影响,这些攻击利用 HTTP 压缩,通过测量压缩响应大小,从加密的 HTTPS 响应中提取敏感信息。

当机密(CSRF 令牌、会话数据)和用户输入出现在同一个压缩的 HTTP 响应中时,就会发生 BREACH(通过自适应超文本压缩进行浏览器侦察和数据渗出)。压缩算法会创建可检测的模式,从而泄露有关机密的信息。

工作原理:

  1. 恶意 JavaScript 使用受害者的 Cookie 向目标网站发出请求
  2. 攻击者通过URL参数或表单数据注入猜测
  3. 当猜测量与机密的一部分匹配时,响应压缩得更好(大小更小)
  4. 通过测量响应大小,攻击者逐步提取机密

要求:

  • 启用了HTTP压缩(gzip/deflate)
  • 用户输入反映在 HTTP 响应正文中
  • 与用户输入在同一响应中的机密
  • 允许进行多次请求

示例场景: Web 应用程序在 JSON 响应中包含 CSRF 令牌以及用户提供的搜索词。攻击者使用部分匹配 CSRF 令牌模式的不同搜索词来制作请求,观察压缩的响应大小以逐渐提取整个令牌。

该攻击可以在一分钟内通过数千次请求提取机密,从而导致会话劫持、CSRF绕过和敏感数据泄露。

建议

为了缓解 BREACH 攻击,请实施以下策略:

主要缓解措施:

  1. 禁用敏感页面的HTTP压缩 - 关闭包含机密的响应的gzip/deflate压缩,仅压缩静态资产,不压缩包含机密的动态内容。

  2. 将机密与用户输入分开 - 确保敏感数据绝不会与用户控制的输入出现在同一个 HTTP 响应中。对于不反映用户输入的敏感操作,使用单独的端点。

  3. 对每个请求随机化机密 - 频繁生成新的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