VYPR
Critical severityNVD Advisory· Published Sep 4, 2020· Updated Sep 16, 2024

Command Injection

CVE-2020-7730

Description

Command injection in bestzip < 2.1.7 via unsanitized options.source allows arbitrary OS command execution.

AI Insight

LLM-synthesized narrative grounded in this CVE's description and references.

Command injection in bestzip < 2.1.7 via unsanitized options.source allows arbitrary OS command execution.

Vulnerability

Overview

The bestzip Node.js package prior to version 2.1.7 is vulnerable to Command Injection through its options parameter. The root cause lies in the way the library constructs a shell command for the native zip utility. Specifically, when options.source is an array, its elements were directly joined with spaces and concatenated into a string that was passed to cp.exec() without proper sanitization [1][2]. This allowed a malicious actor to inject arbitrary shell commands by including command separators (e.g., ;, &&, ` `) in the source` values.

Exploitation

To exploit this vulnerability, an attacker must control the options object passed to bestzip. This can occur in a variety of scenarios, such as when a web application or CI pipeline uses user-supplied input to specify files to be zipped. Since the library directly interpolates the options.source array into a shell command string [2], an attacker can append operating system commands. No elevated privileges or authentication is required beyond the ability to influence the input to the library.

Impact

Successful exploitation allows an attacker to execute arbitrary commands on the host system with the privileges of the process running bestzip. This can lead to data exfiltration, lateral movement, or complete compromise of the application server. The CVSS 3.1 base score assigned by Snyk is 9.8 (Critical), reflecting the severity and low complexity of the attack [3].

Mitigation

The vulnerability is fixed in bestzip version 2.1.7. The fix was implemented by replacing the unsafe cp.exec() call with cp.spawn(), which avoids shell interpretation of the arguments, and by adding an expandSources function to properly handle the source paths [2]. Users are strongly recommended to upgrade to version 2.1.7 or later. There is no known workaround if upgrading is not possible.

AI Insight generated on May 21, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
bestzipnpm
< 2.1.72.1.7

Affected products

2

Patches

1
45d4a901478c

prevent shell command injection

https://github.com/nfriedly/node-bestzipNathan FriedlySep 2, 2020via ghsa
2 files changed · +798 127
  • lib/bestzip.js+26 24 modified
    @@ -65,30 +65,32 @@ function walkDir(fullPath) {
     
     const nativeZip = options =>
       new Promise((resolve, reject) => {
    -    const sources = Array.isArray(options.source)
    -      ? options.source.join(" ")
    -      : options.source;
    -    const command = `zip --quiet --recurse-paths ${
    -      options.destination
    -    } ${sources}`;
    -    const zipProcess = cp.exec(command, {
    -      stdio: "inherit",
    -      cwd: options.cwd
    -    });
    -    zipProcess.on("error", reject);
    -    zipProcess.on("close", exitCode => {
    -      if (exitCode === 0) {
    -        resolve();
    -      } else {
    -        // exit code 12 means "nothing to do" right?
    -        //console.log('rejecting', zipProcess)
    -        reject(
    -          new Error(
    -            `Unexpected exit code from native zip command: ${exitCode}\n executed command '${command}'\n executed inin directory '${options.cwd ||
    -              process.cwd()}'`
    -          )
    -        );
    -      }
    +    const cwd = options.cwd || process.cwd();
    +    const command = "zip";
    +    expandSources(cwd, options.source, (err, sources) => {
    +      const args = ["--quiet", "--recurse-paths", options.destination].concat(
    +        sources
    +      );
    +      const zipProcess = cp.spawn(command, args, {
    +        stdio: "inherit",
    +        cwd
    +      });
    +      zipProcess.on("error", reject);
    +      zipProcess.on("close", exitCode => {
    +        if (exitCode === 0) {
    +          resolve();
    +        } else {
    +          // exit code 12 means "nothing to do" right?
    +          //console.log('rejecting', zipProcess)
    +          reject(
    +            new Error(
    +              `Unexpected exit code from native zip: ${exitCode}\n executed command '${command} ${args.join(
    +                " "
    +              )}'\n executed in directory '${cwd}'`
    +            )
    +          );
    +        }
    +      });
         });
       });
     
    
  • package-lock.json+772 103 modified
    @@ -492,11 +492,114 @@
             "write-file-atomic": "2.4.1"
           },
           "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
             "graceful-fs": {
               "version": "4.2.4",
               "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
               "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
               "dev": true
    +        },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
    +        "micromatch": {
    +          "version": "3.1.10",
    +          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +          "dev": true,
    +          "requires": {
    +            "arr-diff": "^4.0.0",
    +            "array-unique": "^0.3.2",
    +            "braces": "^2.3.1",
    +            "define-property": "^2.0.2",
    +            "extend-shallow": "^3.0.2",
    +            "extglob": "^2.0.4",
    +            "fragment-cache": "^0.2.1",
    +            "kind-of": "^6.0.2",
    +            "nanomatch": "^1.2.9",
    +            "object.pick": "^1.3.0",
    +            "regex-not": "^1.0.0",
    +            "snapdragon": "^0.8.1",
    +            "to-regex": "^3.0.2"
    +          }
    +        },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
             }
           }
         },
    @@ -692,6 +795,99 @@
             "normalize-path": "^2.1.1"
           },
           "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
    +        "micromatch": {
    +          "version": "3.1.10",
    +          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +          "dev": true,
    +          "requires": {
    +            "arr-diff": "^4.0.0",
    +            "array-unique": "^0.3.2",
    +            "braces": "^2.3.1",
    +            "define-property": "^2.0.2",
    +            "extend-shallow": "^3.0.2",
    +            "extglob": "^2.0.4",
    +            "fragment-cache": "^0.2.1",
    +            "kind-of": "^6.0.2",
    +            "nanomatch": "^1.2.9",
    +            "object.pick": "^1.3.0",
    +            "regex-not": "^1.0.0",
    +            "snapdragon": "^0.8.1",
    +            "to-regex": "^3.0.2"
    +          }
    +        },
             "normalize-path": {
               "version": "2.1.1",
               "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
    @@ -700,6 +896,16 @@
               "requires": {
                 "remove-trailing-separator": "^1.0.1"
               }
    +        },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
             }
           }
         },
    @@ -1101,35 +1307,6 @@
             "concat-map": "0.0.1"
           }
         },
    -    "braces": {
    -      "version": "2.3.2",
    -      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    -      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    -      "dev": true,
    -      "requires": {
    -        "arr-flatten": "^1.1.0",
    -        "array-unique": "^0.3.2",
    -        "extend-shallow": "^2.0.1",
    -        "fill-range": "^4.0.0",
    -        "isobject": "^3.0.1",
    -        "repeat-element": "^1.1.2",
    -        "snapdragon": "^0.8.1",
    -        "snapdragon-node": "^2.0.1",
    -        "split-string": "^3.0.2",
    -        "to-regex": "^3.0.1"
    -      },
    -      "dependencies": {
    -        "extend-shallow": {
    -          "version": "2.0.1",
    -          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    -          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    -          "dev": true,
    -          "requires": {
    -            "is-extendable": "^0.1.0"
    -          }
    -        }
    -      }
    -    },
         "browser-process-hrtime": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
    @@ -2200,29 +2377,6 @@
           "dev": true,
           "optional": true
         },
    -    "fill-range": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    -      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    -      "dev": true,
    -      "requires": {
    -        "extend-shallow": "^2.0.1",
    -        "is-number": "^3.0.0",
    -        "repeat-string": "^1.6.1",
    -        "to-regex-range": "^2.1.0"
    -      },
    -      "dependencies": {
    -        "extend-shallow": {
    -          "version": "2.0.1",
    -          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    -          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    -          "dev": true,
    -          "requires": {
    -            "is-extendable": "^0.1.0"
    -          }
    -        }
    -      }
    -    },
         "find-up": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
    @@ -2483,6 +2637,26 @@
             "kind-of": "^4.0.0"
           },
           "dependencies": {
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
             "kind-of": {
               "version": "4.0.0",
               "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
    @@ -2715,26 +2889,6 @@
           "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
           "dev": true
         },
    -    "is-number": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    -      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    -      "dev": true,
    -      "requires": {
    -        "kind-of": "^3.0.2"
    -      },
    -      "dependencies": {
    -        "kind-of": {
    -          "version": "3.2.2",
    -          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    -          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    -          "dev": true,
    -          "requires": {
    -            "is-buffer": "^1.1.5"
    -          }
    -        }
    -      }
    -    },
         "is-path-cwd": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
    @@ -2952,18 +3106,90 @@
             "jest-cli": "^24.8.0"
           },
           "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
             "callsites": {
               "version": "3.1.0",
               "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
               "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
               "dev": true
             },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
             "graceful-fs": {
               "version": "4.2.4",
               "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
               "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
               "dev": true
             },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
             "jest-cli": {
               "version": "24.9.0",
               "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
    @@ -3019,6 +3245,29 @@
                     "rimraf": "^2.5.4",
                     "slash": "^2.0.0",
                     "strip-ansi": "^5.0.0"
    +              },
    +              "dependencies": {
    +                "micromatch": {
    +                  "version": "3.1.10",
    +                  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +                  "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +                  "dev": true,
    +                  "requires": {
    +                    "arr-diff": "^4.0.0",
    +                    "array-unique": "^0.3.2",
    +                    "braces": "^2.3.1",
    +                    "define-property": "^2.0.2",
    +                    "extend-shallow": "^3.0.2",
    +                    "extglob": "^2.0.4",
    +                    "fragment-cache": "^0.2.1",
    +                    "kind-of": "^6.0.2",
    +                    "nanomatch": "^1.2.9",
    +                    "object.pick": "^1.3.0",
    +                    "regex-not": "^1.0.0",
    +                    "snapdragon": "^0.8.1",
    +                    "to-regex": "^3.0.2"
    +                  }
    +                }
                   }
                 },
                 "@jest/test-result": {
    @@ -3081,6 +3330,29 @@
                     "micromatch": "^3.1.10",
                     "pretty-format": "^24.9.0",
                     "realpath-native": "^1.1.0"
    +              },
    +              "dependencies": {
    +                "micromatch": {
    +                  "version": "3.1.10",
    +                  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +                  "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +                  "dev": true,
    +                  "requires": {
    +                    "arr-diff": "^4.0.0",
    +                    "array-unique": "^0.3.2",
    +                    "braces": "^2.3.1",
    +                    "define-property": "^2.0.2",
    +                    "extend-shallow": "^3.0.2",
    +                    "extglob": "^2.0.4",
    +                    "fragment-cache": "^0.2.1",
    +                    "kind-of": "^6.0.2",
    +                    "nanomatch": "^1.2.9",
    +                    "object.pick": "^1.3.0",
    +                    "regex-not": "^1.0.0",
    +                    "snapdragon": "^0.8.1",
    +                    "to-regex": "^3.0.2"
    +                  }
    +                }
                   }
                 },
                 "jest-util": {
    @@ -3147,6 +3419,16 @@
                 }
               }
             },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
    +        },
             "yargs": {
               "version": "13.3.2",
               "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
    @@ -3223,6 +3505,111 @@
             "micromatch": "^3.1.10",
             "pretty-format": "^24.9.0",
             "realpath-native": "^1.1.0"
    +      },
    +      "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
    +        "micromatch": {
    +          "version": "3.1.10",
    +          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +          "dev": true,
    +          "requires": {
    +            "arr-diff": "^4.0.0",
    +            "array-unique": "^0.3.2",
    +            "braces": "^2.3.1",
    +            "define-property": "^2.0.2",
    +            "extend-shallow": "^3.0.2",
    +            "extglob": "^2.0.4",
    +            "fragment-cache": "^0.2.1",
    +            "kind-of": "^6.0.2",
    +            "nanomatch": "^1.2.9",
    +            "object.pick": "^1.3.0",
    +            "regex-not": "^1.0.0",
    +            "snapdragon": "^0.8.1",
    +            "to-regex": "^3.0.2"
    +          }
    +        },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
    +        }
           }
         },
         "jest-diff": {
    @@ -3312,11 +3699,114 @@
             "walker": "^1.0.7"
           },
           "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
             "graceful-fs": {
               "version": "4.2.4",
               "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
               "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
               "dev": true
    +        },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
    +        "micromatch": {
    +          "version": "3.1.10",
    +          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +          "dev": true,
    +          "requires": {
    +            "arr-diff": "^4.0.0",
    +            "array-unique": "^0.3.2",
    +            "braces": "^2.3.1",
    +            "define-property": "^2.0.2",
    +            "extend-shallow": "^3.0.2",
    +            "extglob": "^2.0.4",
    +            "fragment-cache": "^0.2.1",
    +            "kind-of": "^6.0.2",
    +            "nanomatch": "^1.2.9",
    +            "object.pick": "^1.3.0",
    +            "regex-not": "^1.0.0",
    +            "snapdragon": "^0.8.1",
    +            "to-regex": "^3.0.2"
    +          }
    +        },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
             }
           }
         },
    @@ -3380,6 +3870,111 @@
             "micromatch": "^3.1.10",
             "slash": "^2.0.0",
             "stack-utils": "^1.0.1"
    +      },
    +      "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
    +        "micromatch": {
    +          "version": "3.1.10",
    +          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +          "dev": true,
    +          "requires": {
    +            "arr-diff": "^4.0.0",
    +            "array-unique": "^0.3.2",
    +            "braces": "^2.3.1",
    +            "define-property": "^2.0.2",
    +            "extend-shallow": "^3.0.2",
    +            "extglob": "^2.0.4",
    +            "fragment-cache": "^0.2.1",
    +            "kind-of": "^6.0.2",
    +            "nanomatch": "^1.2.9",
    +            "object.pick": "^1.3.0",
    +            "regex-not": "^1.0.0",
    +            "snapdragon": "^0.8.1",
    +            "to-regex": "^3.0.2"
    +          }
    +        },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
    +        }
           }
         },
         "jest-mock": {
    @@ -3970,27 +4565,6 @@
           "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
           "dev": true
         },
    -    "micromatch": {
    -      "version": "3.1.10",
    -      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    -      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    -      "dev": true,
    -      "requires": {
    -        "arr-diff": "^4.0.0",
    -        "array-unique": "^0.3.2",
    -        "braces": "^2.3.1",
    -        "define-property": "^2.0.2",
    -        "extend-shallow": "^3.0.2",
    -        "extglob": "^2.0.4",
    -        "fragment-cache": "^0.2.1",
    -        "kind-of": "^6.0.2",
    -        "nanomatch": "^1.2.9",
    -        "object.pick": "^1.3.0",
    -        "regex-not": "^1.0.0",
    -        "snapdragon": "^0.8.1",
    -        "to-regex": "^3.0.2"
    -      }
    -    },
         "mime-db": {
           "version": "1.44.0",
           "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
    @@ -4838,6 +5412,111 @@
             "micromatch": "^3.1.4",
             "minimist": "^1.1.1",
             "walker": "~1.0.5"
    +      },
    +      "dependencies": {
    +        "braces": {
    +          "version": "2.3.2",
    +          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
    +          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
    +          "dev": true,
    +          "requires": {
    +            "arr-flatten": "^1.1.0",
    +            "array-unique": "^0.3.2",
    +            "extend-shallow": "^2.0.1",
    +            "fill-range": "^4.0.0",
    +            "isobject": "^3.0.1",
    +            "repeat-element": "^1.1.2",
    +            "snapdragon": "^0.8.1",
    +            "snapdragon-node": "^2.0.1",
    +            "split-string": "^3.0.2",
    +            "to-regex": "^3.0.1"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "fill-range": {
    +          "version": "4.0.0",
    +          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
    +          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
    +          "dev": true,
    +          "requires": {
    +            "extend-shallow": "^2.0.1",
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1",
    +            "to-regex-range": "^2.1.0"
    +          },
    +          "dependencies": {
    +            "extend-shallow": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
    +              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
    +              "dev": true,
    +              "requires": {
    +                "is-extendable": "^0.1.0"
    +              }
    +            }
    +          }
    +        },
    +        "is-number": {
    +          "version": "3.0.0",
    +          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
    +          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
    +          "dev": true,
    +          "requires": {
    +            "kind-of": "^3.0.2"
    +          },
    +          "dependencies": {
    +            "kind-of": {
    +              "version": "3.2.2",
    +              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
    +              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
    +              "dev": true,
    +              "requires": {
    +                "is-buffer": "^1.1.5"
    +              }
    +            }
    +          }
    +        },
    +        "micromatch": {
    +          "version": "3.1.10",
    +          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
    +          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
    +          "dev": true,
    +          "requires": {
    +            "arr-diff": "^4.0.0",
    +            "array-unique": "^0.3.2",
    +            "braces": "^2.3.1",
    +            "define-property": "^2.0.2",
    +            "extend-shallow": "^3.0.2",
    +            "extglob": "^2.0.4",
    +            "fragment-cache": "^0.2.1",
    +            "kind-of": "^6.0.2",
    +            "nanomatch": "^1.2.9",
    +            "object.pick": "^1.3.0",
    +            "regex-not": "^1.0.0",
    +            "snapdragon": "^0.8.1",
    +            "to-regex": "^3.0.2"
    +          }
    +        },
    +        "to-regex-range": {
    +          "version": "2.1.1",
    +          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    +          "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    +          "dev": true,
    +          "requires": {
    +            "is-number": "^3.0.0",
    +            "repeat-string": "^1.6.1"
    +          }
    +        }
           }
         },
         "sax": {
    @@ -5387,16 +6066,6 @@
             "safe-regex": "^1.1.0"
           }
         },
    -    "to-regex-range": {
    -      "version": "2.1.1",
    -      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
    -      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
    -      "dev": true,
    -      "requires": {
    -        "is-number": "^3.0.0",
    -        "repeat-string": "^1.6.1"
    -      }
    -    },
         "tough-cookie": {
           "version": "2.5.0",
           "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
    

Vulnerability mechanics

Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

4

News mentions

0

No linked articles in our index yet.