### 漏洞概述 - **漏洞名称**: Validate SMTP server certificate on STARTTLS upgrade #65346 - **漏洞描述**: `smtplib.SMTP.starttls()` 在没有传递 SSL 上下文的情况下不会验证服务器证书。`airflow.utils.email.send_raw_email` 和 SMTP 提供者的 `get_conn` 和 `async_get_conn` 方法在没有上下文的情况下调用 `starttls()`,导致 STARTTLS 升级时跳过证书验证。 ### 影响范围 - **受影响组件**: - `airflow-core/src/airflow/utils/email.py` - `providers/smtp/src/airflow/providers/smtp/hooks/smtp.py` - **影响版本**: Airflow 3.2.2 ### 修复方案 - **修复内容**: - 将现有的 SSL 上下文机制传递给 `starttls()` 在所有三个调用点。 - 从 `_get_smtp_connection` 中提取 SSL 上下文查找逻辑到 `_build_ssl_context()`,由现有的 `email.ssl_context` 配置驱动。 - 从 `_build_ssl_context()` 中提取 SSL 上下文查找逻辑到 `_build_ssl_context()`,由现有的 `ssl_context` 连接额外配置驱动。 - **默认行为变更**: - 默认 SSL 上下文现在使用 `ssl.create_default_context()`,该上下文会根据系统信任的 CA 进行验证。 - 环境有意使用自签名证书或其他不验证 SMTP 服务器的用户可以选择不验证: - Core: 设置 `email.ssl_context = "none"` 在 `airflow.cfg` 中。 - Provider: 设置 `ssl_context: "none"` 在 SMTP 连接额外配置中。 - **测试计划**: - `airflow-core/tests/unit/tests/test_email.py` - 25/25 通过 - `providers/smtp/tests/unit/smtp/hooks/test_smtp.py` - 34/34 通过(包括同步 `test_who_called_after_starttls` 和异步 `test_async_connection` 更新以验证 `starttls` 被调用时带有 `ssl.SSLContext`) ### POC 代码 - 页面中未包含具体的 POC 代码或利用代码。