篡改 /etc/ssh/moduli 的后果

信息安全 密码学 SSH 后门
2021-08-16 20:38:29

如果攻击者能够修改/etc/ssh/moduli文件,会有什么后果?

1个回答

包含Diffie-Hellman/etc/ssh/moduli预生成参数DH 密钥交换发生在 SSH 连接的早期步骤,并生成将用于加密数据的秘密共享密钥。DH 在给定的小组中工作;从技术上讲,模数p(一个大素数整数)和一个生成器g:生成器在1..p-1范围内,并且它的阶应该是“足够大”素数q的倍数。k是最小的非零整数,使得p k = 1 mod p离散对数,因此 DH,可以通过取决于p和k的最大素数因子(我们称之为q )的努力来突破

  • 如果p不够大,有一个数字域筛的变体会破坏离散对数;当前的记录是针对530 位素数的,并且假设 1024 位素数仍然是安全的 [ Ed。不再是,请参阅 2015 年 10 月 15 日有关 Diffie-Hellman 的各种博客文章。],并且在可预见的未来,2048 位素数将是安全的。

  • 通用离散对数算法的应用成本与k的最大素因子的平方根成正比因此,如果要实现“100 位安全性” ,那么k允许至少 200 位的素数因子是重要的(且足够的)

可以修改的攻击者可以/etc/ssh/moduli尝试用其他看起来不错但使 DH 破坏更容易(甚至更容易)的组参数替换好的 DH 组参数主要有两种方法可以做到这一点:

  1. 选择一个素数p和一个生成器g使得 g 的阶k只有小的素数的乘积。这很容易做到;例如,首先生成一堆小素数(每个最多 80 位);然后尝试这些素数的随机乘积:对于每个乘积r,计算p = 2r+1并查看是否产生素数。如果是这样,那么p使得任何以素数为模的生成器g都将暗示弱 Diffie-Hellman。

  2. 生成一个特殊的素数p,以便 NFS 对于该特定p更快。有关一些理论背景,请参阅本文

/etc/ssh/moduli文件不包含建议生成器的顺序,因此您不能简单地验证该顺序是否为素数并与g匹配。但是,您可以取p-1并对其应用椭圆曲线分解方法:这将找到p-1中的所有小素因数,从而允许您检查g的阶数没有被削弱(k是必然是除数或p-1)。因此,可以检测到第一种减弱(尽管不是在几秒钟内)。相应地,不喜欢暴露风险的攻击者(尤其是间谍机构)将避免使用该方法。

然而,第二种减弱是难以察觉的。因此,必须假设可能以某种方式破坏您的/etc/ssh/moduli文件的攻击者(例如,通过改变OpenSSH分发的文件,通过一些贿赂 OpenSSH 开发人员)可能已经引入了一个后门,允许他随意解密您的 SSH 连接( SSH 连接到您的服务器,因为组参数由服务器选择)。由于所涉及的数学并不简单,因此该攻击者至少会是一个称职的攻击者。

唯一好的对策是用您自己生成的正确且无恶意的值替换/etc/ssh/moduli内容。可以做到这一点(参见手册页)。您也可以使用一些自定义代码来做到这一点(例如,使用 Java 的类,最多只有 50 行代码)。ssh-keygenBigInteger

或者,使用如FIPS 186-4的附件 A 中所述生成的 DSA 组参数(它们也可以工作):这些都是无意义的数字,因为p的候选值是通过确定性的、完全指定的PRNG,据推测,它不能被强制生成一个“特殊素数”,这使得 NFS 变得容易。如果 OpenSSH 开发人员一开始就使用这种可验证的生成方法,那就更好了。