Automated analysis of CVE update patterns in the official CVEProject/cvelist repository. This project tracks how frequently CVE records are updated, identifies the most actively maintained CVEs, and provides insights into vulnerability disclosure and maintenance patterns.
View the latest CVE Update Analysis Report β
The report is automatically updated every 4 hours with the latest data from the CVE repository.
- π Interactive Website: Single-page responsive HTML report deployed via GitHub Pages
- π Professional Visualizations: Publication-quality graphs with blue color scheme (300 DPI)
- π Statistical Analysis: Update distributions, trends, and comprehensive metrics
- π Top Updated CVEs: Identifies most actively maintained vulnerability records
- π Historical Trends: Commit activity over time with rolling averages
- β±οΈ Update Velocity Analysis: Time from publication to metadata update with distribution insights
- β‘ Fast Analysis: Process 300K+ CVEs in under 2 minutes
- π€ Automated Updates: GitHub Actions workflow runs every 4 hours
- πΎ Multiple Formats: JSON data, Markdown reports, PNG/SVG graphs, HTML website
The analysis generates six key visualizations:
- Update Distribution: Histogram showing how many CVEs have N updates
- Cumulative Distribution (CDF): Percentage of CVEs with N or fewer updates
- Top Updated CVEs: Bar chart of the 50 most frequently updated CVEs
- Commits Over Time: Monthly commit activity with 12-month rolling average
- Updates Frequency (Log Scale): Logarithmic view of update patterns
- Time to Metadata Update: Distribution of time from publication to metadata update (cveMetadata.dateUpdated)
All graphs use a professional blue color scheme and are available in both PNG (300 DPI) and SVG formats.
- Python 3.11 or higher
- Git (for analyzing CVE repository history)
- Clone this repository:
git clone https://github.com/RogoLabs/CVE-Updates.git
cd CVE-Updates
### Installation
1. Clone this repository:
```bash
git clone https://github.com/RogoLabs/CVE-Updates.git
cd CVE-Updates- Install dependencies:
pip install -r requirements.txt- Clone the CVE database (optional, if not already present):
git clone https://github.com/CVEProject/cvelistV5.gitGenerate a complete CVE update report:
# 1. Analyze the CVE database (creates reports/report.json)
python analyze_cvelist.py --ci --verbose
# 2. Generate visualizations (creates PNG and SVG files)
python generate_report_assets.py --report reports/report.json --outdir reports --top 50
# 3. Create Markdown summary (creates report.md)
python generate_markdown_report.py --ci
# 4. Generate HTML website (creates web/index.html)
python generate_website.py --report reports/report.json --outdir web- Website: Open
web/index.htmlin your browser or visit https://rogolabs.github.io/CVE-Updates/ - Markdown: View
report.mdin the repository root - Data: Raw JSON in
reports/report.json - Graphs: PNG and SVG files in
reports/directory
After running the analysis, you'll find:
CVE-Updates/
βββ report.md # Markdown summary report
βββ reports/
β βββ report.json # Raw analysis data
β βββ updates_distribution.png # Update frequency bar chart
β βββ updates_distribution.svg # (SVG version)
β βββ updates_cdf.png # Cumulative distribution
β βββ updates_cdf.svg # (SVG version)
β βββ top_updated_cves.png # Top CVEs chart
β βββ top_updated_cves.svg # (SVG version)
β βββ commits_over_time.png # Time series
β βββ commits_over_time.svg # (SVG version)
β βββ updates_frequency_log.png # Log-scale distribution
β βββ updates_frequency_log.svg # (SVG version)
βββ web/
βββ index.html # Single-page website
βββ .nojekyll # GitHub Pages config
βββ README.md # Web directory docs
Main analysis script that processes CVE files and generates statistics.
python analyze_cvelist.py [OPTIONS]
Options:
--repo-path PATH Path to cvelistV5 repository (default: ./cvelistV5)
--ci CI mode: write report to reports/report.json
--indepth Use per-file git log (slower but authoritative)
--tolerance SECONDS Date mismatch tolerance in seconds (default: 3600)
--top N Number of top CVEs to include (default: 50)
--verbose Enable detailed logging
--help Show help messageCreates publication-quality visualizations from analysis data.
python generate_report_assets.py [OPTIONS]
Options:
--report PATH Path to report JSON (default: reports/report.json)
--outdir PATH Output directory for graphs (default: reports)
--top N Number of top CVEs to visualize (default: 30)
--verbose Enable detailed logging
Generates publication-quality visualizations from analysis data.
```bash
python generate_report_assets.py [OPTIONS]
Options:
--report PATH Path to report.json (required)
--outdir PATH Output directory for graphs (default: reports)
--top N Number of top CVEs to show (default: 50)
--verbose Enable detailed logging
--help Show help messageGenerates a formatted Markdown report with embedded visualizations.
python generate_markdown_report.py [OPTIONS]
Options:
--report PATH Path to JSON report (default: auto-detect latest)
--output PATH Output markdown path (default: derived from report)
--top N Number of top CVEs in table (default: 10)
--ci CI mode: write to report.md in repo root
--verify-top Run per-file git queries for top CVEs (slow)
--repo-path PATH CVE repository path for --verify-top
--verbose Enable detailed logging
--help Show help messageGenerates a single-page HTML website with embedded visualizations.
python generate_website.py [OPTIONS]
Options:
--report PATH Path to report.json (required)
--outdir PATH Output directory (default: web)
--verbose Enable detailed logging
--help Show help messageThe repository includes a GitHub Actions workflow that automatically generates and deploys reports every 4 hours.
- Scheduled Runs: Executes every 4 hours automatically
- Manual Trigger: Can be run on-demand via GitHub UI
- Artifact Upload: All reports and graphs available for 7 days
- GitHub Pages Deployment: Website automatically deployed to gh-pages branch
- Fast Execution: Completes in 2-3 minutes
- Checkout repository with full Git history
- Set up Python 3.11 environment
- Install dependencies from requirements.txt
- Run CVE analysis (generates report.json)
- Generate visualizations (PNG + SVG)
- Create Markdown report
- Build HTML website
- Upload artifacts (JSON, Markdown, graphs, website)
- Deploy website to GitHub Pages
Live Website: https://rogolabs.github.io/CVE-Updates/
Artifacts (last 7 days):
- Go to the Actions tab
- Click on the latest "CVE Update Report" workflow run
- Scroll to the Artifacts section
- Download any of:
cve-report-json- Raw data (JSON)cve-report-markdown- Formatted summarycve-report-graphs-png- PNG visualizationscve-report-graphs-svg- SVG visualizationscve-report-website- Complete website
To run the workflow manually:
- Navigate to Actions β CVE Update Report
- Click Run workflow button
- Select branch (usually
main) - Click Run workflow
The website is automatically deployed to GitHub Pages after each successful workflow run.
To enable GitHub Pages for this repository:
- Go to repository Settings β Pages
- Under Source, select:
- Branch:
gh-pages - Folder:
/ (root)
- Branch:
- Click Save
- Website will be available at: https://rogolabs.github.io/CVE-Updates/
- GitHub Actions workflow runs analysis and generates website
- Website files (HTML with embedded images) are created in
web/directory peaceiris/actions-gh-pagesaction deploysweb/directory togh-pagesbranch- GitHub Pages serves the website from
gh-pagesbranch .nojekyllfile ensures GitHub doesn't process HTML through Jekyll
- Branch:
gh-pages(auto-created by workflow) - Deploy Frequency: Every 4 hours (or on push to main)
- Content: Self-contained HTML with base64-encoded images
- No External Dependencies: All assets embedded in HTML
The generated website and reports include:
- Executive Summary: Key statistics at a glance
- Update Distribution: Visual and tabular breakdown
- Top Updated CVEs: Most frequently updated entries with CNA info and direct links
- Update Velocity Analysis: Time from publication to metadata update with distribution graphs
- Longest Time to Update: CVEs with the most extended maintenance cycles
- Analysis Methodology: How the analysis works
- Supporting Visualizations: Additional graphs for deeper insights
- Technical Details: Analysis parameters and metadata
- Total CVEs Analyzed: Number of CVE records in repository
- CVEs with Updates: CVEs modified after initial publication
- Total Git Commits: All commits affecting CVE files
- Never Updated CVEs: Count and percentage of CVEs with zero updates
- Update Statistics: Mean, median, percentiles (75th, 90th, 95th)
- Top CVEs: Ranked by update frequency with CNA attribution
- Time-to-Update Statistics: Median, mean, and distribution of time from publication to metadata update
An update is defined as:
updates = max(0, totalGitCommits - 1)
This means:
- 0 updates: CVE created and never modified
- 1 update: CVE created, then modified once
- N updates: CVE modified N times after creation
Fast Mode (default):
- Uses aggregated
git logacross entire CVE tree - Processes 300K+ CVEs in ~60 seconds
- Recommended for regular analysis
In-Depth Mode (--indepth):
- Runs individual
git logper CVE file - More authoritative but slower (2-3 minutes)
- Use when accuracy is critical
The tool compares:
- Internal Date:
cveMetadata.dateUpdatedfield in CVE JSON - Git Date: Latest commit timestamp for the file
A mismatch is flagged when the internal date is more than tolerance seconds (default: 3600) later than the Git date, which may indicate:
- CVE metadata updated without committing the file
- Clock skew issues
- Manual metadata edits
The tool tracks the time elapsed between CVE publication and metadata update:
- Start:
cveMetadata.datePublished(when CVE was initially published) - End:
cveMetadata.dateUpdated(most recent metadata update timestamp) - Filter: Only includes CVEs with
totalGitCommits > 1(confirmed updates)
Note: This measures time to the most recent metadata update timestamp from the JSON file, not the date of the first Git commit.
Statistics include:
- Median and mean time to update
- Percentage updated within 24 hours, 7 days, 30 days, and 1 year
- Distribution across time windows (< 1 day, 1-7 days, 7-30 days, etc.)
- Identification of CVEs with longest update delays
- GitPython (β₯3.1.0): Git repository analysis
- pandas (β₯2.2.3): Data manipulation and analysis
- matplotlib (β₯3.10.1): Graph generation
- seaborn (β₯0.13.2): Statistical visualizations
- numpy (β₯1.26.4): Numerical computations
Install all dependencies:
pip install -r requirements.txtEdit generate_report_assets.py and modify the MAIN_COLORMAP variable:
# Current: Blue palette
MAIN_COLORMAP = "Blues"
# Alternatives:
MAIN_COLORMAP = "Greens" # Green palette
MAIN_COLORMAP = "Reds" # Red palette
MAIN_COLORMAP = "Viridis" # Viridis colormapModify the figure sizes in generate_report_assets.py:
plt.rcParams.update({
"figure.figsize": (16, 8), # Change to your preferred size
})To analyze specific CVE years or patterns, modify the is_cve_filename function in analyze_cvelist.py.
Install GitPython:
pip install GitPythonClone the CVE database:
git clone https://github.com/CVEProject/cvelistV5.gitOr specify a different path:
python analyze_cvelist.py --repo-path /path/to/your/cvelistV5If you encounter display errors, set the backend:
export MPLBACKEND=Agg
python generate_report_assets.py ...For very large analyses, increase Python's memory or filter the dataset:
# Limit analysis to specific years (requires code modification)
# Or use a machine with more RAMTypical performance on a modern machine:
| Operation | CVE Count | Time |
|---|---|---|
| Fast Analysis | 314,685 | ~60 seconds |
| In-Depth Analysis | 314,685 | ~2-3 minutes |
| Graph Generation | All graphs | ~10 seconds |
| Report Generation | Full report | ~1 second |
Total pipeline: 2-3 minutes for complete analysis with all visualizations.
Contributions are welcome! Please feel free to submit pull requests or open issues for:
- Bug fixes
- New visualizations
- Performance improvements
- Documentation enhancements
- Feature requests
# Clone the repository
git clone https://github.com/RogoLabs/CVE-Updates.git
cd CVE-Updates
# Install dependencies
pip install -r requirements.txt
# Run tests (if available)
python -m pytest
# Make your changes and test
python analyze_cvelist.py --ci --verboseThis project is licensed under the terms specified in the LICENSE file.
- CVEProject/cvelistV5 - Official CVE database
- CVE Program - CVE.org official website
- MITRE CVE - MITRE CVE database
For questions, issues, or suggestions:
- GitHub Issues: Create an issue
- Discussions: GitHub Discussions
- CVE Program and the CVE Numbering Authorities (CNAs)
- MITRE Corporation for CVE database maintenance
- Open source community for the excellent Python data science libraries
Made with β€οΈ by RogoLabs
Helping security professionals understand CVE update patterns