SSH 中的公钥身份验证是否可以防止大多数 MITM 攻击?

信息安全 SSH 中间人 不对称 diffie-hellman 脆弱性
2021-08-20 23:43:44

我发现这篇文章声称 DH 获得的密钥的非对称加密签名可以防止 MITM:

http://www.gremwell.com/ssh-mitm-public-key-authentication

关键思想:

'signature' 的值是对应私钥对以下数据的签名,顺序如下:

string    session identifier
byte      SSH_MSG_USERAUTH_REQUEST

现在攻击者遇到了一个问题,因为客户端和服务器对于会话标识符应该是什么有不同的想法。显然,服务器将拒绝客户端提供的签名,公钥认证将失败。

我想验证我对此的理解是否正确:

假设 Alice ( A) 是客户端,MITM ( M) 是攻击者, Bob ( B) 是 ssh 服务器。

假设:

  • M位于通信的中间,拦截和之间的所有A通信B

  • M不知何故被骗A以为他是B,也被骗B以为他是A(重新指纹等)。

  • 但是,M没有设法穿透A's 的机器和B's 的机器,将A's 的公钥留A在机器上的帐户中B完好无损

只要上述条件保持在这个之上:

会话标识符是基于(除其他外)由对等方使用 Diffie-Hellman 算法协商的共享秘密计算的。

=> 虽然M可以伪造 DH 交换到AB,但这些必须是 2 个不同的(假的)共享秘密(除非有某种方法可以通过修改交换的 DH 号码而不是通过观察它们M来妥协)。

当此共享机密用作创建要签名的数据(会话标识符的一部分或全部)的组件时,M不能伪造且不知道的一件事是A将用于基于(1)签署会话 ID 的私钥伪造的共享秘密。

因此,会话 ID 的数字签名(+上面描述的其他会话数据)在 处验证失败B,或者会话 ID 将不匹配,从而有效地中断通信。

问题:

  1. 这个推理正确吗?如果没有,错误在哪里?

  2. 会话 ID 创建是该链中的“最薄弱环节”吗?也就是说,如果M可以预测它(例如,如果它是易受统计攻击的可预测单向哈希,即使 DH 本身不是)并以某种方式猜测它(非常不可能,是的,但它甚至在理论上是不可能的吗?),那么M会有“真正的”会话ID签名A,所以B会认为身份验证签名可以吗?

我意识到这在实践中几乎是不可能的,但在理论上是完全不可能的吗?

2个回答

1.是的,它是正确的。有两种可能的方式:

A) Alice 盲目地接受来自攻击者 mallory 的新指纹。Alice 和 Mallory 可以相互连接和验证。Mallory 的问题是,他无法签署与 Bob 交换的会话 id。因为 Mallory 不拥有 Alice 的私钥。而且,Mallory 也无法将签名的会话 ID 从 Alice 重定向到 Bob,因为会话 ID 很可能是不同的。

B) 当 Alice 不盲目接受新指纹时,Mallory 可以从 Bob 发送公钥及其指纹。这里的问题是 Mallory 无法向 Alice 进行身份验证,因为 Mallory 不拥有 Bob 的私钥。

注意:在案例 A) 中,当 Alice 也接受密码验证时,malory 将配置他的服务器以使用密码验证对客户端进行验证,因此 mallory 将获得用户名和密码。


2.是的,理论上是可以的。参见 A),为什么 Alice 不接受 Bob 的正确签名 ID?她会接受 :) 而且 Alice 也会接受 Bob 的正确签名 ID。Mallory 只需要在连接建立时向 Alice 展示 Bob 的公钥。

这就是失败的地方。你假设:

M somehow tricked A into thinking that he's B and also tricked B into thinking he's A (re fingerprints etc).

指纹是无法复制的东西。指纹(也称为 HMAC)是密钥的散列。密钥永远不会被传输,而是由客户端和服务器使用预先存储的主密钥独立计算。

在 PKI 中,私钥和公钥很有用,因为 a) 私钥不能从公钥中导出,b) 公钥可用于加密可用服务器私钥解密的数据,反之亦然。

因此,在不知道服务器私钥的情况下,您永远无法对 SSH 会话执行有用的 MITM 攻击。另外,大多数时候 SSH 只是恢复一个会话而不是协商一个新的会话。这涉及以纯文本形式发送会话 ID,但使用预先确定的密码套件恢复加密,在这种情况下,攻击者或 [M] 不知道该密码套件。