]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
nss: return error if seemingly stuck in a cert loop
authorDaniel Stenberg <daniel@haxx.se>
Mon, 9 May 2022 08:07:15 +0000 (10:07 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 9 May 2022 08:07:15 +0000 (10:07 +0200)
CVE-2022-27781

Reported-by: Florian Kohnhäuser
Bug: https://curl.se/docs/CVE-2022-27781.html
Closes #8822

lib/vtls/nss.c

index 5b7de9f8189520fb623473c0408caf8f09a9556c..569c0628feb5c88cfb9a451b3c98973f9fad261a 100644 (file)
@@ -983,6 +983,9 @@ static void display_cert_info(struct Curl_easy *data,
   PR_Free(common_name);
 }
 
+/* A number of certs that will never occur in a real server handshake */
+#define TOO_MANY_CERTS 300
+
 static CURLcode display_conn_info(struct Curl_easy *data, PRFileDesc *sock)
 {
   CURLcode result = CURLE_OK;
@@ -1018,6 +1021,11 @@ static CURLcode display_conn_info(struct Curl_easy *data, PRFileDesc *sock)
         cert2 = CERT_FindCertIssuer(cert, now, certUsageSSLCA);
         while(cert2) {
           i++;
+          if(i >= TOO_MANY_CERTS) {
+            CERT_DestroyCertificate(cert2);
+            failf(data, "certificate loop");
+            return CURLE_SSL_CERTPROBLEM;
+          }
           if(cert2->isRoot) {
             CERT_DestroyCertificate(cert2);
             break;