HTTP 压缩安全吗?

信息安全 密码学 tls
2021-08-16 11:43:11

CRIME 攻击告诉我们,使用压缩会危及机密性。特别是,将攻击者提供的数据与敏感的秘密数据连接起来,然后对连接进行压缩和加密是很危险的;每当我们在系统堆栈的任何层看到这种情况发生时,我们都应该怀疑类似 CRIME 的攻击的可能性。

现在 CRIME 攻击,至少到目前为止已经公开描述过,是对 TLS 压缩的攻击。背景:TLS 包含一个内置的压缩​​机制,它发生在 TLS 级别(整个连接被压缩)。因此,我们遇到了攻击者提供的数据(例如,POST 请求的正文)与秘密(例如,HTTP 标头中的 cookie)混合在一起的情况,这就是启用 CRIME 攻击的原因。

然而,系统堆栈的其他层也可能使用压缩。我特别想到HTTP 压缩HTTP 协议内置支持压缩通过 HTTP 下载的任何资源。启用 HTTP 压缩后,压缩将应用于响应的正文(但不是标头)。只有浏览器和服务器都支持 HTTP 压缩才会启用,但大多数浏览器和许多服务器都会启用,因为它提高了性能请注意,HTTP 压缩是一种不同的机制来自 TLS 压缩;HTTP 压缩在堆栈的更高级别进行协商,并且仅适用于响应的主体。但是,HTTP 压缩可以应用于通过 SSL/TLS 连接下载的数据,即,应用于通过 HTTPS 下载的资源。

我的问题:在 HTTPS 资源上使用 HTTP 压缩是否安全?我是否需要做一些特殊的事情来禁用通过 HTTPS 访问的资源的 HTTP 压缩?或者,如果 HTTP 压缩在某种程度上是安全的,为什么它是安全的?

2个回答

对我来说这似乎很冒险。HTTP 压缩适用于静态资源,但对于某些通过 SSL 提供的动态资源,HTTP 压缩似乎很危险。在我看来,HTTP 压缩在某些情况下可以允许类似 CRIME 的攻击。

考虑一个具有以下特征的动态页面的 Web 应用程序:

  1. 它通过 HTTPS 提供服务。

  2. 服务器支持 HTTP 压缩(如果浏览器支持 HTTP 压缩,此页面将以压缩形式发送到浏览器)。

  3. 该页面的某处有一个 CSRF 令牌。CSRF 令牌在会话的生命周期内是固定的(比如说)。这是攻击将尝试学习的秘密。

  4. 该页面包含一些可以由用户指定的动态内容。为简单起见,让我们假设有一些 URL 参数直接回显到页面中(可能应用了一些 HTML 转义来防止 XSS,但这很好,不会阻止所描述的攻击)。

然后我认为 CRIME 风格的攻击可能允许攻击者学习 CSRF 令牌并在网站上安装 CSRF 攻击。

让我举个例子。假设目标 Web 应用程序是一个银行网站www.bank.com,而易受攻击的页面是https://www.bank.com/buggypage.html假设银行确保银行资料只能通过 SSL (https) 访问。并且,假设如果浏览器访问https://www.bank.com/buggypage.html?name=D.W.,那么服务器将响应一个看起来像这样模糊的 HTML 文档:

<html>...<body>
Hi, D.W.!  Pleasure to see you again.  Some actions you can take:
<a href="/closeacct&csrftoken=29238091">close my account</a>,
<a href="/viewbalance&csrftoken=...">view my balance</a>, ...
</body></html>

假设您正在通过开放的 Wifi 连接浏览网页,这样攻击者就可以窃听您的所有网络流量。假设您当前已登录您的银行,因此您的浏览器与您的银行网站有一个开放的会话,但您实际上并没有通过开放的 Wifi 连接进行任何银行业务。此外,假设攻击者可以引诱您访问攻击者的网站http://www.evil.com/(例如,可能通过对您进行中间人攻击并在您尝试访问其他 http 站点时重定向您)。

然后,当您的浏览器访问该页面时http://www.evil.com/,该页面会触发对您银行网站的跨域请求,以尝试获取秘密 CSRF 令牌。请注意,允许 Javascript 进行跨域请求。同源策略确实会阻止它看到对跨域请求的响应。尽管如此,由于攻击者可以窃听网络流量,因此攻击者可以观察所有加密数据包的长度,从而推断出通过 SSL 连接到您的银行下载的资源的长度。

特别是,恶意http://www.evil.com/页面可以触发请求https://www.bank.com/buggypage.html?name=closeacct&csrftoken=1并查看生成的 HTML 页面的压缩情况(通过窃听数据包并查看来自银行的 SSL 数据包的长度)。接下来,它可以触发一个请求https://www.bank.com/buggypage.html?name=closeacct&csrftoken=2并查看响应的压缩程度。依此类推,对于 CSRF 令牌的第一个数字的每种可能性。其中一个应该比其他压缩得好一点:URL 参数中的数字与页面中的 CSRF 令牌匹配的那个。这允许攻击者学习 CSRF 令牌的第一个数字。

通过这种方式,攻击者似乎可以学习 CSRF 令牌的每个数字,逐位恢复它们,直到攻击者学习整个 CSRF 令牌。然后,一旦攻击者知道了 CSRF 令牌,他就可以让他的恶意页面www.evil.com触发包含适当 CSRF 令牌的跨域请求——成功击败银行的 CSRF 保护。

如果启用了 HTTP 压缩,当上述条件适用时,这似乎允许攻击者对 Web 应用程序进行成功的 CSRF 攻击。攻击是可能的,因为我们将秘密与攻击者控制的数据混合到同一个有效载荷中,然后对该有效载荷进行压缩和加密。

如果还有其他秘密存储在动态 HTML 中,我可以想象类似的攻击可能会学习这些秘密。这只是我正在考虑的那种攻击的一个例子。因此,在我看来,在通过 HTTPS 访问的动态页面上使用 HTTP 压缩有点冒险。对通过 HTTPS 提供的所有资源禁用 HTTP 压缩可能有充分的理由,静态页面/资源(例如 CSS、Javascript)除外。

一般来说,压缩会改变被压缩的长度(这正是我们压缩的原因)。无损压缩会根据数据本身改变长度(而有损压缩可以达到固定的压缩率,例如严格的 128 kbit/s 的 MP3 文件)。数据长度是通过加密泄露的,这就是我们对它感兴趣的原因。

以一种非常通用的方式,长度泄漏可能是致命的,即使在只有被动攻击者的情况下也是如此;它是一种流量分析一个例子来自第一次世界大战,法国密码学家可以根据(加密)标头的长度预测消息的重要性:一条重要消息被发送给上校(Oberst),而不太重要的消息被标记为中尉(Oberleutnant,一个更长期的术语)。

压缩只会使长度泄漏变得更糟,因为它会阻止您通过规范化消息的长度来修复长度泄漏。

当攻击者可以在压缩的块中添加自己的一些数据时,他会放大长度泄漏,这可以成为任意目标数据的实际攻击向量,正如 CRIME 攻击所展示的那样。但是,我认为问题已经存在。在这种观点看来,HTTP 级别的压缩并不是一个新的风险。它是一个预先存在的风险的加重因素。让攻击者在加密流中添加一些他自己的数据是另一个加重因素,这些因素加起来。


我敢打赌,你不是第一个有这个想法的人。在过去的 10 天里,不仅有很多人(包括我)对此进行了思考,而且如果您尝试访问此 URL:

http://www.google.com/sdfdfskfdjsdfhfkjsbkfbsjksalakjsflfa

然后您会从 Google 收到 404 错误,其中包含“sdfdfskfdjsdfhfkjsbkfbsjksalakjsflfa”字样。嘿,那是攻击者选择的反射数据,这可能很有趣!因此,让我们使用 HTTPS URL 再试一次:

https://www.google.com/sdfdfskfdjsdfhfkjsbkfbsjksalakjsflfa

然后,没有 404,没有乐趣,你被毫不客气地重定向到谷歌的主页。这让我觉得谷歌的一些人也已经想到了这一点,并在使用 SSL 时主动停用了反射位(因为在使用 SSL 时,你会得到 Google+ 的花里胡哨,因此可能会产生危险的数据)。