Skip to content

Commit c0bfcc2

Browse files
docs: enhance known vulnerabilities page
1 parent 03bae1e commit c0bfcc2

1 file changed

Lines changed: 120 additions & 36 deletions

File tree

docs/_docs/analysis-types/known-vulnerabilities.md

Lines changed: 120 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,79 +5,163 @@ chapter: 3
55
order: 1
66
---
77

8-
Dependency-Track integrates with multiple sources of vulnerability intelligence to identify components with known
9-
vulnerabilities. The platform employs several methods of vulnerability identification including:
8+
Dependency-Track integrates with multiple sources of vulnerability intelligence to identify components with known
9+
vulnerabilities. The platform employs several methods of vulnerability identification:
1010

11-
| Analyzer | Description |
12-
|-----------|--------------------------------------------------------------------------------------------------------|
13-
| Internal | Identifies vulnerable components from an internal directory of vulnerable software |
14-
| OSS Index | OSS Index is a service provided by Sonatype which identifies vulnerabilities in third-party components |
15-
| VulnDB | VulnDB is a commercial service which identifies vulnerabilities in third-party components |
16-
| Snyk | Snyk is a commercial service which identifies vulnerabilities in third-party components |
11+
| Analyzer | Type | Identifier | Description |
12+
|-----------|-----------------|--------------|------------------------------------------------------------------------------------------|
13+
| Internal | Mirror-based | CPE and PURL | Analyzes components against a local mirror of NVD, GitHub Advisories, OSV, and/or VulnDB data |
14+
| OSS Index | External API | PURL | Sonatype's hosted vulnerability service, queried at analysis time |
15+
| VulnDB | External API | CPE | Flashpoint's commercial vulnerability service, queried at analysis time |
16+
| Snyk | External API | PURL | Snyk's commercial vulnerability service, queried at analysis time |
17+
| Trivy | External server | PURL | Self-hosted Trivy server, queried at analysis time |
1718

1819
Each of the analyzers above can be enabled or disabled independently of one another.
1920

21+
> **Components must have the right identifier for an analyzer to process them.**
22+
> A component without a CPE is silently skipped by analyzers that require CPE; a component without a PURL is
23+
> silently skipped by analyzers that require PURL. If a component yields no findings, always verify its
24+
> identifiers first.
25+
26+
### Mirror-based vs. External Analyzers
27+
28+
Dependency-Track uses two fundamentally different approaches to vulnerability analysis:
29+
30+
**Mirror-based analysis (Internal Analyzer)**
31+
32+
The Internal Analyzer queries a local copy of vulnerability data that Dependency-Track periodically synchronizes
33+
from upstream sources (NVD, GitHub Advisories, OSV, VulnDB). Analysis happens entirely within Dependency-Track
34+
without any outbound requests at analysis time. The freshness of results depends on how recently the mirrors
35+
were last updated — by default, mirrors are refreshed daily or on instance restart.
36+
37+
**External analyzers (OSS Index, VulnDB, Snyk, Trivy)**
38+
39+
These analyzers send component identifiers to a remote service at analysis time and receive vulnerability findings
40+
in return. Results reflect the current state of the remote service, but are subject to network availability,
41+
rate limits, authentication requirements, and the remote service's own update schedule.
42+
To reduce redundant requests, results are cached locally for 12 hours by default
43+
(see [Analysis Result Cache](#analysis-result-cache)).
44+
45+
### Vulnerability Assignment and Persistence
46+
47+
Once Dependency-Track assigns a vulnerability to a component, that assignment **persists even if the upstream
48+
source data later changes** — for example, if a CVE's affected version ranges are revised to exclude the
49+
component's version, or if the vulnerability is retracted entirely.
50+
51+
This is by design: automatically removing assigned vulnerabilities could silently erase audit trails and analyst
52+
work. Dependency-Track re-evaluates components during each analysis run and may add newly discovered
53+
vulnerabilities, but it does not remove existing ones.
54+
55+
If a previously assigned vulnerability is determined to be incorrect, it must be explicitly addressed by setting
56+
an appropriate analysis state on the finding (e.g. *False Positive* or *Not Affected*).
57+
2058
### Internal Analyzer
2159

22-
The internal analyzer relies on a dictionary of vulnerable software. This dictionary is automatically populated when
23-
NVD, GitHub Advisories, OSV, or VulnDB mirroring is performed. The internal analyzer is applicable to all components
24-
with valid CPEs or PURLs, including application, operating system, and hardware components, and all components with
25-
Package URLs.
60+
The Internal Analyzer relies on a local dictionary of vulnerable software. This dictionary is automatically
61+
populated when NVD, GitHub Advisories, OSV, or VulnDB mirroring is performed. Which identifier is used for
62+
matching depends on the mirrored data source:
63+
64+
* **CPE** — used for data from the NVD and VulnDB mirrors.
65+
* **PURL** — used for data from the GitHub Advisories and OSV mirrors.
66+
67+
A component needs at least one valid identifier to be analyzed. Components with both a CPE and a PURL are
68+
evaluated against all applicable mirrored data sources.
2669

2770
#### CPE Matching
2871

2972
Matching against data from the NVD requires components to have a valid CPE. Dependency-Track follows
30-
the [NIST CPE name matching specification](https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7696.pdf),
73+
the [NIST CPE name matching specification](https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir7696.pdf),
3174
with a few customizations.
3275

3376
To reduce false positives, the following additional checks are performed:
3477

3578
* If comparison of *vendor* yields `SUBSET`, and comparison of *product* yields `SUPERSET`, then it's a no-match
36-
* If comparison of *vendor* yields `SUPSERSET`, and comparison of *product* yields `SUBSET`, then it's a no-match
79+
* If comparison of *vendor* yields `SUPERSET`, and comparison of *product* yields `SUBSET`, then it's a no-match
3780

3881
This is to avoid component CPEs like `cpe:2.3:a:*:zstandard:1.5.2:*:*:*:*:*:*:*` from getting matched to
3982
CVE CPEs like `cpe:2.3:a:pascom_cloud_phone_system:*:*:*:*:*:*:*:*:*`.
4083

41-
Dependency-Track will emit a log in `DEBUG` level whenever it discards matches due to the above.
84+
Dependency-Track will emit a log at `DEBUG` level whenever it discards matches due to the above.
4285

4386
### OSS Index Analyzer
4487

45-
OSS Index is a service provided by Sonatype which identifies vulnerabilities in third-party components. The service
46-
supports a wide range of package management ecosystems. Dependency-Track integrates natively with OSS Index to provide
47-
highly accurate results. This analyzer is applicable to all components with valid Package URLs.
88+
> **Requires:** A valid Package URL (PURL). Components without a PURL are not analyzed by OSS Index.
4889
49-
> Starting with Dependency-Track v4.0, OSS Index is enabled by default and does not require an account. For prior
50-
> Dependency-Track versions, OSS Index is disabled by default and requires an account. To enable OSS Index,
51-
> sign up for a free account and enter the account details in Dependency-Track in the 'Analyzers' settings in the
52-
> administrative console.
90+
OSS Index is a service provided by Sonatype which identifies vulnerabilities in third-party components. The
91+
service supports a wide range of package management ecosystems. Dependency-Track integrates with OSS Index using
92+
its public API — vulnerability data is not mirrored locally, but consumed on an as-identified basis.
5393

54-
OSS Index is a source of vulnerability intelligence that provides its own content. Refer to
55-
[OSS Index (Datasource)]({{ site.baseurl }}{% link _docs/datasources/ossindex.md %}) for additional information.
94+
> **Note:** Unauthenticated usage of OSS Index is no longer supported. An API token is required.
95+
> Refer to [OSS Index (Datasource)]({{ site.baseurl }}{% link _docs/datasources/ossindex.md %}) for
96+
> configuration details.
5697
5798
### VulnDB Analyzer
5899

59-
VulnDB is a subscription service offered by Risk Based Security. The VulnDB Analyzer is capable of analyzing all
60-
components with CPEs against the VulnDB service. Use of this analyzer requires a valid CPE for the components being
61-
analyzed.
100+
> **Requires:** A valid CPE. Components without a CPE are not analyzed by the VulnDB Analyzer.
101+
102+
VulnDB is a subscription service offered by Flashpoint. The VulnDB Analyzer queries the VulnDB REST APIs at
103+
analysis time to identify vulnerabilities in components. Dependency-Track does not mirror VulnDB data for this
104+
analyzer — it is consumed on an as-identified basis.
62105

63-
VulnDB is a source of vulnerability intelligence that provides its own content. Refer to
64-
[VulnDB (Datasource)]({{ site.baseurl }}{% link _docs/datasources/vulndb.md %}) for additional information.
106+
> VulnDB data can also be ingested into the Internal Analyzer via the VulnDB mirror. Refer to
107+
> [VulnDB (Datasource)]({{ site.baseurl }}{% link _docs/datasources/vulndb.md %}) for additional information.
65108
66109
### Snyk Analyzer
67110

68-
It is a service provided by Snyk which identifies vulnerabilities in third-party components using REST API. Snyk returns only direct vulnerabilities for a specific package version identified by Package URL (purl).
69-
This analyzer is applicable to all components with valid Package URLs.
111+
> **Requires:** A valid Package URL (PURL). Components without a PURL are not analyzed by Snyk.
70112
71-
Snyk REST API version is updated every 6 months and can be referred at
72-
[Snyk REST API for PURL](https://apidocs.snyk.io/?version=2022-10-06#get-/orgs/-org_id-/packages/-purl-/issues) for additional information.
113+
Snyk is a commercial service that identifies vulnerabilities in third-party components using its REST API. Snyk
114+
returns direct vulnerabilities for a specific package version identified by PURL. Vulnerability data is not
115+
mirrored locally — it is consumed on an as-identified basis.
116+
117+
Refer to [Snyk (Datasource)]({{ site.baseurl }}{% link _docs/datasources/snyk.md %}) for configuration details.
73118

74119
### Trivy Analyzer
75120

76-
Trivy analyzer relies on a server trivy instance to perform the analysis using REST API.
77-
Trivy REST API is not publically documented so upgrading to a new version might lead to some issues.
121+
> **Requires:** A valid Package URL (PURL). Components without a PURL are not analyzed by Trivy.
122+
123+
The Trivy Analyzer sends components to an external Trivy server instance for analysis using its REST API.
124+
The Trivy integration requires a separately deployed Trivy server and is disabled by default.
125+
126+
> The Trivy server REST API is not publicly documented, so upgrading to a new version may introduce
127+
> compatibility issues. Refer to [Trivy (Datasource)]({{ site.baseurl }}{% link _docs/datasources/trivy.md %})
128+
> for deployment instructions and known limitations.
78129
79130
### Analysis Result Cache
80131

81132
Dependency-Track contains an internal limiter which prevents repeated requests to remote services when performing
82-
vulnerability analysis. When a component's Package URL or CPE is successfully analyzed by a given analyzer,
133+
vulnerability analysis. When a component's Package URL or CPE is successfully analyzed by a given analyzer,
83134
the result is cached. By default, cache entries expire after 12 hours.
135+
136+
### Troubleshooting False Positives and False Negatives
137+
138+
Before reporting a false positive or false negative as a bug, work through the following steps.
139+
140+
#### Step 1: Verify the component's identifiers in Dependency-Track
141+
142+
Navigate to the component in question and confirm it has a valid CPE and/or PURL, as required by the
143+
analyzer(s) you expect to produce results (see the table at the top of this page). A missing, empty, or
144+
malformed identifier causes the analyzer to silently skip the component and is the most common cause of
145+
unexpected results.
146+
147+
#### Step 2: Check the vulnerability's affected ranges in Dependency-Track
148+
149+
Open the vulnerability in Dependency-Track and review the affected version ranges it lists. If the component's
150+
version does not fall within any listed range, Dependency-Track correctly does not match it — this is expected
151+
behavior, not a bug.
152+
153+
#### Step 3: Compare with the upstream source
154+
155+
* For the **Internal Analyzer**, cross-reference the relevant upstream source directly:
156+
[NVD](https://nvd.nist.gov), [GitHub Advisories](https://github.com/advisories), [OSV](https://osv.dev),
157+
or VulnDB. Check whether the upstream source agrees with what Dependency-Track has stored. If there is a
158+
discrepancy, the local mirror may be stale — trigger a manual re-sync and re-analyze before concluding
159+
there is a bug.
160+
161+
* For **external analyzers** (OSS Index, VulnDB, Snyk, Trivy), query the remote service directly using the
162+
exact same PURL or CPE the component has in Dependency-Track. If the external service also does not report
163+
the vulnerability for that identifier, the discrepancy lies in the upstream data, not in Dependency-Track's
164+
integration.
165+
166+
Only after completing these steps and confirming a genuine discrepancy between Dependency-Track and the
167+
upstream source should an issue be reported as a bug.

0 commit comments

Comments
 (0)