The NVD + KEV + Exploit-DB Ingestor: Three Feeds, One CVE Truth
Pentestas Team
Security Analyst

Introduction to CVE Ingestion Challenges
In the world of cybersecurity, staying ahead of vulnerabilities is paramount. We rely on multiple data sources to keep our systems secure, including the National Vulnerability Database (NVD), Known Exploited Vulnerabilities (KEV) catalog, and Exploit-DB. Each of these sources provides unique insights into vulnerabilities but comes with its own format and update frequency. The NVD offers detailed descriptions and impact metrics, KEV highlights actively exploited vulnerabilities, while Exploit-DB focuses on proof-of-concept exploits. Together, they form a comprehensive view of the threat landscape, but integrating them poses significant challenges.
The unification of these disparate data sources is crucial for conducting accurate security assessments. Each source might have different information about the same CVE ID, leading to inconsistencies. For example, a CVE ID like CVE-2023-12345 could have detailed exploit information in Exploit-DB, but lack associated metadata in the NVD. Our platform aims to reconcile these differences and present a unified view that enhances decision-making and risk management.
Key Challenge: Data Disparity
Disparities in data formats, update frequencies, and detail levels across NVD, KEV, and Exploit-DB make comprehensive vulnerability tracking a complex task. Our solution aligns these sources to offer a cohesive, reliable vulnerability assessment.
Merging these data sources requires overcoming common challenges such as data disparity, synchronization issues, and varying levels of detail. Each source may update at different intervals, causing temporal mismatches. Furthermore, the format in which vulnerability data is presented can differ significantly. For instance, while the NVD uses JSON, Exploit-DB might provide data in raw text or HTML formats. To address these issues, we have built an ingestion pipeline that normalizes data into a unified schema, ensuring consistent and reliable output for our users.
Architecture of the Ingestion Pipeline
The architecture of our ingestion pipeline is designed to handle the complexities of merging data from the NVD, KEV, and Exploit-DB into a coherent dataset. Each data source presents its own challenges, from varying update frequencies to differing data formats. We employ a series of microservices, each responsible for fetching, parsing, and normalizing data from one of these feeds. This modular approach allows us to isolate failures, making the system more resilient. The microservices communicate through a message broker, ensuring that data flows smoothly through the pipeline and can be retried in case of temporary disruptions.
To manage the data ingestion from each source, we use dedicated microservices that can scale independently based on demand. For instance, the NVD microservice might handle more frequent updates than the Exploit-DB service. Each service follows a well-defined workflow: fetch the latest data, validate it, and then transform it into a common format. This transformation step is crucial for creating a unified view of CVEs, as it eliminates inconsistencies across sources. Here is a snippet from our NVD microservice that outlines part of this process:
async function fetchAndTransformNVDData() {
const response = await fetch('https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-modified.json');
const data = await response.json();
return data.CVE_Items.map(item => {
return {
id: item.cve.CVE_data_meta.ID,
description: item.cve.description.description_data[0].value,
publishedDate: item.publishedDate
};
});
}Scalability is a key consideration in our architecture. As the volume of security data grows, our system must efficiently handle increased load while maintaining low latency. We achieve this by deploying our microservices in a containerized environment, which allows us to quickly scale out by adding more instances in response to incoming data spikes. For data storage, we use a distributed database that offers both high availability and scalability. This ensures that our platform can continue to provide timely and accurate CVE information, even as global data sources expand.
Key Takeaway
By leveraging microservices, we efficiently manage and scale our ingestion pipeline, ensuring reliable and accurate CVE data consolidation even as data volumes grow.
Implementing Range-aware Version Matching
Incorporating range-aware version matching is crucial for accurately correlating CVEs across different data sources like NVD, KEV, and Exploit-DB. This technique allows us to interpret and handle version specifications that include ranges, such as "1.0.0 - 2.0.0" or "<3.5.1". By doing so, we ensure that our platform correctly identifies all vulnerable software versions, minimizing false positives and negatives. This accuracy is essential when dealing with complex software ecosystems where versioning can be inconsistent or non-linear.
Our implementation leverages a custom algorithm that parses version strings and checks them against specified ranges. This involves breaking down each version component and comparing it numerically. We utilize a library called semver to handle semantic versioning efficiently. The algorithm first normalizes version strings to ensure consistency, then applies logical comparisons to determine if a version falls within a specified range.
const semver = require('semver');
function isVersionInRange(version, range) {
return semver.satisfies(version, range);
}
console.log(isVersionInRange('2.1.0', '>=2.0.0 <3.0.0')); // trueHandling edge cases and ambiguities is also a significant part of our implementation. We often encounter scenarios where version information is incomplete or uses different conventions. For example, some data sources might list a software version as "2.x.x", which requires us to interpret it as any version starting with "2". We address these ambiguities by establishing a hierarchy of rules and defaults within our algorithm, ensuring consistent results. This meticulous handling of version details is what allows Pentestas to provide a reliable and comprehensive vulnerability assessment.
Integrating KEV: Applying Severity Floors
The Known Exploited Vulnerabilities (KEV) catalog plays a critical role in our prioritization framework by highlighting vulnerabilities that have been actively exploited in the wild. This allows us to focus our remediation efforts on the most pressing threats, ensuring that our security posture stays robust. By integrating KEV with our vulnerability management process, we can leverage its curated list of exploited vulnerabilities to inform our prioritization model, which is crucial for maintaining the integrity of our systems. In particular, KEV helps us establish a severity floor, ensuring that no actively exploited vulnerability is overlooked due to an artificially low CVSS score.
Our algorithm for applying severity floors begins by cross-referencing each incoming CVE with the KEV catalog. If a match is found, the CVE is automatically elevated to a higher severity level, typically at least "High" or "Critical", depending on the context and existing severity. This adjustment assists in aligning our vulnerability management efforts with real-world threat landscapes. The integration involves parsing the KEV feed daily and updating our internal database, ensuring that our system reflects the latest threat intelligence. This process is automated to minimize latency and reduce the risk of human error.
def apply_severity_floor(cve_id, current_severity):
kev_list = get_kev_catalog()
if cve_id in kev_list:
return max(current_severity, 'High') # Elevate to High if not already
return current_severityThe impact of integrating KEV into our vulnerability management is significant. By ensuring that actively exploited vulnerabilities are prioritized, we enhance our defensive strategies and optimize resource allocation. This approach not only improves the accuracy of our vulnerability reports but also strengthens our overall security posture. Our clients benefit from timely and relevant alerts, allowing them to take preemptive actions against high-risk vulnerabilities. The integration of KEV, along with NVD and Exploit-DB, into our reporting framework, provides a comprehensive view that aligns with industry best practices, fostering trust and confidence in our security offerings.
Joining with Exploit-DB: Enhancing Context
The integration of Exploit-DB into our CVE ingestor is a vital step in grounding theoretical vulnerabilities in practical, real-world scenarios. Exploit-DB serves as a comprehensive archive of exploits, each tied to specific vulnerabilities. By incorporating this data, we're able to provide a more complete picture of a CVE's potential impact. This is crucial for pentesters who need to understand not just the existence of a vulnerability, but the likelihood and method of its exploitation in the field.
Our technical approach involves mapping Exploit-DB entries to CVEs using a combination of fuzzy matching on descriptions and direct links where available. We utilize a Python script to automate this process, ensuring that our database remains updated with the latest exploit information. Below is a snippet of the script that demonstrates the matching logic:
import difflib
# Sample function for matching Exploit-DB entries to CVEs
def match_exploits_to_cves(exploit_list, cve_list):
matched_exploits = {}
for exploit in exploit_list:
matches = difflib.get_close_matches(exploit['description'], cve_list, n=1, cutoff=0.8)
if matches:
matched_exploits[exploit['id']] = matches[0]
return matched_exploitsThe enriched data from Exploit-DB empowers pentesters by providing them with actionable insights into how a vulnerability could be exploited. This enhances the accuracy of risk assessments and helps prioritize remediation efforts more effectively. By understanding the exploit landscape, organizations can better defend against potential attacks, optimizing their security strategies accordingly. Including Exploit-DB data allows us to bridge the gap between vulnerability identification and practical exploitation, ultimately leading to more robust security postures.
Data Normalization and Conflict Resolution
When integrating data from the NVD, KEV, and Exploit-DB feeds, normalization is a critical first step. Each feed has its own schema, which requires us to map them to a unified format. We start by extracting common fields such as CVE-ID, severity, and description. Employing a consistent data model allows us to efficiently query and analyze the CVE data.
Conflicts between these sources are inevitable. For example, the NVD might update the severity score of a vulnerability while KEV retains an older value. Our approach to resolving these conflicts involves a weighted decision matrix that prioritizes sources based on historical accuracy and update frequency. We assign higher weights to more frequently updated feeds, ensuring that our database reflects the most current and reliable information available.
def resolve_conflict(feed_data):
priority = {'NVD': 3, 'KEV': 2, 'Exploit-DB': 1}
feed_data.sort(key=lambda x: priority.get(x['source'], 0), reverse=True)
return feed_data[0] # Return the highest priority entryTo further enhance conflict resolution, we leverage machine learning algorithms. By training models on historical discrepancies and resolutions, we automate the process of identifying the most credible data source for each CVE record. This approach not only reduces the time required for manual verification but also improves the accuracy of our database, providing our users with trustworthy and up-to-date security information.
Performance Optimization Techniques
Managing performance at scale while ingesting data from NVD, KEV, and Exploit-DB presents a unique set of challenges. Each feed comes with its own update frequency and volume, leading to variability in processing time. A significant challenge is maintaining low latency during peak data inflows without compromising data integrity. As the number of CVEs grows, the demand on our infrastructure increases exponentially. We need to ensure that our systems remain responsive and efficient, even as the data volume scales.
To achieve this, we employ various caching strategies and leverage database indexing to expedite query execution. By implementing an in-memory cache, we can quickly retrieve frequently accessed data, minimizing the need for repetitive database queries. Additionally, indexing key fields like cve_id and last_updated allows us to optimize our SQL queries. This ensures that even complex join operations return swiftly, enhancing overall system throughput.
CREATE INDEX idx_cve_id ON cve_data (cve_id);
CREATE INDEX idx_last_updated ON cve_data (last_updated);
Monitoring the ingestion pipeline is crucial for identifying bottlenecks and areas for potential optimization. We utilize performance metrics and logging to track the speed and efficiency of data processing across different stages. Tools like Prometheus and Grafana provide real-time insights into system health, allowing us to proactively manage resource allocation. By continuously analyzing these metrics, we can fine-tune our pipeline, ensuring it operates smoothly as we ingest thousands of CVEs daily.
Limitations and Future Directions
While our current ingestion process effectively consolidates data from NVD, KEV, and Exploit-DB, it is not without limitations. One significant challenge is handling discrepancies in CVE data across these sources. Variations in CVSS scores or missing fields can lead to inconsistencies in our unified dataset. Our ingestion process currently relies on a rule-based system for resolving these conflicts, which can become cumbersome as the volume of data increases. Additionally, the ingestion pipeline is set to run at predefined intervals, which may not always capture the most recent updates in real-time, potentially leading to out-of-date information.
To enhance the accuracy and efficiency of our ingestion process, we are investigating the use of machine learning models to automatically reconcile data discrepancies. By training models on historical CVE data, we aim to predict the most likely accurate values and reduce manual intervention. Furthermore, improving the granularity of our update schedule is another priority. Implementing a more dynamic scheduling system could allow us to ingest newly available data as soon as it is published. This would improve the timeliness and relevance of the information we provide to our users.
Exploring New Frontiers
In addition to refining our existing processes, we are exploring additional data sources such as GitHub Advisory Database and PacketStorm. Integrating these could offer a broader spectrum of vulnerability insights, enhancing the depth of analysis available on Pentestas.
Additionally, we are considering the incorporation of user-generated content to enrich our dataset. By allowing security researchers to submit vulnerability details directly, we could potentially capture emerging threats more rapidly. This feature would involve developing a robust verification system to ensure data integrity and accuracy. As we continue to expand these capabilities, our goal remains to deliver a comprehensive, reliable, and up-to-date vulnerability database that empowers our users to stay ahead in the cybersecurity landscape.
Try it on your stack
Free tier includes 10 scans/month on a verified domain. No credit card required.
Start scanning- Source-Aware SAST: Reading the Code So the Scanner Knows Where to Look
- Cache Deception and Cache Poisoning: Two Bugs That Look Like One
- One PDF Per Domain in a Bulk Scan — and How to Re-Group on the Fly
- Per-Rule Alert Thresholds: Tuning Pentestas Like You Tune ZAP

Alexander Sverdlov
Founder of Pentestas. Author of 2 information security books, cybersecurity speaker at the largest cybersecurity conferences in Asia and a United Nations conference panelist. Former Microsoft security consulting team member, external cybersecurity consultant at the Emirates Nuclear Energy Corporation.