]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
x509: prevent fallback on oversized SAN
authorAlexander Sosedkin <asosedkin@redhat.com>
Wed, 15 Apr 2026 14:02:19 +0000 (16:02 +0200)
committerAlexander Sosedkin <asosedkin@redhat.com>
Wed, 29 Apr 2026 13:35:03 +0000 (15:35 +0200)
Passing oversized SAN did not preclude CN (or DN email) fallback
during verification, which is an RFC 6125 6.4.4 violation.

Now oversized SAN are skipped over,
but prevent the fallback from happening.

Reported-by: Haruto Kimura (Stella)
Reported-by: Joshua Rogers of AISLE Research Team <joshua@joshua.hu>
Fixes: #1825
Fixes: #1849
Fixes: CVE-2026-42013
Fixes: GNUTLS-SA-2026-04-27-8
CVSS: 6.5 Moderate CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N
Signed-off-by: Alexander Sosedkin <asosedkin@redhat.com>
lib/x509/email-verify.c
lib/x509/hostname-verify.c

index 3c22ffed379ef5254b3db2f22b74ba782b748c7f..c6cf7a94895481cb7d2a2990fd814132f582c336 100644 (file)
@@ -75,6 +75,20 @@ unsigned gnutls_x509_crt_check_email(gnutls_x509_crt_t cert, const char *email,
                ret = gnutls_x509_crt_get_subject_alt_name(
                        cert, i, rfc822name, &rfc822namesize, NULL);
 
+               if (ret < 0) {
+                       if (ret == GNUTLS_E_SHORT_MEMORY_BUFFER) {
+                               /* oversized SAN; proceed without DN fallback */
+                               _gnutls_debug_log("oversized SAN ignored, "
+                                                 "disabling DN fallback\n");
+                               dn_fallback_allowed = false;
+                               ret = 0;
+                               continue;
+                       }
+                       if (ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+                               gnutls_assert();
+                       break;
+               }
+
                if (ret == GNUTLS_SAN_RFC822NAME) {
                        dn_fallback_allowed = false;
 
index d989bb1abcb9dabe007e2dbe0811c146638a129c..a00d413f2b0ecca0e36d729d56016a0ee8e4dc1a 100644 (file)
@@ -213,6 +213,20 @@ hostname_fallback:
                ret = gnutls_x509_crt_get_subject_alt_name(cert, i, dnsname,
                                                           &dnsnamesize, NULL);
 
+               if (ret < 0) {
+                       if (ret == GNUTLS_E_SHORT_MEMORY_BUFFER) {
+                               /* oversized SAN; proceed without CN fallback */
+                               _gnutls_debug_log("oversized SAN ignored, "
+                                                 "disabling CN fallback\n");
+                               cn_fallback_allowed = false;
+                               ret = 0;
+                               continue;
+                       }
+                       if (ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+                               gnutls_assert();
+                       break;
+               }
+
                if (PRECLUDES_CN_FALLBACK(ret))
                        cn_fallback_allowed = false;