Skip to content

Commit 2b2314e

Browse files
rolandshoemakergopherbot
authored andcommitted
crypto/x509: properly check for IPv6 hosts in URIs
When checking URI constraints, use netip.ParseAddr, which understands zones, unlike net.ParseIP which chokes on them. This prevents zone IDs from mistakenly satisfying URI constraints. Thanks to Juho Forsén of Mattermost for reporting this issue. Fixes #71156 Fixes CVE-2024-45341 Change-Id: Iecac2529f3605382d257996e0fb6d6983547e400 Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/1700 Reviewed-by: Tatiana Bradley <[email protected]> Reviewed-by: Damien Neil <[email protected]> Reviewed-on: https://go-review.googlesource.com/c/go/+/643096 Reviewed-by: Michael Pratt <[email protected]> Auto-Submit: Michael Knyszek <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent 6783377 commit 2b2314e

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/crypto/x509/name_constraints_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,23 @@ var nameConstraintsTests = []nameConstraintsTest{
16071607
leaf: leafSpec{sans: []string{"dns:.example.com"}},
16081608
expectedError: "cannot parse dnsName \".example.com\"",
16091609
},
1610+
// #86: URIs with IPv6 addresses with zones and ports are rejected
1611+
{
1612+
roots: []constraintsSpec{
1613+
{
1614+
ok: []string{"uri:example.com"},
1615+
},
1616+
},
1617+
intermediates: [][]constraintsSpec{
1618+
{
1619+
{},
1620+
},
1621+
},
1622+
leaf: leafSpec{
1623+
sans: []string{"uri:http://[2006:abcd::1%25.example.com]:16/"},
1624+
},
1625+
expectedError: "URI with IP",
1626+
},
16101627
}
16111628

16121629
func makeConstraintsCACert(constraints constraintsSpec, name string, key *ecdsa.PrivateKey, parent *Certificate, parentKey *ecdsa.PrivateKey) (*Certificate, error) {

src/crypto/x509/verify.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"iter"
1414
"maps"
1515
"net"
16+
"net/netip"
1617
"net/url"
1718
"reflect"
1819
"runtime"
@@ -465,8 +466,10 @@ func matchURIConstraint(uri *url.URL, constraint string) (bool, error) {
465466
}
466467
}
467468

468-
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") ||
469-
net.ParseIP(host) != nil {
469+
// netip.ParseAddr will reject the URI IPv6 literal form "[...]", so we
470+
// check if _either_ the string parses as an IP, or if it is enclosed in
471+
// square brackets.
472+
if _, err := netip.ParseAddr(host); err == nil || (strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]")) {
470473
return false, fmt.Errorf("URI with IP (%q) cannot be matched against constraints", uri.String())
471474
}
472475

0 commit comments

Comments
 (0)