Skip to content

NullPointerException in Semver for alternative NPM versions #5158

@ssams

Description

@ssams

Describe the bug
Follow-up to #5128, seems not to be fully fixed yet: I receive a NullPointerException from the NodePackageAnalyzer when analyzing a package-lock.json. Exception message does slightly differ from the trace in the linked earlier issue though:

[WARN] An unexpected error occurred during analysis of '/src/package-lock.json' (Node.js Package Analyzer): Cannot invoke "String.isEmpty()" because "string" is null
[ERROR] 
java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "string" is null
        at org.semver4j.Range$RangeOperator.value(Range.java:138)
        at org.semver4j.RangesListFactory.addRanges(RangesListFactory.java:53)
        at org.semver4j.RangesListFactory.create(RangesListFactory.java:26)
        at org.semver4j.Semver.satisfies(Semver.java:445)
        at org.owasp.dependencycheck.analyzer.DependencyBundlingAnalyzer.npmVersionsMatch(DependencyBundlingAnalyzer.java:628)
        at org.owasp.dependencycheck.analyzer.AbstractNpmAnalyzer.findDependency(AbstractNpmAnalyzer.java:296)
        at org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.processDependencies(NodePackageAnalyzer.java:454)
        at org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.processDependencies(NodePackageAnalyzer.java:402)
        at org.owasp.dependencycheck.analyzer.NodePackageAnalyzer.analyzeDependency(NodePackageAnalyzer.java:270)
        at org.owasp.dependencycheck.analyzer.AbstractAnalyzer.analyze(AbstractAnalyzer.java:131)
        at org.owasp.dependencycheck.AnalysisTask.call(AnalysisTask.java:88)
        at org.owasp.dependencycheck.AnalysisTask.call(AnalysisTask.java:37)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

Version of dependency-check used
latest main as of writing -> e84cb80 (run via the CLI within a container, using the included Dockerfile)

To Reproduce

Adding a few quick debug logs in DependencyBundlingAnalyzer shows that in my current/specific case npmVersionsMatch is invoked with arguments current = "^14.14.20 || ^16.0.0" and next = "18.11.5", which seems to originate from the following snippet in the package-lock.json:

    "@storybook/angular": {
      "version": "6.5.13",
      // ...
      "requires": {
        // ...
        "@types/node": "^14.14.20 || ^16.0.0",

Similar to jeremylong/DependencyCheck#5128 (comment), this seems to be sufficient to trigger the NPE:

Semver semver = new Semver("18.11.5");
System.out.println(semver.satisfies("^14.14.20 || ^16.0.0"));

Note

Based on the comment in the code I'm not sure if the check in https://github.com/jeremylong/DependencyCheck/blob/e84cb804aa1510bd50515ad600fec2034decabd6/core/src/main/java/org/owasp/dependencycheck/analyzer/DependencyBundlingAnalyzer.java#L616-L617 should be also preventing this, if so it doesn't catch this specific parameter combination as the next version doesn't include a space.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions