# NVD
NVD stands for National Vulnerability Database, which is the U.S. government repository of standards-based vulnerability management data. This database is maintained by NIST (National Institute of Standards and Technology).
## Implementation Notes
The NVD integration uses the REST API (v2.0) available at [services.nvd.nist.gov](https://services.nvd.nist.gov/rest/json/cves/2.0).
### Search Parameters
While the NVD API supports CPE matching via parameters like `cpeName` and `virtualMatchString`, we've chosen not to use them for NPM packages. This decision was made because:
1. The CPE format for npm packages is not standardized in NVD
2. Attempted CPE patterns (like `cpe:2.3:a:*:package-name:*:*:*:*:*:node.js:*:*`) resulted in 404 errors
3. Keyword search provides more flexible results for JavaScript/NPM packages
The implementation might be enhanced in the future if NVD provides clearer guidelines for CPE matching of npm packages.
### Parameter Constraints
Some parameters have mutual exclusivity constraints enforced by the NVD API:
- `cvssV2Severity`, `cvssV3Severity`, and `cvssV4Severity` cannot be combined with each other.
- `cvssV2Metrics`, `cvssV3Metrics`, and `cvssV4Metrics` cannot be combined with each other.
- `keywordExactMatch` requires `keywordSearch` to be set.
- `pubStartDate` and `pubEndDate` must be used together; the maximum range is 120 days.
- `lastModStartDate` and `lastModEndDate` must be used together; the maximum range is 120 days.
## Format
The NVD API returns detailed vulnerability information.
The NVD interface is exported as root like `StandardVulnerability`.
```ts
export interface NVD {
cve: Cve;
}
```
## API
### Constructor
```ts
import * as vulnera from "@nodesecure/vulnera";
const db = new vulnera.Database.NVD({
credential: new vulnera.ApiCredential({
type: "querystring",
name: "apiKey",
value: "your-api-key"
})
});
```
```ts
export interface NVDOptions {
credential: ApiCredential;
/**
* Delay in milliseconds between consecutive requests in findMany.
*
* The NVD API enforces rate limits:
* - Without API key: 5 requests per 30-second window → set ~6 000 ms
* - With API key: 50 requests per 30-second window → set ~600 ms
*
* @default 6000
*/
requestDelay?: number;
}
```
> **Rate limiting:** The NVD API enforces strict rate limits (see [NVD developer docs](https://nvd.nist.gov/developers/start-here)). `findMany` sends requests sequentially with a `requestDelay` pause between each one to avoid being throttled. The default of 6 000 ms is safe for unauthenticated use. If you supply an API key you can safely lower it to ~600 ms.
### `find(parameters: NVDApiParameter): Promise`
Find vulnerabilities using any combination of available NVD API parameters.
```ts
export type NVDApiParameter = {
// Keyword search
keywordSearch?: string;
keywordExactMatch?: boolean;
// Convenience fields (used by findBySpec / findMany)
packageName?: string;
ecosystem?: string; // default: "npm"
// CVE identification
cveId?: string;
cveTag?: "disputed" | "unsupported-when-assigned" | "exclusively-hosted-service";
cweId?: string;
sourceIdentifier?: string;
// CVSS severity (mutually exclusive across versions)
cvssV2Severity?: "LOW" | "MEDIUM" | "HIGH";
cvssV3Severity?: "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
cvssV4Severity?: "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
// CVSS vector strings (mutually exclusive across versions)
cvssV2Metrics?: string;
cvssV3Metrics?: string;
cvssV4Metrics?: string;
// Boolean flags
noRejected?: boolean;
hasKev?: boolean;
hasCertAlerts?: boolean;
hasCertNotes?: boolean;
hasOval?: boolean;
// Date ranges (ISO-8601, max 120-day window per pair)
pubStartDate?: string;
pubEndDate?: string;
lastModStartDate?: string;
lastModEndDate?: string;
// Pagination
resultsPerPage?: number; // default and max: 2000
startIndex?: number; // default: 0
};
```
**Examples:**
```ts
// Filter by CVSSv3 severity
const vulns = await db.find({ keywordSearch: "express", cvssV3Severity: "CRITICAL" });
// Return only CVEs in the CISA Known Exploited Vulnerabilities catalog
const kevVulns = await db.find({ keywordSearch: "log4j", hasKev: true });
// Paginate results
const page2 = await db.find({ keywordSearch: "lodash", resultsPerPage: 100, startIndex: 100 });
// Filter by publication date range
const recent = await db.find({
pubStartDate: "2024-01-01T00:00:00.000Z",
pubEndDate: "2024-04-30T23:59:59.000Z"
});
```
### `findByCveId(cveId: string): Promise`
Find a specific vulnerability by its CVE identifier.
```ts
const vuln = await db.findByCveId("CVE-2021-44228");
console.log(vuln);
```
### `findBySpec(spec: string): Promise`
Find vulnerabilities of a given package using the NPM spec format `packageName@version`.
```ts
const vulns = await db.findBySpec("express@4.0.0");
console.log(vulns);
```
### `findMany(specs: T[]): Promise>`
Find vulnerabilities for many packages using the spec format.
Returns a Record where keys are equal to the provided specs.
```ts
const vulns = await db.findMany(["express@4.0.0", "lodash@4.17.0"]);
console.log(vulns);
```