使用 Paramiko 接受未知 SSH 主机密钥¶
ID: py/paramiko-missing-host-key-validation
Kind: problem
Security severity: 7.5
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-295
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
在 Secure Shell (SSH) 协议中,主机密钥用于验证远程主机的身份。接受未知主机密钥可能会使连接容易受到中间人攻击。
建议¶
不要接受未知主机密钥。特别是,不要将 Paramiko 库的默认缺少主机密钥策略设置为 AutoAddPolicy
或 WarningPolicy
。即使主机密钥未知,这两种策略也会继续执行。RejectPolicy
的默认设置是安全的,因为它会在遇到未知主机密钥时抛出异常。
示例¶
以下示例展示了两种与 example.com
建立 SSH 连接的方法。第一个函数将缺少主机密钥策略设置为 AutoAddPolicy
。如果主机密钥验证失败,客户端将继续与服务器交互,即使连接可能已被破坏。第二个函数将主机密钥策略设置为 RejectPolicy
,如果主机密钥验证失败,它将抛出异常。
from paramiko.client import SSHClient, AutoAddPolicy, RejectPolicy
def unsafe_connect():
client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy)
client.connect("example.com")
# ... interaction with server
client.close()
def safe_connect():
client = SSHClient()
client.set_missing_host_key_policy(RejectPolicy)
client.connect("example.com")
# ... interaction with server
client.close()
参考资料¶
Paramiko 文档:set_missing_host_key_policy.
常见弱点枚举:CWE-295.