File CVE-2021-22939.patch of Package nodejs10.28003

From 1780bbc3291357f7c3370892eb311fc7a62afe8d Mon Sep 17 00:00:00 2001
From: Matteo Collina <hello@matteocollina.com>
Date: Wed, 4 Aug 2021 18:40:00 +0200
Subject: [PATCH] tls: validate "rejectUnauthorized: undefined"

Incomplete validation of rejectUnauthorized parameter (Low)

If the Node.js https API was used incorrectly and "undefined" was passed
in for the "rejectUnauthorized" parameter, no error was returned and
connections to servers with an expired certificate would have been
accepted.

CVE-ID: CVE-2021-22939
Refs: https://nvd.nist.gov/vuln/detail/CVE-2021-22939
Refs: https://hackerone.com/reports/1278254
PR-URL: https://github.com/nodejs-private/node-private/pull/276
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Akshay K <iit.akshay@gmail.com>
Reviewed-By: Robert Nagy <ronagy@icloud.com>
Reviewed-By: Richard Lau <rlau@redhat.com>
---
 lib/_tls_wrap.js                        | 17 ++++++++++++++++-
 test/parallel/test-tls-client-reject.js | 13 +++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

Index: node-v10.24.1/lib/_tls_wrap.js
===================================================================
--- node-v10.24.1.orig/lib/_tls_wrap.js
+++ node-v10.24.1/lib/_tls_wrap.js
@@ -1102,7 +1102,15 @@ function onConnectSecure() {
     this.authorized = false;
     this.authorizationError = verifyError.code || verifyError.message;
 
-    if (options.rejectUnauthorized) {
+    // rejectUnauthorized property can be explicitly defined as `undefined`
+    // causing the assignment to default value (`true`) fail. Before assigning
+    // it to the tlssock connection options, explicitly check if it is false
+    // and update rejectUnauthorized property. The property gets used by
+    // TLSSocket connection handler to allow or reject connection if
+    // unauthorized.
+    // This check is potentially redundant, however it is better to keep it
+    // in case the option object gets modified somewhere.
+    if (options.rejectUnauthorized !== false) {
       this.destroy(verifyError);
       return;
     } else {
@@ -1170,6 +1178,13 @@ exports.connect = function connect(...ar
     requestOCSP: options.requestOCSP
   });
 
+  // rejectUnauthorized property can be explicitly defined as `undefined`
+  // causing the assignment to default value (`true`) fail. Before assigning
+  // it to the tlssock connection options, explicitly check if it is false
+  // and update rejectUnauthorized property. The property gets used by TLSSocket
+  // connection handler to allow or reject connection if unauthorized
+  options.rejectUnauthorized = options.rejectUnauthorized !== false;
+
   tlssock[kConnectOptions] = options;
 
   if (cb)
Index: node-v10.24.1/test/parallel/test-tls-client-reject.js
===================================================================
--- node-v10.24.1.orig/test/parallel/test-tls-client-reject.js
+++ node-v10.24.1/test/parallel/test-tls-client-reject.js
@@ -67,6 +67,19 @@ function rejectUnauthorized() {
   socket.write('ng');
 }
 
+function rejectUnauthorizedUndefined() {
+  console.log('reject unauthorized undefined');
+  const socket = tls.connect(server.address().port, {
+    servername: 'localhost',
+    rejectUnauthorized: undefined
+  }, common.mustNotCall());
+  socket.on('data', common.mustNotCall());
+  socket.on('error', common.mustCall(function(err) {
+    authorized();
+  }));
+  socket.end('ng');
+}
+
 function authorized() {
   const socket = tls.connect(server.address().port, {
     ca: [fixtures.readSync('test_cert.pem')],
openSUSE Build Service is sponsored by