CodeQL 文档

使用 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

单击以在 CodeQL 仓库中查看查询

在 Secure Shell (SSH) 协议中,主机密钥用于验证远程主机的身份。接受未知主机密钥可能会使连接容易受到中间人攻击。

建议

不要接受未知主机密钥。特别是,不要将 Paramiko 库的默认缺少主机密钥策略设置为 AutoAddPolicyWarningPolicy。即使主机密钥未知,这两种策略也会继续执行。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()

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私