Skip to content

NullPointerException When Generating Commercial Tools Average Scorecard #268

@vinnimous

Description

@vinnimous

Summary

BenchmarkUtils v1.3 throws a NullPointerException when attempting to generate the Commercial Tools Average scorecard if 2+ commercial tools are included in the results.

 

Environment

  • BenchmarkUtils Version: 1.3 (also present in current main branch as of 2026-02-09)

  • Test Suite: BenchmarkJava v1.2

  • Build Tool: Maven 3.x

  • JDK: 17

 

Steps to Reproduce

  1. Run BenchmarkUtils scorecard generation with results from 2 or more commercial security tools

  2. Ensure all individual tool result files parse successfully

  3. Execute: mvn org.owasp:benchmarkutils-maven-plugin:create-scorecard -DconfigFile=<config.yml>

  4. Observe error after "Tool scorecards computed." message

 

Expected Behavior

BenchmarkUtils should successfully generate:

  • Individual tool scorecards

  • Vulnerability comparison scorecards

  • Commercial Tools Average scorecard (comparing commercial tool performance)

  • Overall summary scorecards

 

Actual Behavior

Process fails with:


Tool scorecards computed.

[INFO] ------------------------------------------------------------------------

[INFO] BUILD FAILURE

[INFO] ------------------------------------------------------------------------

Error: Failed to execute goal org.owasp:benchmarkutils-maven-plugin:1.3:create-scorecard

Caused by: java.lang.NullPointerException

    at java.io.Reader.<init> (Reader.java:168)

    at java.io.InputStreamReader.<init> (InputStreamReader.java:112)

    at org.apache.commons.io.IOUtils.copy (IOUtils.java:1430)

    at org.apache.commons.io.IOUtils.toString (IOUtils.java:3406)

    at org.owasp.benchmarkutils.score.BenchmarkScore.generateVulnerabilityScorecards (BenchmarkScore.java:966)

 

Root Cause Analysis

 

Location: plugin/src/main/java/org/owasp/benchmarkutils/score/BenchmarkScore.java at line 966

 

Problematic Code:

// Line 962-966 (current implementation)

// Resources in a jar file have to be loaded as streams. Not directly as Files.

InputStream vulnTemplateStream =

        CL.getResourceAsStream(scoreCardDir + "/commercialAveTemplate.html");

String html = IOUtils.toString(vulnTemplateStream, StandardCharsets.UTF_8);

 

Issue: The code concatenates a File object (scoreCardDir) with a string path, resulting in an invalid classpath resource path like:

  • Generated path: results/scorecard/commercialAveTemplate.html (invalid classpath resource)

  • Expected path: scorecard/commercialAveTemplate.html (valid classpath resource)

 

When getResourceAsStream() receives an invalid classpath, it returns null. This causes IOUtils.toString() to throw a NullPointerException when attempting to read from a null InputStream.

 

Comparison with Working Code: The vulnerability template loading at line 914 correctly uses a string literal:

// Line 914 (CORRECT implementation)

final String VULNTEMPLATERESOURCE = "scorecard/vulntemplate.html";

InputStream vulnTemplateStream = CL.getResourceAsStream(VULNTEMPLATERESOURCE);

 

Proposed Fix

 

File: plugin/src/main/java/org/owasp/benchmarkutils/score/BenchmarkScore.java

 

Location: In method generateVulnerabilityScorecards(), approximately line 965 (line number may vary by version)

 

Change:

// BEFORE (incorrect):

InputStream vulnTemplateStream =

        CL.getResourceAsStream(scoreCardDir + "/commercialAveTemplate.html");

 

// AFTER (correct):

InputStream vulnTemplateStream =

        CL.getResourceAsStream("scorecard/commercialAveTemplate.html");

 

Patch File (for v1.3)

Note: Line numbers may vary in different versions. Verify line numbers before applying.

 

--- a/plugin/src/main/java/org/owasp/benchmarkutils/score/BenchmarkScore.java

+++ b/plugin/src/main/java/org/owasp/benchmarkutils/score/BenchmarkScore.java

@@ -963,7 +963,7 @@ private static void generateVulnerabilityScorecards(

                

                 // Resources in a jar file have to be loaded as streams. Not directly as Files.

                 InputStream vulnTemplateStream =

-                        CL.getResourceAsStream(scoreCardDir + "/commercialAveTemplate.html");

+                        CL.getResourceAsStream("scorecard/commercialAveTemplate.html");

                 String html = IOUtils.toString(vulnTemplateStream, StandardCharsets.UTF_8);

                 html = html.replace("${testsuite}", BenchmarkScore.TESTSUITENAME.fullName());

                 html = html.replace("${version}", TESTSUITEVERSION);

 

Alternative: Direct sed Command

If the patch fails due to line number mismatches:

sed -i 's|CL\.getResourceAsStream(scoreCardDir + "/commercialAveTemplate\.html")|CL.getResourceAsStream("scorecard/commercialAveTemplate.html")|g' \

  plugin/src/main/java/org/owasp/benchmarkutils/score/BenchmarkScore.java

 

Impact

 

Severity: High

 

Affected Users: Anyone running BenchmarkUtils scorecards with:

  • 2 or more commercial security tools in their results

  • BenchmarkJava, BenchmarkPython, or BenchmarkNodeJS test suites

 

Workaround:

  1. Apply the patch manually to BenchmarkUtils source before building

  2. OR exclude all but one commercial tool from results directory

  3. OR set showAveOnlyMode: false in scoring config (if commercial averages aren't needed)

 

Tested Solution

Patch has been validated with:

  • BenchmarkJava v1.2 (2740 test cases)

  • 14 security tool result files including 4 commercial tools

  • Successfully generates all scorecards including Commercial Tools Average

 

Additional Notes

  • Bug exists in both v1.3 release and current main branch

  • Similar pattern used correctly for other templates (vulntemplate.html, template.html)

  • File location: plugin/src/main/resources/scorecard/commercialAveTemplate.html is correct

  • Bug only manifests when commercialAveragesTable.hasEntries() returns true (2+ commercial tools)

 

References

  • Resource loading pattern at line 914: CL.getResourceAsStream(VULNTEMPLATERESOURCE)

  • Resource loading pattern at line 67 (ToolReport.java): getResourceAsStream(BenchmarkScore.SCORECARDDIRNAME + "/template.html")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions