Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit ad0d16a

Browse files
authored
feat: add cvssV4 support (#6756)
1 parent a798f89 commit ad0d16a

25 files changed

+1086
-47
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ Dependency-Check is a Software Composition Analysis (SCA) tool that attempts to
88

99
Documentation and links to production binary releases can be found on the [github pages](http://jeremylong.github.io/DependencyCheck/). Additionally, more information about the architecture and ways to extend dependency-check can be found on the [wiki].
1010

11+
## Notice
12+
13+
This product uses the NVD API but is not endorsed or certified by the NVD.
14+
1115
## 9.0.0 Upgrade Notice
1216

1317
**Upgrading to 9.0.0 or later is mandatory**; previous versions of dependency-check

ant/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Copyright (c) 2013 - Jeremy Long. All Rights Reserved.
2020
<parent>
2121
<groupId>org.owasp</groupId>
2222
<artifactId>dependency-check-parent</artifactId>
23-
<version>9.2.1-SNAPSHOT</version>
23+
<version>10.0.0-SNAPSHOT</version>
2424
</parent>
2525

2626
<artifactId>dependency-check-ant</artifactId>

archetype/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Copyright (c) 2017 Jeremy Long. All Rights Reserved.
2020
<parent>
2121
<groupId>org.owasp</groupId>
2222
<artifactId>dependency-check-parent</artifactId>
23-
<version>9.2.1-SNAPSHOT</version>
23+
<version>10.0.0-SNAPSHOT</version>
2424
</parent>
2525
<artifactId>dependency-check-plugin</artifactId>
2626
<name>Dependency-Check Plugin Archetype</name>

cli/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Copyright (c) 2012 - Jeremy Long. All Rights Reserved.
2020
<parent>
2121
<groupId>org.owasp</groupId>
2222
<artifactId>dependency-check-parent</artifactId>
23-
<version>9.2.1-SNAPSHOT</version>
23+
<version>10.0.0-SNAPSHOT</version>
2424
</parent>
2525

2626
<artifactId>dependency-check-cli</artifactId>

core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Copyright (c) 2012 Jeremy Long. All Rights Reserved.
2020
<parent>
2121
<groupId>org.owasp</groupId>
2222
<artifactId>dependency-check-parent</artifactId>
23-
<version>9.2.1-SNAPSHOT</version>
23+
<version>10.0.0-SNAPSHOT</version>
2424
</parent>
2525

2626
<artifactId>dependency-check-core</artifactId>

core/src/main/java/org/owasp/dependencycheck/data/nodeaudit/NpmAuditParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,13 @@ private Advisory parseAdvisory(JSONObject object) throws JSONException {
132132
}
133133
if (baseScore >= 0.0) {
134134
final String vector = jsonCvss.optString("vectorString");
135-
if (vector != null) {
135+
if (vector != null && !"null".equals(vector)) {
136136
if (vector.startsWith("CVSS:3") && baseScore >= 0.0) {
137137
try {
138138
final CvssV3 cvss = CvssUtil.vectorToCvssV3(vector, baseScore);
139139
advisory.setCvssV3(cvss);
140140
} catch (IllegalArgumentException iae) {
141-
LOGGER.warn("Invalid CVSS vector format encountered in NPM Audit results '{}' ", vector, iae);
141+
LOGGER.warn("Invalid CVSS vector format encountered in NPM Audit results '{}': {} ", vector, iae.getMessage());
142142
}
143143
} else {
144144
LOGGER.warn("Unsupported CVSS vector format in NPM Audit results, please file a feature "

core/src/main/java/org/owasp/dependencycheck/data/nvdcve/CveDB.java

Lines changed: 525 additions & 2 deletions
Large diffs are not rendered by default.

core/src/main/java/org/owasp/dependencycheck/data/nvdcve/H2Functions.java

Lines changed: 135 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,47 @@ public static void insertSoftware(final Connection conn, int vulnerabilityId, St
178178
* @param v3BaseScore the CVSS v3 base score
179179
* @param v3BaseSeverity the CVSS v3 base severity
180180
* @param v3Version the CVSS v3 version
181+
* @param v4version CVSS v4 data
182+
* @param v4attackVector CVSS v4 data
183+
* @param v4attackComplexity CVSS v4 data
184+
* @param v4attackRequirements CVSS v4 data
185+
* @param v4privilegesRequired CVSS v4 data
186+
* @param v4userInteraction CVSS v4 data
187+
* @param v4vulnConfidentialityImpact CVSS v4 data
188+
* @param v4vulnIntegrityImpact CVSS v4 data
189+
* @param v4vulnAvailabilityImpact CVSS v4 data
190+
* @param v4subConfidentialityImpact CVSS v4 data
191+
* @param v4subIntegrityImpact CVSS v4 data
192+
* @param v4subAvailabilityImpact CVSS v4 data
193+
* @param v4exploitMaturity CVSS v4 data
194+
* @param v4confidentialityRequirement CVSS v4 data
195+
* @param v4integrityRequirement CVSS v4 data
196+
* @param v4availabilityRequirement CVSS v4 data
197+
* @param v4modifiedAttackVector CVSS v4 data
198+
* @param v4modifiedAttackComplexity CVSS v4 data
199+
* @param v4modifiedAttackRequirements CVSS v4 data
200+
* @param v4modifiedPrivilegesRequired CVSS v4 data
201+
* @param v4modifiedUserInteraction CVSS v4 data
202+
* @param v4modifiedVulnConfidentialityImpact CVSS v4 data
203+
* @param v4modifiedVulnIntegrityImpact CVSS v4 data
204+
* @param v4modifiedVulnAvailabilityImpact CVSS v4 data
205+
* @param v4modifiedSubConfidentialityImpact CVSS v4 data
206+
* @param v4modifiedSubIntegrityImpact CVSS v4 data
207+
* @param v4modifiedSubAvailabilityImpact CVSS v4 data
208+
* @param v4safety CVSS v4 data
209+
* @param v4automatable CVSS v4 data
210+
* @param v4recovery CVSS v4 data
211+
* @param v4valueDensity CVSS v4 data
212+
* @param v4vulnerabilityResponseEffort CVSS v4 data
213+
* @param v4providerUrgency CVSS v4 data
214+
* @param v4baseScore CVSS v4 data
215+
* @param v4baseSeverity CVSS v4 data
216+
* @param v4threatScore CVSS v4 data
217+
* @param v4threatSeverity CVSS v4 data
218+
* @param v4environmentalScore CVSS v4 data
219+
* @param v4environmentalSeverity CVSS v4 data
220+
* @param v4source CVSS v4 data
221+
* @param v4type CVSS v4 data
181222
* @return a result set containing the vulnerability id
182223
* @throws SQLException thrown if there is an error updating or inserting
183224
* the vulnerability
@@ -192,7 +233,20 @@ public static ResultSet updateVulnerability(final Connection conn, String cve,
192233
Float v3ImpactScore, String v3AttackVector, String v3AttackComplexity,
193234
String v3PrivilegesRequired, String v3UserInteraction, String v3Scope,
194235
String v3ConfidentialityImpact, String v3IntegrityImpact, String v3AvailabilityImpact,
195-
Float v3BaseScore, String v3BaseSeverity, String v3Version) throws SQLException {
236+
Float v3BaseScore, String v3BaseSeverity, String v3Version, String v4version,
237+
String v4attackVector, String v4attackComplexity, String v4attackRequirements,
238+
String v4privilegesRequired, String v4userInteraction, String v4vulnConfidentialityImpact,
239+
String v4vulnIntegrityImpact, String v4vulnAvailabilityImpact, String v4subConfidentialityImpact,
240+
String v4subIntegrityImpact, String v4subAvailabilityImpact, String v4exploitMaturity,
241+
String v4confidentialityRequirement, String v4integrityRequirement, String v4availabilityRequirement,
242+
String v4modifiedAttackVector, String v4modifiedAttackComplexity, String v4modifiedAttackRequirements,
243+
String v4modifiedPrivilegesRequired, String v4modifiedUserInteraction, String v4modifiedVulnConfidentialityImpact,
244+
String v4modifiedVulnIntegrityImpact, String v4modifiedVulnAvailabilityImpact, String v4modifiedSubConfidentialityImpact,
245+
String v4modifiedSubIntegrityImpact, String v4modifiedSubAvailabilityImpact, String v4safety,
246+
String v4automatable, String v4recovery, String v4valueDensity, String v4vulnerabilityResponseEffort,
247+
String v4providerUrgency, Float v4baseScore, String v4baseSeverity, Float v4threatScore,
248+
String v4threatSeverity, Float v4environmentalScore, String v4environmentalSeverity,
249+
String v4source, String v4type) throws SQLException {
196250

197251
final SimpleResultSet ret = new SimpleResultSet();
198252
ret.addColumn("id", Types.INTEGER, 10, 0);
@@ -240,7 +294,22 @@ public static ResultSet updateVulnerability(final Connection conn, String cve,
240294
+ "v3ImpactScore=?, v3AttackVector=?, v3AttackComplexity=?, "
241295
+ "v3PrivilegesRequired=?, v3UserInteraction=?, v3Scope=?, "
242296
+ "v3ConfidentialityImpact=?, v3IntegrityImpact=?, v3AvailabilityImpact=?, "
243-
+ "v3BaseScore=?, v3BaseSeverity=?, v3Version=? "
297+
+ "v3BaseScore=?, v3BaseSeverity=?, v3Version=?, v4version=?, v4attackVector=?, "
298+
+ "v4attackComplexity=?, v4attackRequirements=?, v4privilegesRequired=?, "
299+
+ "v4userInteraction=?, v4vulnConfidentialityImpact=?, v4vulnIntegrityImpact=?, "
300+
+ "v4vulnAvailabilityImpact=?, v4subConfidentialityImpact=?, v4subIntegrityImpact=?, "
301+
+ "v4subAvailabilityImpact=?, v4exploitMaturity=?, "
302+
+ "v4confidentialityRequirement=?, v4integrityRequirement=?, "
303+
+ "v4availabilityRequirement=?, v4modifiedAttackVector=?, "
304+
+ "v4modifiedAttackComplexity=?, v4modifiedAttackRequirements=?, "
305+
+ "v4modifiedPrivilegesRequired=?, v4modifiedUserInteraction=?, "
306+
+ "v4modifiedVulnConfidentialityImpact=?, v4modifiedVulnIntegrityImpact=?, "
307+
+ "v4modifiedVulnAvailabilityImpact=?, v4modifiedSubConfidentialityImpact=?, "
308+
+ "v4modifiedSubIntegrityImpact=?, v4modifiedSubAvailabilityImpact=?, "
309+
+ "v4safety=?, v4automatable=?, v4recovery=?, v4valueDensity=?, "
310+
+ "v4vulnerabilityResponseEffort=?, v4providerUrgency=?, v4baseScore=?, "
311+
+ "v4baseSeverity=?, v4threatScore=?, v4threatSeverity=?, v4environmentalScore=?, "
312+
+ "v4environmentalSeverity=?, v4source=?, v4type=?"
244313
+ "WHERE id=?");
245314
} else {
246315
//just do insert
@@ -255,8 +324,22 @@ public static ResultSet updateVulnerability(final Connection conn, String cve,
255324
+ "v3ImpactScore, v3AttackVector, v3AttackComplexity, "
256325
+ "v3PrivilegesRequired, v3UserInteraction, v3Scope, "
257326
+ "v3ConfidentialityImpact, v3IntegrityImpact, v3AvailabilityImpact, "
258-
+ "v3BaseScore, v3BaseSeverity, v3Version, cve) VALUES (?, ?, ?, ?, ?, ?, "
259-
+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
327+
+ "v3BaseScore, v3BaseSeverity, v3Version, v4version, v4attackVector, "
328+
+ "v4attackComplexity, v4attackRequirements, v4privilegesRequired, "
329+
+ "v4userInteraction, v4vulnConfidentialityImpact, v4vulnIntegrityImpact, "
330+
+ "v4vulnAvailabilityImpact, v4subConfidentialityImpact, v4subIntegrityImpact, "
331+
+ "v4subAvailabilityImpact, v4exploitMaturity,v4confidentialityRequirement, "
332+
+ "v4integrityRequirement, v4availabilityRequirement,v4modifiedAttackVector, "
333+
+ "v4modifiedAttackComplexity, v4modifiedAttackRequirements,v4modifiedPrivilegesRequired, "
334+
+ "v4modifiedUserInteraction, v4modifiedVulnConfidentialityImpact,v4modifiedVulnIntegrityImpact, "
335+
+ "v4modifiedVulnAvailabilityImpact, v4modifiedSubConfidentialityImpact,v4modifiedSubIntegrityImpact, "
336+
+ "v4modifiedSubAvailabilityImpact, v4safety, v4automatable, v4recovery, v4valueDensity, "
337+
+ "v4vulnerabilityResponseEffort, v4providerUrgency, v4baseScore, v4baseSeverity, "
338+
+ "v4threatScore,v4threatSeverity, v4environmentalScore, v4environmentalSeverity, "
339+
+ "v4source, v4type, cve) VALUES (?, ?, ?, ?, ?, ?, "
340+
+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
341+
+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
342+
+ "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
260343
returnedColumns);
261344
}
262345

@@ -291,12 +374,58 @@ public static ResultSet updateVulnerability(final Connection conn, String cve,
291374
setFloatOrNull(merge, 28, v3BaseScore);
292375
setStringOrNull(merge, 29, v3BaseSeverity);
293376
setStringOrNull(merge, 30, v3Version);
377+
378+
294379

380+
setStringOrNull(merge, 31, v4version);
381+
setStringOrNull(merge, 32, v4attackVector);
382+
setStringOrNull(merge, 33, v4attackComplexity);
383+
setStringOrNull(merge, 34, v4attackRequirements);
384+
setStringOrNull(merge, 35, v4privilegesRequired);
385+
setStringOrNull(merge, 36, v4userInteraction);
386+
setStringOrNull(merge, 37, v4vulnConfidentialityImpact);
387+
setStringOrNull(merge, 38, v4vulnIntegrityImpact);
388+
setStringOrNull(merge, 39, v4vulnAvailabilityImpact);
389+
setStringOrNull(merge, 40, v4subConfidentialityImpact);
390+
setStringOrNull(merge, 41, v4subIntegrityImpact);
391+
setStringOrNull(merge, 42, v4subAvailabilityImpact);
392+
setStringOrNull(merge, 43, v4exploitMaturity);
393+
setStringOrNull(merge, 44, v4confidentialityRequirement);
394+
setStringOrNull(merge, 45, v4integrityRequirement);
395+
setStringOrNull(merge, 46, v4availabilityRequirement);
396+
setStringOrNull(merge, 47, v4modifiedAttackVector);
397+
setStringOrNull(merge, 48, v4modifiedAttackComplexity);
398+
setStringOrNull(merge, 49, v4modifiedAttackRequirements);
399+
setStringOrNull(merge, 50, v4modifiedPrivilegesRequired);
400+
setStringOrNull(merge, 51, v4modifiedUserInteraction);
401+
setStringOrNull(merge, 52, v4modifiedVulnConfidentialityImpact);
402+
setStringOrNull(merge, 53, v4modifiedVulnIntegrityImpact);
403+
setStringOrNull(merge, 54, v4modifiedVulnAvailabilityImpact);
404+
setStringOrNull(merge, 55, v4modifiedSubConfidentialityImpact);
405+
setStringOrNull(merge, 56, v4modifiedSubIntegrityImpact);
406+
setStringOrNull(merge, 57, v4modifiedSubAvailabilityImpact);
407+
setStringOrNull(merge, 58, v4safety);
408+
setStringOrNull(merge, 59, v4automatable);
409+
setStringOrNull(merge, 60, v4recovery);
410+
setStringOrNull(merge, 61, v4valueDensity);
411+
setStringOrNull(merge, 62, v4vulnerabilityResponseEffort);
412+
setStringOrNull(merge, 63, v4providerUrgency);
413+
setFloatOrNull(merge, 64, v4baseScore);
414+
setStringOrNull(merge, 65, v4baseSeverity);
415+
setFloatOrNull(merge, 66, v4threatScore);
416+
setStringOrNull(merge, 67, v4threatSeverity);
417+
setFloatOrNull(merge, 68, v4environmentalScore);
418+
setStringOrNull(merge, 69, v4environmentalSeverity);
419+
setStringOrNull(merge, 70, v4source);
420+
setStringOrNull(merge, 71, v4type);
421+
422+
//cve must be the last entry
295423
if (vulnerabilityId == 0) {
296-
merge.setString(31, cve);
424+
merge.setString(72, cve);
297425
} else {
298-
merge.setInt(31, vulnerabilityId);
426+
merge.setInt(72, vulnerabilityId);
299427
}
428+
300429
final int count = merge.executeUpdate();
301430
if (vulnerabilityId == 0) {
302431
try (ResultSet rs = merge.getGeneratedKeys()) {

core/src/main/java/org/owasp/dependencycheck/dependency/Vulnerability.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import io.github.jeremylong.openvulnerability.client.nvd.CvssV2;
2121
import io.github.jeremylong.openvulnerability.client.nvd.CvssV3;
22+
import io.github.jeremylong.openvulnerability.client.nvd.CvssV4;
2223
import java.io.Serializable;
2324
import java.util.ArrayList;
2425
import java.util.Collections;
@@ -116,6 +117,11 @@ public enum Source {
116117
* The CVSS V3 scoring information.
117118
*/
118119
private CvssV3 cvssV3;
120+
121+
/**
122+
* The CVSS V4 scoring information.
123+
*/
124+
private CvssV4 cvssV4;
119125

120126
/**
121127
* The Vulnerable Software that caused this vulnerability to be flagged.
@@ -337,6 +343,24 @@ public CvssV3 getCvssV3() {
337343
public void setCvssV3(CvssV3 cvssV3) {
338344
this.cvssV3 = cvssV3;
339345
}
346+
347+
/**
348+
* Get the CVSS V3 scoring information.
349+
*
350+
* @return the CVSS V3 scoring information
351+
*/
352+
public CvssV4 getCvssV4() {
353+
return cvssV4;
354+
}
355+
356+
/**
357+
* Sets the CVSS V4 scoring information.
358+
*
359+
* @param cvssV4 the CVSS V4 scoring information
360+
*/
361+
public void setCvssV4(CvssV4 cvssV4) {
362+
this.cvssV4 = cvssV4;
363+
}
340364

341365
/**
342366
* Get the set of CWEs.

0 commit comments

Comments
 (0)