严重的安全性:GnuTLS 遵循 OpenSSL,修复了定时攻击错误

严重的安全性:GnuTLS 遵循 OpenSSL,修复了定时攻击错误

源节点: 1956368

上周,我们写了一堆 内存管理错误 已在流行的 OpenSSL 加密库的最新安全更新中修复。

除了这些内存错误,我们还报告了一个名为 CVE-2022-4304:RSA 解密中的 Timing Oracle.

在这个错误中,在服务器上一遍又一遍地发射相同的加密消息,但修改数据末尾的填充以使数据无效,从而引发某种不可预测的行为......

…不会花费一致的时间,假设您接近网络上的目标,您可以可靠地猜测该过程的数据传输部分将花费多长时间。

并非所有数据都得到平等处理

如果你发出一个请求,计算出答案需要多长时间,减去低级发送和接收网络数据所消耗的时间,你就知道服务器用了多长时间来进行内部计算来处理请求.

即使您不确定网络中用完了多少时间,您也可以通过发出大量请求并收集大量样本来查找往返时间的变化。

如果网络足够可靠,可以假设网络开销在很大程度上是恒定的,则您可以使用统计方法来推断哪种数据修改会导致哪种额外的处理延迟。

由此,您可以推断出一些关于原始未加密数据的结构甚至内容的信息,这些数据应该在每个重复请求中保密。

即使您只能提取一个字节的明文,那也不应该发生。

所谓 定时攻击 这种事情总是很麻烦,即使你可能需要发送数百万个伪造的数据包并为它们计时,以便有机会恢复一个字节的明文数据......

…因为网络比几年前更快、更可预测,并且能够处理更多的负载。

您可能会认为,例如,在接下来的一个小时内,数以百万计的恶意数据包向您发送垃圾邮件会像一个大拇指一样突出。

但是“每小时比平常多或少一百万包”根本不再是一个特别大的变化。

GnuTLS 中类似的“oracle”错误

好吧,报告 OpenSSL 中 fixed-at-last 错误计时错误的同一个人也报告了一个 GnuTLS 中的类似错误 大约在同一时间。

这个有错误标识符 CVE-2023-0361.

尽管 GnuTLS 不像 OpenSSL 那样流行或广泛使用,但您的 IT 资产中甚至在您自己的计算机上可能有许多程序使用或包含它,可能包括 FFmpeg、GnuPG、Mplayer、QEMU 、Rdesktop、Samba、Wget 和 Wireshark。

具有讽刺意味的是,GnuTLS 中的计时缺陷出现在本应首先记录计时攻击错误的代码中。

从代码差异可以看出(差异) 下面,程序员意识到任何有条件的 (if ... then) 用于检查和处理解密错误的操作可能会产生时序变化,因为 CPU 通常需要不同的时间量,具体取决于代码在“分支”指令之后的执行方式。

(对于经常单向运行而很少反向运行的分支来说尤其如此,因为 CPU 倾向于记住或缓存重复运行的代码以提高性能,从而使不常使用的代码运行速度明显变慢。)

gnutls-3.7.8/lib/auth/rsa.c 与 3.7.9 的代码差异

但是程序员仍然想记录可能正在发生的攻击,如果 if (ok) 上面的测试失败并分支到 else { ... } 部分。

此时,代码调用 _gnutls_debug_log() 函数,这可能需要相当长的时间才能完成它的工作。

因此,编码人员故意插入了一个调用 _gnutls_no_log() ,在 then { ... } 代码的一部分,它假装在没有“攻击”的情况下记录“攻击”,以便尝试平衡代码在任一方向上花费的时间 if (ok) 分支指令可以采取。

然而,显然,这两个代码路径在它们用完的时间(或者可能是 _gnutls_debug_log() 函数本身在处理不同类型的错误时不够一致),并且攻击者可以在尝试一百万次左右后开始区分解密信号。

怎么办呢?

如果你是程序员: 这里的 bug 修复很简单,遵循“少即是多”的原则。

上面粉红色的代码,被认为无论如何都不会提供非常有用的攻击检测数据,被简单地删除了,理由是不存在的代码不能被错误地编译,无论你的构建设置如何......

…并且未编译的代码永远无法运行,无论是意外还是设计。

如果您是 GnuTLS 用户: 最近发布的版本 3.7.9 和“新产品风味” 3.8.0 包含此修复程序以及其他各种修复程序。

如果您运行的是 Linux 发行版,请检查您拥有的任何集中管理的 GnuTLS 共享库版本的更新,以及自带版本的应用程序。

在 Linux 上,搜索名称为 libgnutls*.so 找到周围的任何共享库,并搜索 gnutls-cli 查找通常包含在库中的命令行实用程序的任何副本。

你可以跑 gnutls-cli -vv 找出哪个版本 libgnutls 它动态链接到:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- 我的 Linux 发行版上周五获得了更新 (2023-02-10)

时间戳记:

更多来自 裸体安全