CME-403

TLS 1.3 Enforcement

Description

Enforces TLS 1.3 as the minimum protocol version for all TLS connections, rejecting TLS 1.2 and below at the handshake layer. TLS 1.3 eliminates entire attack classes present in earlier versions: CBC mode ciphers are removed (preventing BEAST, Lucky13 padding oracle attacks), renegotiation is removed (preventing renegotiation-based attacks), only AEAD cipher suites are available (AES-128-GCM, AES-256-GCM, ChaCha20-Poly1305), forward secrecy is mandatory via ephemeral ECDHE/X25519 key exchange (no static RSA key transport), and the server certificate is encrypted during the handshake. Enforcement is configured at the service level (nginx ssl_protocols, Apache SSLProtocol, Tomcat sslEnabledProtocols), reverse proxy level, or system crypto policy level (update-crypto-policies on RHEL). Does not protect applications using custom TLS implementations that bypass system crypto libraries (Go's crypto/tls, Java's JSSE, custom-compiled OpenSSL). Compatibility constraint: legacy clients and embedded devices that do not support TLS 1.3 will fail to connect.

CVSS Vector Impacts

Metric Transition Rationale
Attack Complexity (AC) L → H Without TLS 1.3 enforcement, a network attacker can force protocol downgrade to TLS 1.2 or lower using well-tooled attacks: POODLE forces TLS 1.0 fallback to exploit CBC padding, DROWN exploits SSLv2 to decrypt TLS sessions, and FREAK/Logjam force export-grade key exchange. With TLS 1.3 enforcement, the server rejects any handshake below 1.3 — the downgrade path does not exist. Additionally, TLS 1.3 mandates forward secrecy via ephemeral key exchange, so even if a server's long-term private key is later compromised, past sessions cannot be retroactively decrypted. The attacker must perform a real-time MitM against AEAD ciphers with ephemeral keys, which requires fundamentally different (and harder) cryptographic attacks than exploiting known protocol weaknesses

CWE Relationships

Verification

Verify TLS 1.2 is rejected and TLS 1.3 is the minimum accepted protocol version

$ openssl s_client -connect <host>:<port> -tls1_2 </dev/null 2>&1 | grep -ci 'handshake failure\|alert protocol_version\|no protocols available'
# Expected: >=1
Platform: any
$ openssl s_client -connect <host>:<port> -tls1_3 </dev/null 2>&1 | grep -c 'TLSv1.3'
# Expected: >=1
Platform: any
$ update-crypto-policies --show 2>/dev/null | grep -qE 'FUTURE|FIPS' && echo 'ok' || grep -rn 'ssl_protocols\|SSLProtocol\|sslEnabledProtocols' /etc/nginx/ /etc/httpd/ 2>/dev/null | grep -ci 'TLSv1.3'
# Expected: >=1
Platform: linux
$ Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name Enabled -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Enabled
# Expected: 0
Platform: windows
$ Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name Enabled -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Enabled
# Expected: 1
Platform: windows

Remediation

rhel RHEL crypto-policies TLS 1.3 minimum enforcement

printf 'min_tls_version = TLS1.3\ntls_cipher = AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305\n' > /etc/crypto-policies/policies/modules/TLS13-ONLY.pmod
update-crypto-policies --set FUTURE:TLS13-ONLY
linux nginx TLS 1.3-only protocol enforcement

printf 'ssl_protocols TLSv1.3;\nssl_prefer_server_ciphers off;\n' > /etc/nginx/conf.d/cme-403-tls13.conf
nginx -t && nginx -s reload
windows Windows SChannel TLS 1.3-only enforcement via registry

New-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value 0 -Type DWord; Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'DisabledByDefault' -Value 1 -Type DWord
New-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name 'Enabled' -Value 1 -Type DWord; Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name 'DisabledByDefault' -Value 0 -Type DWord
foreach ($ver in @('TLS 1.1','TLS 1.0')) { New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$ver\Server" -Force | Out-Null; Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$ver\Server" -Name 'Enabled' -Value 0 -Type DWord; Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$ver\Server" -Name 'DisabledByDefault' -Value 1 -Type DWord }

Applicability (CVE 5.2.0 Schema)

Vendor Product CPEs Platforms Status
redhat enterprise_linux cpe:2.3:o:redhat:enterprise_linux:8:*:*:*:*:*:*:*
cpe:2.3:o:redhat:enterprise_linux:9:*:*:*:*:*:*:*
cpe:2.3:o:redhat:enterprise_linux:10:*:*:*:*:*:*:*
All applicable
microsoft windows cpe:2.3:o:microsoft:windows_10:*:*:*:*:*:*:*:*
cpe:2.3:o:microsoft:windows_11:*:*:*:*:*:*:*:*
cpe:2.3:o:microsoft:windows_server_2022:*:*:*:*:*:*:*
All applicable
← CME-402: FIPS 140-3 Mode CME-404: Certificate Pinning →