漏洞概述 TLS 1.2 和 DTLS 客户端接受未提供的匿名密码套件,绕过服务器身份验证。 Erlang/OTP ssl TLS 1.2(及更早版本)和 DTLS 客户端不验证服务器在 ServerHello 中选择的密码套件是否在客户端 ClientHello 中提供的套件中。客户端 tls_handshake:hello/5 处理程序验证协商的协议版本和降级哨兵,并将服务器选择的套件直接传递给 ssl_handshake:handle_server_hello_extensions/9,后者在没有成员资格检查的情况下安装它。TLS 1.3 客户端路径执行此检查(根据 RFC 8446),因此不受影响。 在客户端和预期服务器之间的路径上,攻击者可以使用 ServerHello 响应匿名密钥交换套件,如 TLS_DH_anon_ 或 TLS_ECDH_anon_,这些套件客户端未提供。匿名套件不需要服务器出示证书,因此整个 verify_peer 和 ca_certs 配置被绕过。攻击者使用自己的临时参数完成握手,不验证证书,不检查主机名,ssl:connect 返回 {ok, Socket}。所有后续应用流量都可读且可被攻击者修改。 此问题影响 OTP 从 OTP 17.0 之前到 OTP 29.0.4、OTP 28.5.0.4 和 OTP 27.3.4.15,对应于 ssl 从 5.3.4 之前到 11.7.4、11.6.0.4 和 11.2.12.11。 影响范围 Erlang/OTP ssl: - 模块: tls_handshake, ssl_handshake, ssl - 源文件: src/tls_handshake.erl, src/ssl_handshake.erl - 例程: tls_handshake:hello/5, ssl_handshake:handle_server_hello_extensions/9, ssl:connect/2, ssl:connect/3, ssl:connect/4 - 状态: 受影响 - 类型: otp - 版本: 5.3.4 - 更改/修复: - 在 11.7.4 中不受影响 - 在 11.6.0.4 中不受影响 - 在 11.2.12.11 中不受影响 pkg:github/erlang/otp: - 模块: tls_handshake, ssl_handshake, ssl - 源文件: lib/ssl/src/tls_handshake.erl, lib/ssl/src/ssl_handshake.erl - 例程: tls_handshake:hello/5, ssl_handshake:handle_server_hello_extensions/9, ssl:connect/2, ssl:connect/3, ssl:connect/4 - 状态: 受影响 - 类型: otp - 版本: 17.0 - 更改/修复: - 在 29.0.4 中不受影响 - 在 28.0.0.4 中不受影响 - 在 27.3.4.15 中不受影响 - 状态: 受影响 - 类型: git - 版本: 84adefa331 - 更改/修复: - 在 904e29d414 中不受影响 - 在 0a82596d42 中不受影响 - 在 6ff938110 中不受影响 修复方案 仅通过设置版本到 在客户端的 ssl 选项中,限制客户端连接到 TLS 1.3。TLS 1.3 客户端路径执行所需的密码套件成员资格检查,并且不受影响。 利用还需要在路径上(中间人)攻击者之间进行。 配置 该漏洞仅影响使用 TLS 1.2(或更早版本)或 DTLS 的 TLS 客户端。TLS 1.3 客户端连接执行密码套件成员资格检查,并且不受影响。服务器不受影响。利用还需要在路径上(中间人)攻击者之间进行。 参考 GitHub 安全公告 OSV 漏洞 GitHub 提交 GitHub 提交 GitHub 提交 贡献者 发现者: Jonatan Männchen / EEF 修复开发者: Ingela Anderton Andin 修复审查者: Jakub Witczak