CVE-2026-123613
Rustls 0.23.13 before 0.23.45 TLS 1.3 Handshake Encryption Level Bypass
CVE-2026-123613 is a medium vulnerability (CVSS 6.9) in Rustls, published September 14, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.16%, the 4th percentile. Fixed in rustls 0.23.45.
- Severity
- 6.9 MediumCVSS 4.0, CVE List
- Exploit chance
- 0.16%EPSS, 4th percentile
- Exploitation
- None knownNot on CISA’s or ENISA’s lists
- Fixed in
0.23.45rustls +11 more
Description
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
rustlscrates.io | 0.23.13 up to 0.23.45 | 0.23.45 |
kata-containersAzure Linux:3 | through 4.1.0.kata2-1 | None known |
kata-containers-ccAzure Linux:3 | through 3.15.0.aks0-24 | None known |
rustAzure Linux:3 | through 1.75.0-31 | None known |
rustAzure Linux:3 | 1.85.0 to 1.98.1-1 | None known |
rust-afterburnAzure Linux:3 | through 5.8.2-2 | None known |
rust-rustlsDebian:12 | All versions, plus listed versions 0.20.8-40.20.8-4.10.20.8-4.20.21.10-10.21.12-1 Show 45 moreShow less0.21.12-20.21.12-30.21.12-40.21.12-50.21.12-60.21.12-70.21.12-80.21.12-90.21.5-10.21.5-20.21.5-30.21.5-40.21.5-50.21.6-10.21.6-20.21.6-30.21.6-40.21.7-10.21.8-10.21.8-20.21.8-30.21.8-3.10.21.9-10.23.16-10.23.20+ds-10.23.20+ds-100.23.20+ds-20.23.20+ds-30.23.20+ds-40.23.20+ds-50.23.20+ds-60.23.20+ds-70.23.20+ds-80.23.20+ds-90.23.25+ds-10.23.26+ds-10.23.31+ds-10.23.31+ds-20.23.31+ds-30.23.31+ds-40.23.31+ds-50.23.31+ds-60.23.31+ds-70.23.32+ds-10.23.32+ds-2 | None known |
rust-rustlsDebian:13 | All versions, plus listed versions 0.23.26+ds-10.23.31+ds-10.23.31+ds-20.23.31+ds-30.23.31+ds-4 Show 20 moreShow less0.23.31+ds-50.23.31+ds-60.23.31+ds-70.23.32+ds-10.23.32+ds-20.23.33+ds-10.23.33+ds-20.23.33+ds-30.23.33+ds-40.23.35+ds-10.23.36+ds-10.23.37+ds-10.23.37+ds-20.23.37+ds-30.23.38+ds-10.23.40+ds-10.23.41+ds-10.23.43+ds-10.23.45+ds-10.23.46+ds-1 | None known |
rust-rustlsDebian:14 | before 0.23.45+ds-1, plus listed versions 0.23.26+ds-10.23.31+ds-10.23.31+ds-20.23.31+ds-30.23.31+ds-4 Show 18 moreShow less0.23.31+ds-50.23.31+ds-60.23.31+ds-70.23.32+ds-10.23.32+ds-20.23.33+ds-10.23.33+ds-20.23.33+ds-30.23.33+ds-40.23.35+ds-10.23.36+ds-10.23.37+ds-10.23.37+ds-20.23.37+ds-30.23.38+ds-10.23.40+ds-10.23.41+ds-10.23.43+ds-1 | 0.23.45+ds-1 |
rust-rustlsUbuntu:24.04:LTS | All versions, plus listed versions 0.21.6-30.21.7-10.21.9-10.21.10-1 | None known |
rust-rustlsUbuntu:26.10 | All versions, plus listed versions 0.23.36+ds-10.23.41+ds-1 | None known |
rust-rustlsUbuntu:26.04:LTS | All versions, plus listed versions 0.23.26+ds-10.23.33+ds-3build20.23.35+ds-10.23.35+ds-1build10.23.36+ds-1 | None known |
What each source reports
CVE List Score used 6.9
Rustls 0.23.13 before 0.23.45 TLS 1.3 Handshake Encryption Level Bypass
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
CVE-2026-123613- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20
- Updated
- 2026-11-08
EUVDEUVD-2026-119372 6.9
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
EUVD-2026-119372- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-08
GitHub AdvisoriesGHSA-2mjx-qc3c-rqvc 5.3
Rustls: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level when they followed a key-changing message in the same record. The handshake transcript is still authenticated, so a network-position attacker cannot use this to alter or complete a handshake; the practical effect is that a peer could send handshake messages that should be encrypted in plaintext without rustls rejecting the connection.
This issue affects rustls versions 0.23.13 through 0.23.44 inclusive.
Original report
Summary
Rustls (tested version 0.23.44, and it appears still an issue on latest master though I have not tested this) accepts a TLS 1.3 server flight where a plaintext EncryptedExtensions is packed into the same record as the ServerHello.
This is very similar to Go's CVE-2025-61730 fixed in https://github.com/golang/go/commit/5046bdf8a612b35a2c1a9e168054c1d5c65e7dd7
Details
It appears Deframer::aligned considers itself aligned as long as all messages remaining in the buffer are complete. Rustls processes the ServerHello, installs the handshake keys, then pulls the complete (plaintext) EncryptedExtensions out of the buffer.
This is insufficient per RFC 8446 section 5.1's
Handshake messages MUST NOT span key changes. Implementations MUST verify that all messages immediately preceding a key change align with a record boundary; if not, then they MUST terminate the connection with an "unexpected_message" alert. Because the ClientHello, EndOfEarlyData, ServerHello, Finished, and KeyUpdate messages can immediately precede a key change, implementations MUST send these messages in alignment with a record boundary.
Impact
An on path attacker can inject plaintext messages that are accepted.
Tool Use Disclosure
This was discovered by a new TLS/DTLS test suite currently under construction. The specific testcase was inspired by the Go CVE. Other tested implementations (Botan, OpenSSL, BoringSSL, Go, wolfSSL) reject this protocol flow. Daybreak Blue reviewed the rustls code to identify probable root cause.
- Record
GHSA-2mjx-qc3c-rqvc- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-rp7q-jxfg-4g6g 6.9
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption...
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
GHSA-rp7q-jxfg-4g6g- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20
- Updated
- 2026-11-08
NVD 6.9
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
CVE-2026-123613- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20
- Updated
- 2026-11-10
OSV 6.9
Rustls 0.23.13 before 0.23.45 TLS 1.3 Handshake Encryption Level Bypass
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
CVE-2026-123613- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-20
- Updated
- 2026-11-09
Show 9 moreShow less
OSVDEBIAN-CVE-2026-123613 6.9
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
DEBIAN-CVE-2026-123613- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Updated
- 2026-11-11
OSVGHSA-2mjx-qc3c-rqvc 5.3
Rustls: TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level when they followed a key-changing message in the same record. The handshake transcript is still authenticated, so a network-position attacker cannot use this to alter or complete a handshake; the practical effect is that a peer could send handshake messages that should be encrypted in plaintext without rustls rejecting the connection.
This issue affects rustls versions 0.23.13 through 0.23.44 inclusive.
Original report
Summary
Rustls (tested version 0.23.44, and it appears still an issue on latest master though I have not tested this) accepts a TLS 1.3 server flight where a plaintext EncryptedExtensions is packed into the same record as the ServerHello.
This is very similar to Go's CVE-2025-61730 fixed in https://github.com/golang/go/commit/5046bdf8a612b35a2c1a9e168054c1d5c65e7dd7
Details
It appears Deframer::aligned considers itself aligned as long as all messages remaining in the buffer are complete. Rustls processes the ServerHello, installs the handshake keys, then pulls the complete (plaintext) EncryptedExtensions out of the buffer.
This is insufficient per RFC 8446 section 5.1's
Handshake messages MUST NOT span key changes. Implementations MUST verify that all messages immediately preceding a key change align with a record boundary; if not, then they MUST terminate the connection with an "unexpected_message" alert. Because the ClientHello, EndOfEarlyData, ServerHello, Finished, and KeyUpdate messages can immediately precede a key change, implementations MUST send these messages in alignment with a record boundary.
Impact
An on path attacker can inject plaintext messages that are accepted.
Tool Use Disclosure
This was discovered by a new TLS/DTLS test suite currently under construction. The specific testcase was inspired by the Go CVE. Other tested implementations (Botan, OpenSSL, BoringSSL, Go, wolfSSL) reject this protocol flow. Daybreak Blue reviewed the rustls code to identify probable root cause.
- Record
GHSA-2mjx-qc3c-rqvc- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-08
OSVRUSTSEC-2026-0285 5.3
TLS 1.3 handshake messages incorrectly accepted across encryption level boundaries
Rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level
when they followed a key-changing message in the same record. For example,
a plaintext EncryptedExtensions message packed into the same record as the
ServerHello was accepted.
RFC 8446 section 5.1 requires that handshake messages do not span key changes, and that implementations terminate the connection with an "unexpected_message" alert if they do.
The handshake transcript is still authenticated, so a network-position attacker cannot use this to alter or complete a handshake; the practical effect is that a peer could send handshake messages that should be encrypted in plaintext without rustls rejecting the connection.
This is functionally the same bug as Go's GO-2026-4340 (CVE-2025-61730).
- Record
RUSTSEC-2026-0285- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-08
OSVUBUNTU-CVE-2026-123613 6.9
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
UBUNTU-CVE-2026-123613- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-10
OSVAZL-113173No score
CVE-2026-123613 affecting package kata-containers 4.1.0.kata2-1
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
AZL-113173- Updated
- 2026-11-13
OSVAZL-113182No score
CVE-2026-123613 affecting package kata-containers-cc 3.15.0.aks0-24
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
AZL-113182- Updated
- 2026-11-13
OSVAZL-113260No score
CVE-2026-123613 affecting package rust 1.75.0-31
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
AZL-113260- Updated
- 2026-11-11
OSVAZL-113293No score
CVE-2026-123613 affecting package rust 1.98.1-1
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
AZL-113293- Updated
- 2026-11-11
OSVAZL-113305No score
CVE-2026-123613 affecting package rust-afterburn 5.8.2-2
Rustls from 0.23.13 before 0.23.45 accepts TLS 1.3 handshake messages at the wrong encryption level when they follow a key-changing message in the same record, because Deframer::aligned does not enforce RFC 8446 record-boundary alignment. A peer or on-path attacker can pack a plaintext EncryptedExtensions with the ServerHello, which rustls accepts unencrypted.
- Record
AZL-113305- Updated
- 2026-11-11
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | OSV | |
| affected, aliases, references | NVD, OSV | |
| affected, aliases, references | OSV | |
| affected, aliases, published, references | OSV | |
| affected, aliases, facts, references | NVD, OSV | |
| published | EUVD | |
| published | EUVD | |
| aliases, references | GitHub Advisories | |
| aliases, products, published | EUVD | |
| first indexed | CVE List | |
| first indexed | GitHub Advisories, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
References
github.com/rustls/rustls/security/advisories/GHSA-2mjx-qc3c-rqvc
github.com/rustls/rustls/commit/5046bdf8a612b35a2c1a9e168054c1d5c65e7dd7
vulncheck.com/advisories/rustls-0.23.13-before-0.23.45-tls-1.3-handshake-encryption-level-bypass
github.com/golang/go/commit/5046bdf8a612b35a2c1a9e168054c1d5c65e7dd7
github.com/rustls/rustls/commit/98456aea708a7e3c6151e00ca2d4428e7a58257a
rustsec.org/advisories/RUSTSEC-2026-0285.html
Show 11 moreShow less
github.com/rustls/rustls/pull/3265
github.com/rustls/rustls/releases/tag/v/0.23.45
github.com/advisories/GHSA-2mjx-qc3c-rqvc
nvd.nist.gov/vuln/detail/CVE-2026-123613
github.com/advisories/GHSA-rp7q-jxfg-4g6g
github.com/CVEProject/cvelistV5/tree/main/cves/2026/123xxx/CVE-2026-123613.json
security-tracker.debian.org/tracker/CVE-2026-123613
github.com/rustls/rustls
crates.io/crates/rustls
ubuntu.com/security/CVE-2026-123613
cve.org/CVERecord?id=CVE-2026-123613
Left out here: 15 versions. The JSON record has them.