SSL/TLS 默认版本可能不安全¶
ID: py/insecure-default-protocol
Kind: problem
Security severity: 7.5
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-327
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
当未指定特定协议版本时,ssl.wrap_socket
函数默认使用不安全的 SSL/TLS 版本。这可能使连接容易受到攻击。
建议¶
确保使用现代的强协议。所有版本的 SSL 以及 TLS 1.0 和 1.1 都是已知的容易受到攻击。强烈建议使用 TLS 1.2 或更高版本。如果未指定显式 ssl_version
,则选择默认的 PROTOCOL_TLS
。此协议不安全,因为它允许 TLS 1.0 和 TLS 1.1,因此不应使用。
示例¶
以下代码展示了使用 SSL 或 TLS 建立连接的两种不同方法。它们都可能不安全,因为它们使用默认版本。
import ssl
import socket
# Using the deprecated ssl.wrap_socket method
ssl.wrap_socket(socket.socket())
# Using SSLContext
context = ssl.SSLContext()
以上两种情况都应更新为使用安全协议,例如,通过将 ssl_version=PROTOCOL_TLSv1_2
作为关键字参数指定。
后面的示例也可以通过在创建连接之前修改创建的上下文来使其安全。因此,此查询不会标记它。但是,如果在上下文安全之前创建连接(例如,通过设置 minimum_version
的值),则代码应由查询 py/insecure-protocol
标记。
请注意,ssl.wrap_socket
已在 Python 3.7 中被弃用。推荐的替代方案是
ssl.SSLContext
- 在 Python 2.7.9、3.2 及更高版本中支持ssl.create_default_context
- 一个便利函数,在 Python 3.4 及更高版本中支持。即使使用这些替代方案,也应确保使用安全协议。以下代码说明了如何使用标志(从 Python 3.2 开始可用)或 `minimum_version` 字段(从 Python 3.7 开始推荐)来限制创建连接时接受的协议。
import ssl
# Using flags to restrict the protocol
context = ssl.SSLContext()
context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
# Declaring a minimum version to restrict the protocol
context = ssl.create_default_context()
context.minimum_version = ssl.TLSVersion.TLSv1_2
参考资料¶
维基百科: 传输层安全.
Python 3 文档: 类 ssl.SSLContext.
Python 3 文档: ssl.wrap_socket.
Python 3 文档: 关于上下文创建的说明.
Python 3 文档: 关于安全注意事项的说明.
常见弱点枚举: CWE-327.