共享 DH 群组,全新的秘密:为什么攻击变得更便宜
新的会话秘密修不好弱有限域群组。重复使用同一群组,会让最昂贵的攻击阶段被分摊到每一次协商它的交换上。
群组参数在设计上就是公开的,而正是这种公开性让人容易忽视它们。在有限域 Diffie-Hellman 中,模数与生成元是共享的,而私密指数和由此得到的会话密钥则不是。数域筛法攻击的昂贵阶段取决于群组而不是某一次交换,因此一个到处都在使用的弱群组会变成共同负担。把参数称作公开既准确又无关紧要,因为被重复利用的开销,正是攻击那个群组的开销。
公开的那一半并不是脆弱的那一半,陷阱就在这里
常见的半截论证说:参数已经公开发表在标准里,攻击者早就知道,藏起来也不会改变什么。两个分句都对,但谁也不能推出谁。随设备下发的默认群组是公开的,你上周生成的私密群组同样对任何完成握手的人可见。保密从来不是控制手段;强度与验证才是。
真正改变的是有多少地方共享同一处弱点。一个组织自行生成 2048 位群组,只需为自己的攻击成本买单;而由数百万人选择的协议默认值,却把同一笔成本摊到所有人身上。在这个意义上,冷门群组并不会自动更好。一个规模过小的冷门群组,只是一个盯的人更少的更小的共享秘密。
验证和规模同样重要。对端送来带有小因子的模数,或者送来协议并不期待的形状,即便比特长度看起来体面,也可能泄露关于私密指数的信息。在入口就拒绝畸形参数的库是在做实事,所以才说手写参数解析不是省力的地方。
预计算究竟给攻击者买到了什么
数域筛法有一个阶段只取决于那个素数,其输出可以复用到每一次使用该素数的交换上。这就是历史担忧背后的全部机制:昂贵部分只付一次,之后每个会话的边际成本都会下降。只要群组足够大、使筛法不可行,新鲜指数仍然能保护每一次交换不被被动观察者盯上。两种说法彼此兼容,这个话题上的争论大多来自只挑其中一句、丢掉另一句。
2015 年的 Logjam 论文演示了向 512 位出口级 Diffie-Hellman 的降级,并估计了用可观资源攻击更大、被广泛复用的群组需要多大代价。演示是具体的,估计只是估计,两者都不能证明某个 VPN 会话被解密。
引用这篇论文,是为了机制和那场演示的降级,而不是把它当作对你自身部署的测量。关于多少服务器共享默认群组的旧统计,描述的是那一年的互联网,而不是你今天能检查的网络。真正值得带走的,是这个问题:你的设备是否仍在协商一个规模偏小或验证偏弱的群组?
标准化并不等于弱
RFC 7919 定义了命名的有限域群组,让两端按标识符就某个群组达成一致,并执行同一套策略。标准化是优点,因为它消除了协商的歧义,也让实现可以拒绝不支持的尺寸。一个命名群组之所以弱,只是因为它低于你声称遵循的策略,而不是因为它出现在一份文档里。同样的逻辑适用于椭圆曲线群组,它们的结构不同,失败方式也不同。
推理时要分开不同的构造。关于有限域 Diffie-Hellman 的结论,说明不了 X25519;关于 1024 位 MODP 群组的结论,也说明不了 3072 位的那个。强度策略是按机制、按尺寸、按协议版本分别制定的,所以强大加密这个说法并不是可评审的陈述。
身份认证是另一半,而且不能替代。没有对端验证的强群组,只会把攻击者留在中间;一张有效证书也救不了一次 768 位的交换。把两者当作两条独立线索分别审,然后确认它们确实都被协商了。
在真实连接上读出协商结果
从设备上读协商到的群组,而不是从配置模板上读。模板描述的是意图,真正有价值的是双方在上一次握手中达成的那一项。在 IPsec 端点上,状态输出通常会打印所选提议,其中包含 MODP 群组。
在策略变更前后各记录一行,并把两行都留在变更记录里。比较本身就是证据。
ipsec statusall | grep -Ei "proposal|ESP|IKE"
openssl dhparam -in /etc/vpn/dh3072.pem -check -noout如果改完之后状态还显示旧群组,说明连接并没有重新协商,配置改动什么也没证明。重启对端或清除安全关联,然后再读一次状态。只在新建连接上执行的策略,会让长期隧道的旧参数一直保留到它下线为止。
分别检查群组和对端身份
把群组保护什么、另一端是谁分开看。把密钥交换方式、群组尺寸和认证方式记成三个字段,因为它们各自独立失效。协商了 3072 位群组却接受任意证书的隧道,与固定对端并使用 2048 位群组的隧道,并不是同一种风险。
在审查开始前写好验收标准,这样结果才是比较而不是意见。按协议版本给出最小群组尺寸、命名群组白名单和强制对端验证,就足以让判断变成机械操作。正是这份清单里的含糊,把审查变成争论,而争论不会得到整改。到那时,产出就是一份不满足既定规则的端点清单。
ipsec statusall | grep -Ei "peer|auth|cert"
openssl s_client -connect vpn.acme.example:443 -brief -cipher 'DHE-RSA-AES256-GCM-SHA384'修复之后再读一次协商值,才算闭环。一份合规的配置文件,不能证明某条隧道已经采用了它。状态输出和一次新的握手才是证据,而收集它们花的时间,比开一场讨论要不要收集的会要少。