Files
Groene AI b906bc5c09 Enforce single-component matching for SSL certificate wildcards
A '*' in an ssl_certificate user subject was constrained only by an
equal-slash-count check ("'*' must not represent a '/' in URI"). For CN
and "DNS:" SAN subjects there are no slashes, so the check was always
0 == 0 and did nothing. A user identified by '*.corp.example.com' was
therefore matched by any subject ending in '.corp.example.com',
including multi-label names like 'evil.deep.corp.example.com'. An
attacker able to obtain a CA-signed certificate for a deeper subdomain
could authenticate as the wildcard user.

Per RFC 6125 6.4.3 a wildcard must match exactly one component.
Generalize the separator to be type-aware: '.' for CN and "DNS:" SANs
(DNS label separator), '/' for "URI:" SANs (path separator, preserving
the previous behavior exactly). The matched span between the fixed
prefix and suffix must not contain the separator.

The candidate length is checked before computing the matched span so
its length cannot underflow when the prefix and suffix overlap on a
short candidate (e.g. pattern 'a*a', candidate 'a'), which also removes
a pre-existing overlap false positive. For URI SANs, "matched span has
no '/'" is equivalent to the previous equal-slash-count guard, so
existing URI wildcard behavior is unchanged.

Add integration tests covering DNS and CN wildcards (single-label
positive, multi-label bypass rejected) and a URI SAN whose matched
segment contains a dot (non-regression).
2026-06-25 12:29:07 +00:00

34 lines
2.0 KiB
Plaintext

-----BEGIN CERTIFICATE-----
MIIFszCCA5ugAwIBAgIUBfEMZ1Z/4weV13ryVA9qyNTPJHMwDQYJKoZIhvcNAQEL
BQAwUjELMAkGA1UEBhMCUlUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDELMAkGA1UEAwwCY2EwHhcNMjYwNjI1
MTIwMzIwWhcNMzYwNjIyMTIwMzIwWjBqMQswCQYDVQQGEwJSVTETMBEGA1UECAwK
U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMSMw
IQYDVQQDDBpldmlsLmRlZXAuY29ycC5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcN
AQEBBQADggIPADCCAgoCggIBAMWMjNngXJ2jG2PSZL5RT6gE6CzGKWjiOaD2sbJ9
0hWS1B55WSGsTPHWEbIoQs/Nt15Ok9/mWwSFx1lKGuRedZWdy5zwT+uoZybQHSyz
su+oxyw/Gc7qx/vYxgCjF+l2dZqkCr1QujU/gNnaUf6KYyISQkFHjAgb2HndD6Xh
eMb6gWVfER5d6AjeUuGQ0qX5trhyATX7XDAUS4EHH3IHOxJbWtOfB33QmyghSovw
D128//yIBvS09dGHcbndFx5QEMd+s2VsVMpBuyju3MtUtp/tcrnTDwKo3Xq5k68t
7xzKU4olwfUJbgzMMZ2mMXgkBAEy/158Vw1YwXXUuioHbJZCsjhkKJwNOkAbQ/So
/MXK0ZAEZtHGEtWmOAgGtBPHoGLfX4tjxzCubiz2rL+6JnHcU//yQNr7QJf4R3Go
bebb6b7SDmir9C9GtS+OnEPI1uiwZM9zZGnr+Eeh35pGjVUBY8WM5wi8Ar9y66mc
jbX/rzhEaK/K6dct90LlM8NMjgpA0OVvqOpEbcl61kmqdd1niIThmyYOlGnhUQo7
6KCgz8eMn+rPA8nikL979HsAl50/oiNEky+9yBQE6BCReYGWI9xVacsDlZyeTSZY
+nCWyl98AdOLBzrhMP43BGcYqwANM5kPh0J1rdPG/gkkATNHt/1/qbH/48LopSEb
beXPAgMBAAGjaTBnMCUGA1UdEQQeMByCGmV2aWwuZGVlcC5jb3JwLmV4YW1wbGUu
Y29tMB0GA1UdDgQWBBQUkEMm/VbHTQhyKEBes9h44S/uhTAfBgNVHSMEGDAWgBSJ
Kj1dSYN0jW+Mu0xFQrobZFmQpTANBgkqhkiG9w0BAQsFAAOCAgEAXjA8e3JSJDPX
RI0Rj2CSo03bzCItcPH+9NrBl9y+CObtJ5KC52RLayVJph9sbYp3V/GNwhJUDoFA
+6ViMBTnzT/jOqi0g1pJIBEtHeHhyUCrhJnsOYUNVyVi2z06VIOiLrmpOmSj86HK
7niqgMQBF/Y36nTHXf3Z1CkKANrpCw9WlMCmIakF5FRq98iRmWDU/chkmvf6iAnS
6iSyNswTuXdNWJfnD/lPjX0VK9sGz4EjxwoiHZIuMED9SfLeoLeJ+4fr8t9F1K/W
5E5t0a/zDUa6qIvXRVD5tRKFS1d6u+dVrkhbQQpWbA4VHC8CloqtAJ0qfPuOz3xO
ciFmAvq/l3nUatgT9lFR2oztNiM/vkZ2AdT9UjYPNonbdZvc/MTOUquHiJyL2Gvk
dcMWz1+ntFBMX4x/KhP7keKhP2BlZmSDoabDwKYfcZJ6P4s8kW+7l70G5g+cloW8
kDTXQKtMJ1Zoz3PKuZV9ipuQOZVCGpP83b2uYjEbaNSFSWkqc+BI0cP51Nod9nok
8CQKj+E+JTYlzv3fOhckZgJ3LxgS/i7C2yT14Qjc2xV1hD8xn6d5C/xsxu3vfgVE
5HF4CdvmkZqQ6PHHBtvEJzgUl0xBuvojRW6gSDmOV/aiTkx0s7M6ygFwU62YcII8
wUXZOxxZUf/Cg35aQkrqUZiz58U7mGA=
-----END CERTIFICATE-----