commit:     56ce8ace503d45e60b72a79222bb6aada4c76124
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Wed Jun  2 12:41:04 2021 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Wed Jun  2 12:59:30 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=56ce8ace

net-wireless/hostapd: fix CVE-2021-30004

Bug: https://bugs.gentoo.org/780135
Package-Manager: Portage-3.0.19, Repoman-3.0.3
Signed-off-by: Thomas Deutschmann <whissi <AT> gentoo.org>

 ...date-DigestAlgorithmIdentifier-parameters.patch | 115 +++++++++++++++++++++
 .../{hostapd-9999.ebuild => hostapd-2.9-r4.ebuild} |   4 +-
 net-wireless/hostapd/hostapd-9999.ebuild           |   2 +
 3 files changed, 120 insertions(+), 1 deletion(-)

diff --git 
a/net-wireless/hostapd/files/hostapd-2.9-ASN-1-Validate-DigestAlgorithmIdentifier-parameters.patch
 
b/net-wireless/hostapd/files/hostapd-2.9-ASN-1-Validate-DigestAlgorithmIdentifier-parameters.patch
new file mode 100644
index 00000000000..8c8ba933550
--- /dev/null
+++ 
b/net-wireless/hostapd/files/hostapd-2.9-ASN-1-Validate-DigestAlgorithmIdentifier-parameters.patch
@@ -0,0 +1,115 @@
+From a0541334a6394f8237a4393b7372693cd7e96f15 Mon Sep 17 00:00:00 2001
+From: Jouni Malinen <[email protected]>
+Date: Sat, 13 Mar 2021 18:19:31 +0200
+Subject: ASN.1: Validate DigestAlgorithmIdentifier parameters
+
+The supported hash algorithms do not use AlgorithmIdentifier parameters.
+However, there are implementations that include NULL parameters in
+addition to ones that omit the parameters. Previous implementation did
+not check the parameters value at all which supported both these cases,
+but did not reject any other unexpected information.
+
+Use strict validation of digest algorithm parameters and reject any
+unexpected value when validating a signature. This is needed to prevent
+potential forging attacks.
+
+Signed-off-by: Jouni Malinen <[email protected]>
+---
+ src/tls/pkcs1.c  | 21 +++++++++++++++++++++
+ src/tls/x509v3.c | 20 ++++++++++++++++++++
+ 2 files changed, 41 insertions(+)
+
+diff --git a/src/tls/pkcs1.c b/src/tls/pkcs1.c
+index bbdb0d7..5761dfe 100644
+--- a/src/tls/pkcs1.c
++++ b/src/tls/pkcs1.c
+@@ -244,6 +244,8 @@ int pkcs1_v15_sig_ver(struct crypto_public_key *pk,
+               os_free(decrypted);
+               return -1;
+       }
++      wpa_hexdump(MSG_MSGDUMP, "PKCS #1: DigestInfo",
++                  hdr.payload, hdr.length);
+ 
+       pos = hdr.payload;
+       end = pos + hdr.length;
+@@ -265,6 +267,8 @@ int pkcs1_v15_sig_ver(struct crypto_public_key *pk,
+               os_free(decrypted);
+               return -1;
+       }
++      wpa_hexdump(MSG_MSGDUMP, "PKCS #1: DigestAlgorithmIdentifier",
++                  hdr.payload, hdr.length);
+       da_end = hdr.payload + hdr.length;
+ 
+       if (asn1_get_oid(hdr.payload, hdr.length, &oid, &next)) {
+@@ -273,6 +277,23 @@ int pkcs1_v15_sig_ver(struct crypto_public_key *pk,
+               os_free(decrypted);
+               return -1;
+       }
++      wpa_hexdump(MSG_MSGDUMP, "PKCS #1: Digest algorithm parameters",
++                  next, da_end - next);
++
++      /*
++       * RFC 5754: The correct encoding for the SHA2 algorithms would be to
++       * omit the parameters, but there are implementation that encode these
++       * as a NULL element. Allow these two cases and reject anything else.
++       */
++      if (da_end > next &&
++          (asn1_get_next(next, da_end - next, &hdr) < 0 ||
++           !asn1_is_null(&hdr) ||
++           hdr.payload + hdr.length != da_end)) {
++              wpa_printf(MSG_DEBUG,
++                         "PKCS #1: Unexpected digest algorithm parameters");
++              os_free(decrypted);
++              return -1;
++      }
+ 
+       if (!asn1_oid_equal(&oid, hash_alg)) {
+               char txt[100], txt2[100];
+diff --git a/src/tls/x509v3.c b/src/tls/x509v3.c
+index a8944dd..df337ec 100644
+--- a/src/tls/x509v3.c
++++ b/src/tls/x509v3.c
+@@ -1964,6 +1964,7 @@ int x509_check_signature(struct x509_certificate *issuer,
+               os_free(data);
+               return -1;
+       }
++      wpa_hexdump(MSG_MSGDUMP, "X509: DigestInfo", hdr.payload, hdr.length);
+ 
+       pos = hdr.payload;
+       end = pos + hdr.length;
+@@ -1985,6 +1986,8 @@ int x509_check_signature(struct x509_certificate *issuer,
+               os_free(data);
+               return -1;
+       }
++      wpa_hexdump(MSG_MSGDUMP, "X509: DigestAlgorithmIdentifier",
++                  hdr.payload, hdr.length);
+       da_end = hdr.payload + hdr.length;
+ 
+       if (asn1_get_oid(hdr.payload, hdr.length, &oid, &next)) {
+@@ -1992,6 +1995,23 @@ int x509_check_signature(struct x509_certificate 
*issuer,
+               os_free(data);
+               return -1;
+       }
++      wpa_hexdump(MSG_MSGDUMP, "X509: Digest algorithm parameters",
++                  next, da_end - next);
++
++      /*
++       * RFC 5754: The correct encoding for the SHA2 algorithms would be to
++       * omit the parameters, but there are implementation that encode these
++       * as a NULL element. Allow these two cases and reject anything else.
++       */
++      if (da_end > next &&
++          (asn1_get_next(next, da_end - next, &hdr) < 0 ||
++           !asn1_is_null(&hdr) ||
++           hdr.payload + hdr.length != da_end)) {
++              wpa_printf(MSG_DEBUG,
++                         "X509: Unexpected digest algorithm parameters");
++              os_free(data);
++              return -1;
++      }
+ 
+       if (x509_sha1_oid(&oid)) {
+               if (signature->oid.oid[6] != 5 /* sha-1WithRSAEncryption */) {
+-- 
+cgit v0.12
+

diff --git a/net-wireless/hostapd/hostapd-9999.ebuild 
b/net-wireless/hostapd/hostapd-2.9-r4.ebuild
similarity index 98%
copy from net-wireless/hostapd/hostapd-9999.ebuild
copy to net-wireless/hostapd/hostapd-2.9-r4.ebuild
index 515d2b26e21..c94f67d82ad 100644
--- a/net-wireless/hostapd/hostapd-9999.ebuild
+++ b/net-wireless/hostapd/hostapd-2.9-r4.ebuild
@@ -69,6 +69,8 @@ src_prepare() {
        eapply 
"${FILESDIR}/${P}-0001-WPS-UPnP-Do-not-allow-event-subscriptions-with-URLs-.patch"
        eapply 
"${FILESDIR}/${P}-0002-WPS-UPnP-Fix-event-message-generation-using-a-long-U.patch"
        eapply 
"${FILESDIR}/${P}-0003-WPS-UPnP-Handle-HTTP-initiation-failures-for-events-.patch"
+       # CVE-2021-30004 bug #780135
+       eapply 
"${FILESDIR}/${P}-ASN-1-Validate-DigestAlgorithmIdentifier-parameters.patch"
 
        popd >/dev/null || die
 
@@ -202,7 +204,7 @@ src_configure() {
 src_compile() {
        emake V=1
 
-       if  use internal-tls; then
+       if ! use internal-tls; then
                emake V=1 nt_password_hash
                emake V=1 hlr_auc_gw
        fi

diff --git a/net-wireless/hostapd/hostapd-9999.ebuild 
b/net-wireless/hostapd/hostapd-9999.ebuild
index 515d2b26e21..92074dc1872 100644
--- a/net-wireless/hostapd/hostapd-9999.ebuild
+++ b/net-wireless/hostapd/hostapd-9999.ebuild
@@ -69,6 +69,8 @@ src_prepare() {
        eapply 
"${FILESDIR}/${P}-0001-WPS-UPnP-Do-not-allow-event-subscriptions-with-URLs-.patch"
        eapply 
"${FILESDIR}/${P}-0002-WPS-UPnP-Fix-event-message-generation-using-a-long-U.patch"
        eapply 
"${FILESDIR}/${P}-0003-WPS-UPnP-Handle-HTTP-initiation-failures-for-events-.patch"
+       # CVE-2021-30004 bug #780135
+       eapply 
"${FILESDIR}/${P}-ASN-1-Validate-DigestAlgorithmIdentifier-parameters.patch"
 
        popd >/dev/null || die
 

Reply via email to