在 TLS 中使用填充的 RC4 偏置保护

信息安全 tls 网页浏览器 rc4
2021-08-12 03:28:35

在回答我之前关于 TLS 中的 RC4 漏洞的问题时,Thomas Pornin 给出了一个很好的答案,他说:

“修复” RC4 的一种方法已被多次建议,是删除前 256(或 512 或 1536 或其他)字节的输出,因为这些是其中最有偏见的(幻灯片中的图形显示相当清楚地)。但这与 RC4-as-we-know-it 不兼容

对此感到好奇并且对 HN的评论提出了一个有趣的建议,我想知道浏览器(甚至浏览器插件)是否可以填充 HTTP 请求,以便前 256 个字节(或 512 或其他)只是一些无用的标头。例如

GET / HTTP/1.1
X-Padding-Header: <256 bytes of random text>
Accept: */*
...

据我所知,未知的标头被忽略(?),这将确保请求中的第一个字节既无用(猜测它们没有价值)又是随机的。

这是一个愚蠢的解决方法,可能弊大于利吗?或者如果浏览器要修复它,他们还不如升级到 TLS 1.2?

(当然,如果 URL 本身包含敏感信息并且足够长,它将出现在请求头之前的请求中,因此这种“保护”可能对此无济于事,但可能足以保护 cookie?)

2个回答

正如@DW 指出的那样,这将起作用——保护cookie路径本身位于标头之前,如果它在可预测的位置包含敏感数据,也可能存在风险(这在当今并不常见,但用于会话管理的 URL 重写曾经很流行)

一个变体看起来像这样:

GET / HTTP/1.1
X-Header-Padding1: <X random padding bytes>
Accept: */*
Cookie: ...
...
X-Header-Padding2: <Y random padding bytes>

通过随机选择XY但这样X+Y是固定的,流中 cookie 的位置将在请求之间发生变化,攻击者无法检测到(因为标头的总长度是恒定的)。虽然不如简单地删除请求的前 256 个字节那么令人满意,但这应该足以将基于偏见的攻击恢复到数十亿个请求中,而不是数百万个请求,而且只需不到 256 个额外字节即可完成每个请求的字节数(X+Y = 32应该这样做)。

这对于我所知道的所有攻击都是安全的。

从安全角度来看,它并不完全等同于删除前 256 或 512 个字节。根据您的提议,攻击者有一些已知的明文(例如,来自 GET 行和 X-Padding-Header),而如果您丢弃前 256 个字节,攻击者就不会在这些位置获得已知的明文。从理论上讲,如果知道 RC4 输出的前 256 个字节中的某些字节允许攻击者恢复密钥,那么您的方案将是不够的。但是,我不知道对这种形式的 RC4 的任何攻击。在实践中,所有已知的对 RC4 的攻击都表明 RC4 输出的第一个字节中的一个或两个略有偏差,因此它们不会像您想要的那样隐藏明文——但这种偏差不会允许攻击者推断出 RC4 密钥。所以从安全的角度来看,在实践中,

但是...从性能的角度来看,您刚刚为通过 SSL 发送的每个请求添加了 256 个字节。这对性能非常不利。这个性能问题可能足以扼杀这个提议;它可能不是一个可行的部署候选者。

如果浏览器想要修复它,最好简单地更新到 TLS 1.2 和更安全的密码套件。