SSH-MITM项目中的简易认证问题分析
什么是简易认证问题
简易认证(Trivial Authentication)是一种特殊的网络认证问题,由Manfred Kaiser(AUT-milCERT)与Simon Tatham(PuTTY)、Matt Johnston(Dropbear)在安全审计中发现。这种问题涉及SSH认证机制中的某些特性,可能导致客户端完成非预期的登录过程。
问题原理详解
简易认证方法指的是那些不需要客户端任何交互即可完成的认证方式。最典型的例子是"none"认证方法,它允许客户端无需任何凭证即可直接连接服务器。在大多数情况下,如果连接成功,客户端会简单地接受这个结果。
当SSH密钥使用FIDO2令牌保护时(OpenSSH 8.2+版本支持),可能会遇到这种情况:通过这种方式绕过FIDO2令牌的确认步骤。如果启用了SSH代理转发,可能会使用受FIDO2保护的密钥连接其他服务器。
从用户角度来看,整个过程看起来完全正常:
- 用户预期只需要确认一次密钥使用
- 中间服务器使用不需要私钥的认证方法完成连接
- 只有特定的连接行为才需要确认
- 用户的预期被满足,通常会允许私钥访问
相关安全问题
这种问题影响了多个主流SSH实现:
- PuTTY: CVE-2021-36367
- OpenSSH: CVE-2021-36368
- Dropbear: CVE-2021-36369
认证方法分析
none认证
最简单的连接方式是使用"none"认证。这种方式允许客户端无需登录即可访问服务器。对中间服务器来说,这意味着不会执行其他认证方法。
但"none"认证有几个缺点:
- 强制客户端立即连接
- 失去测试其他认证方法的机会
- 某些服务器可能对特定用户要求公钥认证,而对其他用户只需密码
公钥认证
公钥认证是一种非简易认证方法,因为客户端需要使用私钥创建签名,由服务器验证。客户端无法绕过签名过程,只能完全执行或拒绝公钥认证。
然而,公钥认证仍然是针对FIDO2/SSH-Askpass保护密钥的重要组成部分。需要检查所有公钥与实际目标服务器的匹配情况,以确定哪些密钥可能用于连接。
键盘交互认证
实际的连接问题发生在"keyboard-interactive"认证方法中。这种方法可以向客户端发送任意数量的提示(prompt)。关键点在于:
- 如果发送0个提示,不需要客户端交互
- 如果发送至少1个提示,用户必须进行输入
- 发送0个提示时,"keyboard-interactive"成为简易认证
SSH-MITM中的实现示例
SSH-MITM项目提供了完整的FIDO2令牌连接实现。当使用SSH-Askpass和/或FIDO2密钥时,私钥的使用总是需要手动批准。如果发生中间连接,需要两次认证(一次在中间服务器,一次在远程服务器),用户需要确认两次私钥使用。
连接实施步骤
- 启动SSH-MITM服务器并启用简易认证:
ssh-mitm server --remote-host TARGET --enable-trivial-auth
- 客户端使用代理转发连接到SSH-MITM:
ssh -A -p 10022 localhost
验证正常行为
要验证公钥认证在中间服务器和远程服务器上的默认行为,可以这样启动SSH-MITM:
ssh-mitm server --remote-host TARGET
然后客户端连接:
ssh -A -p 10022 localhost
在这种情况下,客户端必须使用"publickey"认证到SSH-MITM服务器,这需要一次确认。成功连接中间服务器后,代理被请求,开始连接远程主机,这需要ssh-askpass的第二次确认。
安全建议
-
对于使用FIDO2保护密钥的用户,建议:
- 仔细检查每次密钥使用确认的上下文
- 注意异常的确认请求
-
对于系统管理员,建议:
- 禁用不必要的认证方法
- 监控异常的连接行为
- 及时更新SSH客户端和服务器软件
-
对于开发者,建议:
- 实现更明确的确认界面,显示目标服务器信息
- 增加对异常连接的检测机制
通过理解这种问题的运作原理,用户和系统管理员可以更好地保护自己的SSH连接安全。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考