Weak cipher suite offered by configuration
ID |
weak_cipher_suite_in_config |
Severity |
high |
Remediation Complexity |
trivial |
Remediation Risk |
medium |
Remediation Effort |
low |
Family |
Cryptography |
Tags |
ASVS50:v12.1.2, CWE:327, configuration, cryptography, network, non-reachable, security |
Description
The suites a service will negotiate come from a configuration string: ssl_ciphers in nginx,
SSLCipherSuite in Apache httpd, ssl-default-bind-ciphers in HAProxy, server.ssl.ciphers in Spring
Boot, ciphers on a Tomcat connector, ssl_cipher in MySQL, tls-ciphers in Redis, CipherString in
openssl.cnf.
This detector reports a suite whose own name condemns it: anonymous (ADH, AECDH, ANON), NULL
cipher or NULL MAC, export-grade (EXP, EXPORT), RC4, RC2, single DES, 3DES, IDEA, or an MD5 MAC.
Suites are judged by name rather than through the algorithm catalogue because a suite is a compound —
ECDHE-RSA-DES-CBC3-SHA names a key exchange, a cipher and a MAC — so it matches no single catalogue
row while its components are exactly what makes it unacceptable.
Suites the setting excludes are never reported. HIGH:!aNULL:!MD5 is the hardened spelling, and
reporting its aNULL and MD5 would flag the line that removes them.
Security
Every suite in the list is negotiable. The attacks are specific and not theoretical: an anonymous suite authenticates no one, so the peer can be substituted outright; a NULL-cipher suite transmits in the clear; export-grade suites use keys deliberately reduced to 40 or 56 bits and enable FREAK and Logjam; RC4 has practically exploitable keystream biases; 3DES has a 64-bit block and falls to Sweet32 within a long-lived connection; an MD5 MAC offers no integrity worth the name.
Suite order matters as much as suite membership. With ssl_prefer_server_ciphers off (or no equivalent
setting) the client chooses, so a weak suite anywhere in the list is reachable by any client that
prefers it — including one steered there by an attacker.
Mitigation / Fix
State a short, current list and let the server choose:
# nginx — TLS 1.3 suites are not configurable here and need no list
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
# Spring Boot
server.ssl.ciphers=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
An explicit list of AEAD suites is better than a class expression: HIGH is defined by the linked
OpenSSL version, so what it admits changes under you on upgrade, whereas an enumerated list is
reviewable and stable. If you keep a class expression, keep the exclusions with it
(HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!RC4:!MD5).
Verify the result against the deployed service rather than the file — openssl s_client -cipher or
testssl.sh — since a reverse proxy or load balancer in front may terminate TLS with its own list.