Skip to content

Commit f258f7a

Browse files
reject hosts that fail IP canonicalization in verifyIpAddress (#9621)
1 parent 8ef0994 commit f258f7a

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

okhttp/src/commonJvmAndroid/kotlin/okhttp3/internal/tls/OkHostnameVerifier.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ object OkHostnameVerifier : HostnameVerifier {
6464
ipAddress: String,
6565
certificate: X509Certificate,
6666
): Boolean {
67-
val canonicalIpAddress = ipAddress.toCanonicalHost()
67+
val canonicalIpAddress = ipAddress.toCanonicalHost() ?: return false
6868

6969
return getSubjectAltNames(certificate, ALT_IPA_NAME).any {
7070
canonicalIpAddress == it.toCanonicalHost()

okhttp/src/jvmTest/kotlin/okhttp3/internal/tls/HostnameVerifierTest.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,48 @@ class HostnameVerifierTest {
793793
assertThat(verifier.verify("℡.com", session)).isFalse()
794794
}
795795

796+
@Test fun malformedIpAddressAndMalformedSubjectAltName() {
797+
// $ cat ./cert.cnf
798+
// [req]
799+
// distinguished_name=distinguished_name
800+
// x509_extensions=x509_extensions
801+
// [distinguished_name]
802+
// [x509_extensions]
803+
// # An iPAddress holding an address and a netmask. Java reads it back as
804+
// # '1.2.3.4/255.255.255.0', which is not a host name.
805+
// subjectAltName=DER:30:0a:87:08:01:02:03:04:ff:ff:ff:00
806+
//
807+
// $ openssl req -x509 -nodes -days 36500 -subj '/CN=foo.com' -config ./cert.cnf \
808+
// -newkey rsa:2048 -out cert.pem
809+
val session =
810+
session(
811+
"""
812+
-----BEGIN CERTIFICATE-----
813+
MIIC6jCCAdKgAwIBAgIUOs0TfFZ8c478WBRA5JhYDmCY27kwDQYJKoZIhvcNAQEL
814+
BQAwEjEQMA4GA1UEAwwHZm9vLmNvbTAgFw0yNjA3MjkxNzQzMzZaGA8yMTI2MDcw
815+
NTE3NDMzNlowEjEQMA4GA1UEAwwHZm9vLmNvbTCCASIwDQYJKoZIhvcNAQEBBQAD
816+
ggEPADCCAQoCggEBAKRuEQYMeSBJkGt4Xah86p1TthHyTrQDqp2n2UMUFAbx6zSq
817+
LXJ/VMRMevKectFkgu2i+blMDvQcgiy3Mu1CNvGdJtWqCiUThZgvZVxAfliU5YNi
818+
K7X7V9EK+FqF1SB2mpzxhY2+a+tPBFTUxMFqOHl8JMZ1ZVTtmbRn+N1l9DojjqM5
819+
R0DZcxC/p5Fu6+EmFRc5ORK7J2s1NBYsEm5Arr64Vy/h9XUiz38uX+umQb8tUWtf
820+
KjneRhiGWehqzpOpKzsk8KQ7TDFbT3++jltyzoTaeJ1S1wO3ORjGgQ1JPgmHXw17
821+
4LymfT36hs1KY30h6Pq9hQWeRPk47n5SVpDvK8kCAwEAAaM2MDQwEwYDVR0RBAww
822+
CocIAQIDBP///wAwHQYDVR0OBBYEFMxmf4cFN9j8mIzwq4OJFwTOev1BMA0GCSqG
823+
SIb3DQEBCwUAA4IBAQCTS5DRJjNMxGfc1w8wSoiAWM+ZNQk/Pdi7iysLVLSjlE9w
824+
RmOd6oB3bsukBfUYTidM5m0Jq2hFXSQ7pb5pghh+E8IKnqYighFiFBlroQABswQ2
825+
BCCftWj0P9cGSp27Uq9yjvjNUDXHIDxS6qgCcsnNOpFF8NWGJ3YQPvPXkxC3C1rX
826+
rCu5cpLiayY5CdZcuqxqE68l3zaMh3Vd8YCaIwJupkMVRJ0emNnv92/7t86rsGDO
827+
P4laLm0p2pMeNrcZular1zvxzcVIv5uKq5ND+EBHp/rsT+Qy9n/NlRsspLTkQKsA
828+
Lu6ozoYr25wr3VMYnoba4P/fiCJOXhO7f/pxbUao
829+
-----END CERTIFICATE-----
830+
""".trimIndent(),
831+
)
832+
833+
// Both of these have two '::' and are not addresses.
834+
assertThat(verifier.verify("1::2::3", session)).isFalse()
835+
assertThat(verifier.verify("::1::", session)).isFalse()
836+
}
837+
796838
@Test fun thatCatchesErrorsWithBadSession() {
797839
val localVerifier = OkHttpClient().hostnameVerifier
798840

0 commit comments

Comments
 (0)