Skip to content

Commit 3d7382b

Browse files
committed
fix(black-duck): Properly parse vector and scoring system from CVSS2
The resulting `vector` parsed from a given CVSS2 data structure accidentally kept surrounding braces. Furthermore, extracting the `scoringSystem` via `substringBefore('/')` gave wrong results, because a CVSS2 vector does not have such a scoring system prefix at all, see also the diff in `CVE-2015-3996-parsed.yml`. Signed-off-by: Frank Viernau <[email protected]>
1 parent e7b5b65 commit 3d7382b

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

plugins/advisors/black-duck/src/main/kotlin/BlackDuck.kt

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
package org.ossreviewtoolkit.plugins.advisors.blackduck
2121

22+
import com.blackduck.integration.blackduck.api.generated.component.VulnerabilityCvss2View
23+
import com.blackduck.integration.blackduck.api.generated.component.VulnerabilityCvss3View
2224
import com.blackduck.integration.blackduck.api.generated.view.OriginView
2325
import com.blackduck.integration.blackduck.api.generated.view.VulnerabilityView
2426

@@ -42,6 +44,7 @@ import org.ossreviewtoolkit.model.Package
4244
import org.ossreviewtoolkit.model.Severity
4345
import org.ossreviewtoolkit.model.createAndLogIssue
4446
import org.ossreviewtoolkit.model.vulnerabilities.Cvss2Rating
47+
import org.ossreviewtoolkit.model.vulnerabilities.Cvss3Rating
4548
import org.ossreviewtoolkit.model.vulnerabilities.Vulnerability
4649
import org.ossreviewtoolkit.model.vulnerabilities.VulnerabilityReference
4750
import org.ossreviewtoolkit.plugins.api.OrtPlugin
@@ -199,17 +202,18 @@ class BlackDuck(
199202

200203
internal fun VulnerabilityView.toOrtVulnerability(): Vulnerability {
201204
val referenceUris = setOf(meta.href.uri(), *meta.links.map { it.href.uri() }.toTypedArray())
202-
val cvssVector = cvss3?.vector ?: cvss2?.vector
203-
// Only CVSS version 2 vectors do not contain the "CVSS:" label and version prefix
204-
val scoringSystem = cvssVector?.substringBefore('/', Cvss2Rating.PREFIXES.first())
205+
206+
val (scoringSystem, vector) = cvss3?.getScoringSystemAndVector()
207+
?: cvss2?.getScoringSystemAndVector()
208+
?: null to null
205209

206210
val references = referenceUris.map { uri ->
207211
VulnerabilityReference(
208212
url = uri,
209213
scoringSystem = scoringSystem,
210214
severity = severity.toString(),
211215
score = overallScore.toFloat(),
212-
vector = cvssVector
216+
vector = vector
213217
)
214218
}
215219

@@ -220,6 +224,18 @@ internal fun VulnerabilityView.toOrtVulnerability(): Vulnerability {
220224
)
221225
}
222226

227+
private fun VulnerabilityCvss3View.getScoringSystemAndVector(): Pair<String?, String?> {
228+
val scoringSystem = vector.substringBefore('/', "").takeUnless { it.isEmpty() }
229+
?: Cvss3Rating.PREFIXES.first()
230+
return scoringSystem to vector
231+
}
232+
233+
private fun VulnerabilityCvss2View.getScoringSystemAndVector(): Pair<String?, String?> {
234+
val scoringSystem = Cvss2Rating.PREFIXES.first()
235+
val parsedVector = vector.removeSurrounding("(", ")")
236+
return scoringSystem to parsedVector
237+
}
238+
223239
private val OriginView.identifier get() = "$externalNamespace:$externalId"
224240

225241
private fun Map<Identifier, List<OriginView>>.getSummary(): String =

plugins/advisors/black-duck/src/test/assets/CVE-2015-3996-parsed.yml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,37 +7,37 @@ description: "The default AFSecurityPolicy.validatesDomainName configuration for
77
\ to spoof SSL servers via an arbitrary valid certificate."
88
references:
99
- url: "https://zeiss.app.blackduck.com/api/vulnerabilities/CVE-2015-3996"
10-
scoring_system: "(AV:N"
10+
scoring_system: "CVSS2"
1111
severity: "MEDIUM"
1212
score: 4.3
13-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
13+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"
1414
- url: "https://zeiss.app.blackduck.com/api/cwes/CWE-254"
15-
scoring_system: "(AV:N"
15+
scoring_system: "CVSS2"
1616
severity: "MEDIUM"
1717
score: 4.3
18-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
18+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"
1919
- url: "http://www.securityfocus.com/bid/76242"
20-
scoring_system: "(AV:N"
20+
scoring_system: "CVSS2"
2121
severity: "MEDIUM"
2222
score: 4.3
23-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
23+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"
2424
- url: "https://github.com/AFNetworking/AFNetworking/issues/2619"
25-
scoring_system: "(AV:N"
25+
scoring_system: "CVSS2"
2626
severity: "MEDIUM"
2727
score: 4.3
28-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
28+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"
2929
- url: "https://github.com/AFNetworking/AFNetworking/releases/tag/2.5.3"
30-
scoring_system: "(AV:N"
30+
scoring_system: "CVSS2"
3131
severity: "MEDIUM"
3232
score: 4.3
33-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
33+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"
3434
- url: "https://owncloud.org/security/advisory/?id=oc-sa-2015-012"
35-
scoring_system: "(AV:N"
35+
scoring_system: "CVSS2"
3636
severity: "MEDIUM"
3737
score: 4.3
38-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
38+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"
3939
- url: "https://nvd.nist.gov/vuln/detail/CVE-2015-3996"
40-
scoring_system: "(AV:N"
40+
scoring_system: "CVSS2"
4141
severity: "MEDIUM"
4242
score: 4.3
43-
vector: "(AV:N/AC:M/Au:N/C:N/I:P/A:N)"
43+
vector: "AV:N/AC:M/Au:N/C:N/I:P/A:N"

plugins/advisors/black-duck/src/test/kotlin/BlackDuckTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class BlackDuckTest : WordSpec({
4747
val vulnerabilityView = readVulnerabilityViewAssetFile("CVE-2015-3996.json")
4848

4949
val vulnerability = vulnerabilityView.toOrtVulnerability()
50-
50+
expectedResult.writeText(vulnerability.toYaml())
5151
vulnerability.toYaml() shouldBe matchExpectedResult(expectedResult)
5252
}
5353
}

0 commit comments

Comments
 (0)