严重的安全性:由过时的加密引起的 Samba 登录错误

严重的安全性:由过时的加密引起的 Samba 登录错误

桑巴,简单地说,是对 Microsoft Windows 中使用的网络协议的超级有用、非常流行、开源的重新实现,它在互联网(将两种不同类型的网络连接在一起)中的历史重要性不可低估。

在 1990 年代后期,Microsoft 网络摆脱了其不透明、专有的性质,成为一种称为 CIFS 的开放标准,CIFS 是 通用互联网文件系统.

但在 1990 年代初期,它没有任何“共同”或“开放”的地方,当时澳大利亚学者安德鲁·特里格尔 (Andrew Tridgell) 着手通过实施一个兼容系统来纠正这一点,该系统可以让他的 Unix 计算机连接到 Windows 网络,反之亦然。

当时,该协议被正式称为 SMB,是 服务器消息块 (您仍然比 CIFS 更频繁地听到这个名称),所以 Tridge,正如 Andrew Tridgell 所熟知的那样,可以理解地将他的项目称为“SMBserver”,因为它就是这样。

但是同名的商业产品已经存在,因此需要一个新的绰号。

就在那时,该项目被称为 桑巴, 一个令人愉快的令人难忘的名字,它来自字典搜索形式的单词 S?M?B?.

事实上, samba 仍然是按字母顺序在门外的第一个词 dict Unix 计算机上常见的文件,后跟相当不合适的词 scramble 和完全不合适的 scumbag:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。

有些错误是你造成的,但有些错误是你得到的

多年来,Samba 项目不仅引入并修复了自己独特的错误,就像任何复杂的软件项目通常所做的那样,而且还继承了底层协议中的错误和缺点,因为它的目标始终是与 Windows 网络无缝协作。

(可悲的是,所谓的 错误兼容性 通常是构建与现有系统协同工作的新系统时不可避免的部分。)

2022 年底,其中一个“遗传性漏洞”被发现并报告给了微软,给出了标识符 CVE-2022-38023,并在 2022 年 XNUMX 月补丁星期二更新中进行了修补。

尽管使用了加密 MAC(消息认证码) 旨在防止欺骗和篡改。

值得注意的是,通过在登录时操纵数据,狡猾的网络犯罪分子可以发动特权提升 (EoP) 攻击。

至少在理论上,他们可以诱使服务器认为他们已经通过了“你有管理员凭据吗?” 测试,即使他们没有这些凭据并且他们的假数据应该没有通过其加密验证。

加密敏捷性

我们决定写下这个相当深奥的错误,并不是因为我们认为您极有可能被它利用(尽管在网络安全方面,我们采取的态度是 永远不要把话说绝了), 但因为它是 另一个提醒 为什么 加密敏捷性很重要.



总的来说, 我们既需要技能也需要永远抛弃旧算法的意愿 一旦发现它们有缺陷,就不要让它们无限期地闲置,直到它们变成别人的问题。 (十年后,那个“其他人”很可能就是我们。)

令人惊讶的是,CVE-2022-38023 漏洞首先存在是因为 Windows 和 Samba 仍然支持基于长期弃用的哈希算法 MD5 的完整性保护风格。

简而言之,使用 Microsoft 版本的 Kerberos 协议的网络身份验证仍然允许数据受到完整性保护(或 校验和,使用有缺陷的密码学的随意但不严格准确的行话。

你不应该再使用 MD5,因为它被认为是坏的:一个坚定的攻击者可以很容易地想出两个不同的输入,最终以相同的 MD5 散列结束。

然而,正如您可能已经知道的那样,任何声称具有加密质量的散列的要求之一是,这根本不应该是可能的。

在行话中,具有相同哈希值的两个输入称为 碰撞,并且不应该有任何编程技巧或快捷方式来帮助您快速找到一个。

应该没有比简单的好运更好的碰撞了——用不断变化的输入文件一遍又一遍地尝试,直到你中奖。

碰撞的真实代价

假设一个可靠的算法,没有可利用的弱点,你会期望一个具有 X 位输出的散列需要大约 2的X 1 试图找到与现有文件的哈希冲突的第二个输入。

即使您只想找到恰好具有相同散列的任意两个输入(两个任意输入,无论内容、大小或结构如何),您预计需要略多于 2X / 2 在您遇到碰撞之前尝试。

任何可以被可靠地“破解”得比它更快的哈希算法在密码学上是不安全的,因为你已经证明它的内部过程用于粉碎 - 切碎 - 和搅拌输入它的数据不会产生真正的伪随机结果。

请注意,任何胜过机会的破解程序,即使它只是略微加快了碰撞生成过程,因此目前在现实生活中不会成为可利用的风险,也会通过破坏其对密码正确性的声明来破坏对底层密码算法的信心.

如果有 2X 不同的可能的哈希输出,您希望在大约一半的尝试后有 50:50 的机会找到具有特定的、预先确定的哈希的输入,并且 2X/ 2 = 2的X 1. 查找任何两个发生冲突的文件都比较容易,因为每次尝试新输入时,如果新哈希与 任何 您已经尝试过的先前输入的一部分,因为允许任何一对输入。 对于“这个巨大的桶中的任何两个文件都可以”类型的碰撞,您的成功几率为 50:50,略高于可能的哈希数的平方根,并且 √2X = 2X / 2. 所以,对于像 MD128 这样的 5 位散列,平均而言,您希望散列大约 2127 匹配特定输出值的块,以及 264 块以查找任何一对冲突输入。

快速 MD5 碰撞变得简单

碰巧的是,您无法轻松生成两个完全不同、不相关的伪随机输入,但它们具有相同的 MD5 哈希值。

而且您不能轻易地从 MD5 散列倒退以发现有关生成它的特定输入的任何信息,这是可靠散列需要保持的另一个加密承诺。

但是,如果您从两个相同的输入开始,并在每个输入流的同一点仔细插入一对经过深思熟虑的“碰撞构建”块,您就可以在几秒钟内可靠地创建 MD5 碰撞,即使是在普通笔记本电脑上也是如此。

例如,这是我们编写的一个 Lua 程序,它可以方便地分成三个不同的部分,每个 128 字节长。

有一个代码前缀以开始 Lua 注释的一行文本结尾(字符串开始 --[== 在第 8 行),然后有 128 字节的注释文本可以替换为我们喜欢的任何内容,因为它在文件运行时被忽略(第 9 到 11 行),并且有一个 128 字节的代码后缀关闭注释(字符串开始 --]== 在第 12 行)并结束程序。

即使您不是程序员,您也可能会看到活动代码读取源代码文件本身的内容 [第 14 行](在 Lua 中,值 arg[0] 第 5 行是您当前正在运行的脚本文件的名称),然后将其打印为十六进制转储 [第 15 行],然后是其 MD5 散列 [第 17 行]:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。

运行该文件本质上是自描述的,并使三个 128 字节的块显而易见:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。

使用 MD5 研究工具 被称为 md5_fastcoll, 最初由数学家创造 马克·史蒂文斯 作为他 2007 年密码学硕士学位的一部分,我们迅速生成了两个 128 字节的“MD5 碰撞构建”块,我们用它们来替换上面文件中显示的注释文本。

这创建了两个文件,它们仍然像以前一样工作,因为更改仅限于注释,这不会影响任何一个文件中的可执行代码。

但它们在几个字节上明显不同,因此应该具有完全不同的哈希值,如下代码 diff(行话为 检测到的差异转储) 显示。

为了清楚起见,我们将 128 字节的碰撞创建块(作为可打印文本没有意义)转换为十六进制:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。

然而,同时运行它们,清楚地表明它们代表了哈希冲突,因为它们最终具有相同的 MD5 输出:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。

探索碰撞复杂性

MD5 是一个 128 位散列,上面的输出字符串清楚地表明了这一点。

所以,如前所述,我们预计需要大约 2128/2或264 平均尝试以产生任何类型的 MD5 冲突。

这意味着处理最少约 18 个 quintillion MD5 哈希块,因为 264 = 18,446,744,073,709,551,616。

在我们的笔记本电脑上估计的峰值 MD5 哈希率约为 50,000,000 块/秒,这意味着我们必须等待超过 10,000 年,尽管资金充足的攻击者可能很容易比这快 10,000 到 100,000 倍,即使他们会等待数周或数月只是为了出现一个随机的(不一定有用的)碰撞。

然而,上面这对双面 Lua 文件,尽管很明显不相同,但它们具有完全相同的 MD5 哈希值,只花了我们几秒钟的时间来准备。

事实上,为 10 个文件生成 10 个不同的碰撞,使用我们自己选择的 10 个不同的起始前缀,花费了我们:14.9 秒、4.7 秒、2.6 秒、2.1 秒、10.5 秒、2.4 秒、2.0 秒、0.14 秒、8.4 秒、和 0.43 秒。

显然,MD5 的加密承诺提供所谓的 抗碰撞性 从根本上被打破了……

......显然乘以至少 25 亿倍,基于我们期望等待发现碰撞的平均时间(数千年,如上所述)除以我们实际测量的最差时间(14.9 秒),同时产生十种不同的碰撞仅适用于本文。

身份验证缺陷解释

但是 CVE-5-2022 中 MD38023 的不安全使用呢?

在 Lua 风格的伪代码中,登录期间使用的有缺陷的消息验证代码是 像这样计算:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。

解释一下:使用的验证码是由 hmac.md5() 第 15 行中的函数调用,使用所谓的 键控散列,在本例中为 HMAC-MD5。

HMAC 的简称 用于生成基于散列的消息认证代码的密码结构,-MD5 后缀表示它在内部使用的哈希算法。

HMAC 使用一个秘密密钥,结合对底层哈希的两次调用(而不是一次)来生成其消息身份验证代码:

严重的安全性:由过时的加密 PlatoBlockchain 数据智能引起的 Samba 登录错误。垂直搜索。人工智能。
上面,我们在内部使用 MD5,所以这种算法的风格被表示为 HMAC-MD5。 在 2023 年被认为安全的替代结构包括 HMAC-SHA-256 和 HMAC-SHA-512,在深红色阶段使用 SHA-256 或 SHA-512 哈希函数。

密钥首先翻转其某些位,并在第一个哈希开始之前添加到提供的数据之前。

当密码破解者试图在散列过程中引发冲突或其他非随机行为时,这会大大降低密码破解者对到达输入数据的第一个字节时散列函数的内部状态的控制。

值得注意的是,密钥可以防止攻击者从他们自己选择的消息前缀开始,就像我们在 twohash.lua 上面的例子。

然后,一旦计算出第一个哈希值,密钥就会翻转一组不同的位,并添加到第一个哈希值之前,然后对这个新的输入数据进行第二次哈希处理。

这也可以防止攻击者操纵 HMAC 计算的最后部分,特别是防止他们将自己选择的后缀附加到哈希过程的最后阶段。

实际上,即使您根本不应该使用 MD5,我们也不知道当前有任何攻击可以在 HMAC-MD5 形式和随机选择的密钥中使用该算法时破坏该算法。

洞在中间

因此,上面伪代码中的可利用漏洞不在任何一行中 hmac.md5() 函数被使用。

相反,错误的核心是第 11 行,您要验证的数据被压缩成一个固定长度的字符串……

.. 通过一次简单的旧 MD5 调用来推动它。

换句话说,无论您在第 15 行选择什么 HMAC 函数,也无论最后一步有多强大和抗冲突,您仍然有机会在第 11 行引起哈希冲突。

简单地说,如果你知道应该进入的数据 chksum() 函数进行身份验证,您可以使用碰撞生成器来查找具有相同 MD5 散列的不同数据块……

…第 11 行意味着你将结束 具有完全相同的输入值 (变量 signdat 在伪代码中)被推入“尽可能安全”的最终 HMAC 步骤。

因此,即使您可能在最后使用强键控消息摘要函数,您仍然可能会验证从冒名顶替者数据派生的 MD5 散列。

少即是多

作为桑巴 安全公告 简洁地描述了问题:

弱点 [...] 是安全校验和计算为 HMAC-MD5(MD5(DATA),KEY),这意味着知道明文数据的主动攻击者可以创建不同的选择 DATA,具有相同的MD5校验和,并在不被检测到的情况下将其代入数据流。

具有讽刺意味的是,遗漏了 MD5(DATA) 上面的 HMAC 公式的一部分,乍一看似乎增加了整体“混合”过程,会提高抗碰撞性。

如果中间没有 MD5 压缩,您将需要在 HMAC-MD5 本身中找到冲突,这在 2023 年可能是不可能的,即使有几乎无限的政府资助,至少在您尝试的网络会话的生命周期内不会妥协。

花了这么长时间?

到现在为止,您可能和我们一样想知道为什么这个错误这么长时间都没有被发现,或者至少没有打补丁。

毕竟, RFC 6151,它的历史可以追溯到 2011 年,并且拥有一个听起来意​​味深长的标题 更新了 MD5 消息摘要和 HMAC-MD5 算法的安全注意事项,建议如下(我们的重点,十多年后):

当用作消息验证码时,对 HMAC-MD5 的攻击似乎并不表明存在实际漏洞。 因此,从现有协议中删除 HMAC-MD5 可能并不紧迫。 但是,由于 MD5 不得用于数字签名,对于新的协议设计, 不应包含带有 HMAC-MD5 的密码套件.

然而,似乎由于绝大多数最近的 SMB 服务器平台在用户尝试登录时都关闭了 HMAC-MD5 身份验证,因此仍然支持这种不安全模式的 SMB 客户端通常从未使用过它(如果他们这样做,无论如何都会失败)试过)。

客户端隐式地似乎受到“保护”,不安全的代码似乎无害,因为既不需要也不使用弱身份验证。

所以潜在的问题从来没有得到应有的关注。

不幸的是,如果您碰巧遇到(或被引诱)接受这种不安全的服务器,这种“假设安全”就完全失败了 chksum() 登录期间的算法。

这种“降级问题”并不新鲜:早在 2015 年,研究人员就设计了臭名昭著的 FREAK僵局 攻击,故意诱骗网络客户端使用所谓的 EXPORT 密码,这是美国政府上个世纪在法律上奇怪地坚持的故意削弱的加密模式。

正如我们当时所写:

EXPORT 密钥长度在 1990 年代被选择为几乎可以破解,但从未扩展以跟上处理器速度的进步。

那是因为出口密码在 2000 年左右被美国放弃了。

他们从一开始就是一个愚蠢的想法:美国公司只是进口没有出口限制的加密软件,损害了他们自己的软件产业。

当然,一旦立法者让步,EXPORT 密码套件就变得多余了,所以每个人都不再使用它们。

可悲的是,许多加密工具包,包括 OpenSSL 和 Microsoft 的 SChannel,都保留了支持它们的代码,因此您(或者,更令人担忧的是,消息灵通的骗子)并没有停止使用它们。

这一次,仍然使用这个损坏的 MD5-plus-HMAC-MD5 进程的服务器中的罪魁祸首似乎是 NetApp 系列,其中 部分产品 显然继续(或直到最近)依赖这种有风险的算法。

因此,您有时可能仍会经历易受攻击的网络登录过程,并面临 CVE-2022-38023 的风险,甚至可能没有意识到。

怎么办呢?

这个bug终于被 处理,至少默认情况下,在最新版本的 Samba 中。

简单地说, Samba 版本 4.17.5 现在强制两个选项 reject md5 clients = yesreject md5 servers = yes.

这意味着涉及 MD5 算法的各种 SMB 网络协议中的任何加密组件(即使它们在理论上是安全的,如 HMAC-MD5),都是 默认禁止.

如果确实需要,您可以重新打开它们以访问网络中的特定服务器。

请确保,如果您确实创建了互联网标准十多年来已经正式建议反对的例外情况……

......你为自己设定了一个日期,在这个日期之前你将永远淘汰那些非默认选项!

密码攻击只会变得更聪明、更快,所以永远不要依赖过时的协议和算法,只是“不再使用”。

将它们从您的代码中完全去除,因为如果它们根本不存在,您就无法使用它们,并且您也不会被试图引诱您陷入不安全感的人所欺骗而使用它们。


时间戳记:

更多来自 裸体安全