Add products (specific software)

March 5, 2026 ยท View on GitHub

VulnRadar Logo

VulnRadar

Your personal vulnerability intelligence radar โ€” fork, configure, and go!

License Python CI Status ETL Status Notify Status


๐Ÿ“ก Live Threat Dashboard

๐Ÿ“Š CVEs Tracked๐Ÿšจ Criticalโš ๏ธ In KEV๐Ÿ”ฅ Exploit Intel
217945167173

Last scanned: 2026-02-06 15:40 UTC

Total CVEs
Matching your watchlist
Critical
PoC + In your stack = ๐Ÿ”ฅ
KEV
CISA confirmed active
Exploit Intel
From PatchThis feeds
๐Ÿ“ˆ What do these metrics mean?
MetricDescriptionWhy It Matters
CVEs TrackedTotal CVEs matching your watchlist.yaml vendors/productsYour attack surface visibility
CriticalCVEs with known exploit code AND in your watchlistImmediate patching priority
In KEVListed in CISA's Known Exploited Vulnerabilities catalogActive exploitation in the wild
Exploit IntelHas PoC/weaponized code (from PatchThis)Threat actors have working exploits

๐Ÿ’ก Tip: These metrics auto-update every hour when the ETL workflow runs in your fork.


VulnRadar is a lightweight, GitHub-native vulnerability intelligence tool that:

  • ๐Ÿ“ฅ Downloads the latest CVE data from CVEProject/cvelistV5 and NVD data feeds
  • ๐ŸŽฏ Filters CVEs against your tech stack via watchlist.yaml
  • ๐Ÿ”ฅ Enriches with CISA KEV, EPSS, NVD, and PatchThis intelligence
  • ๐Ÿ“Š Generates a beautiful Markdown report viewable directly in GitHub
  • ๐Ÿšจ Creates GitHub Issues for critical findings (with escalation comments!)
  • ๐Ÿ”” Sends Discord/Slack/Teams notifications (optional)
  • ๐Ÿ“‹ Integrates with GitHub Projects v2 for Kanban workflows (optional)
  • ๐ŸŽญ Includes demo mode for conference presentations

No API keys. No external services. Just fork and go.


โšก Quick Start (Under 5 Minutes)

1๏ธโƒฃ Fork this repository

Click the Fork button at the top right of this page.

2๏ธโƒฃ Enable GitHub Actions

โš ๏ธ Important: GitHub automatically disables workflows on forked repositories for security reasons. You must manually enable them.

Go to your fork โ†’ Actions tab โ†’ Click the green button: "I understand my workflows, go ahead and enable them"

Enable Actions

3๏ธโƒฃ Configure your watchlist

Edit watchlist.yaml with your tech stack:

vendors:
  - microsoft
  - apache
  - linux

products:
  - chrome
  - log4j
  - kubernetes

4๏ธโƒฃ Run the ETL

Either wait for the scheduled run (every hour) or:

  • Go to Actions โ†’ Update Vulnerability Radar Data โ†’ Run workflow

5๏ธโƒฃ View your report

Check data/radar_report.md in your fork โ€” it renders beautifully in GitHub!

๐Ÿ“บ See it in action: VulnRadar-Demo has a live example with real data.


๐Ÿ—๏ธ Architecture

flowchart LR
    subgraph Sources["Data Sources"]
        A[CVE List V5]
        B[CISA KEV]
        C[EPSS]
        D[PatchThis]
        N[NVD Feeds]
    end

    subgraph Core["vulnradar/ package"]
        CFG[config.py\nPydantic models]
        DL[downloaders.py\nHTTP fetchers]
        ADL[async_downloaders.py\naiohttp parallel]
        P[parsers.py\nCVE parsing]
        E[enrichment.py\nKEV/EPSS/NVD merge]
        R[report.py\nJinja2 templates]
    end

    subgraph Notify["notifications/"]
        NB[base.py\nAbstract provider]
        ND[discord.py]
        NS[slack.py]
        NT[teams.py]
        NG[github_issues.py]
    end

    subgraph Outputs
        G[radar_report.md]
        H[radar_data.json]
        I[GitHub Issues]
        J[Discord/Slack/Teams]
    end

    Sources -->|sequential or --parallel| DL & ADL
    DL & ADL --> P --> E
    CFG --> E
    E --> R --> G
    E --> H
    H --> Notify --> I & J

๐Ÿ“Š Data Sources

SourceWhat It ProvidesUpdate Frequency
CVE List V5All CVE records (bulk ZIP)Daily midnight
NVD Data FeedsCVSS scores, CPE, CWE, referencesDaily
CISA KEVKnown exploited vulnerabilitiesAs needed
EPSSExploit probability scores (0-1)Daily
PatchThisCrowd-sourced exploit intelligenceContinuous

๐ŸŽฏ Watchlist Configuration

VulnRadar uses watchlist.yaml to filter CVEs relevant to your tech stack.

# Add vendors (organizations)
vendors:
  - microsoft
  - apache
  - google

# Add products (specific software)
products:
  - exchange      # Microsoft Exchange
  - log4j         # Apache Log4j
  - kubernetes    # Container orchestration

# Optional: exclude noise
exclude_vendors:
  - n/a
  - unknown

# Optional: configurable severity thresholds
thresholds:
  min_cvss: 0.0            # Include all severities
  min_epss: 0.0            # Include all exploit probabilities
  severity_threshold: 9.0  # Also flag CVEs with CVSS >= 9.0 as critical
  epss_threshold: 0.5      # Also flag CVEs with EPSS >= 50% as critical

# Optional: matching behaviour
options:
  always_include_kev: true
  always_include_patchthis: true
  match_mode: substring    # 'substring', 'exact', or 'regex'

Tips:

  • Matching is case-insensitive and uses substring matching by default
  • See watchlist.example.yaml for extensive examples by category
  • Run python etl.py --validate-watchlist to check for typos

๐Ÿšจ Priority Classification

VulnRadar automatically classifies findings:

PriorityConditionAction
๐Ÿ”ด CRITICALExploit Intel + watchlist, OR CISA KEV + watchlist, OR CVSS โ‰ฅ severity_threshold, OR EPSS โ‰ฅ epss_thresholdImmediate attention
๐ŸŸ  WARNINGHas Exploit Intel (PoC) but NOT in watchlistShadow IT risk
๐ŸŸก KEVIn CISA KEV catalogActive exploitation
โšช OtherWatchlist match onlyMonitor

๐Ÿ’ก severity_threshold and epss_threshold are optional โ€” set them in watchlist.yaml under thresholds: to expand what counts as critical beyond just exploit intel.


๐Ÿ”” Notifications

GitHub Issues (Default)

Critical findings automatically create GitHub Issues with the vulnradar label.

Discord (Optional)

Add DISCORD_WEBHOOK_URL to your repository secrets to receive Discord alerts. See docs/discord.md for setup instructions.

Slack (Optional)

Add SLACK_WEBHOOK_URL to your repository secrets to receive Slack alerts. See docs/slack.md for setup instructions.

Microsoft Teams (Optional)

Add TEAMS_WEBHOOK_URL to your repository secrets to receive Teams alerts (Adaptive Cards). See docs/teams.md for setup instructions.

Per-Severity Routing (Optional)

Route different alert levels to different webhooks:

# In watchlist.yaml
notifications:
  discord:
    - url: $DISCORD_CRITICAL_WEBHOOK
      filter: critical        # Only critical findings
      max_alerts: 25
    - url: $DISCORD_ALL_WEBHOOK
      filter: all             # Everything
  slack:
    - url: $SLACK_WEBHOOK_URL
      filter: kev             # Only KEV entries

Filters: all | critical | kev | watchlist. URLs starting with $ are resolved from environment variables.


๏ฟฝ Advanced Features

State Management & Deduplication

VulnRadar tracks which CVEs you've seen to avoid alert spam:

  • First run creates a baseline (no spam for existing CVEs)
  • Subsequent runs only alert on new critical CVEs
  • State stored in data/state.json

Issue Escalation

When an existing CVE's status changes (e.g., added to CISA KEV), VulnRadar posts an escalation comment on the existing issue instead of creating a duplicate.

GitHub Projects Integration

Automatically add new issues to a GitHub Projects v2 board:

# In notify.yml workflow
- run: python notify.py --project-url https://github.com/users/YOU/projects/1

Multi-Watchlist Support

For team collaboration, use watchlist.d/*.yaml:

watchlist.d/
โ”œโ”€โ”€ infra-team.yaml    # Infrastructure team's stack
โ”œโ”€โ”€ appsec-team.yaml   # AppSec team's focus areas
โ””โ”€โ”€ soc-team.yaml      # SOC monitoring list

All files are merged at runtime.

Weekly Summary Issues

Generate a weekly digest issue instead of individual alerts:

python notify.py --weekly-summary

Demo Mode

For conference presentations, inject a fake critical CVE:

python notify.py --demo

Severity Labels

Issues are automatically labeled by CVSS severity:

  • severity:critical (CVSS โ‰ฅ 9.0)
  • severity:high (CVSS โ‰ฅ 7.0)
  • severity:medium (CVSS โ‰ฅ 4.0)

GitHub Codespaces

One-click development environment with .devcontainer/devcontainer.json.


๏ฟฝ๐Ÿ–ฅ๏ธ Local Development

# Clone your fork
git clone https://github.com/YOUR_USERNAME/VulnRadar.git
cd VulnRadar

# Install dependencies
pip install -r requirements.txt

# Run the ETL
python etl.py

# View outputs
open data/radar_report.md      # Markdown report
open data/radar_data.json      # Raw JSON data

CLI Options

# Scan specific year range
python etl.py --min-year 2023 --max-year 2026

# Include older KEVs outside scan window
python etl.py --include-kev-outside-window

# Skip NVD download (faster, less enrichment)
python etl.py --skip-nvd

# Use NVD cache for faster repeated runs
python etl.py --nvd-cache .nvd_cache

# Download all data sources in parallel (requires aiohttp)
python etl.py --parallel

# Write per-vendor JSON files under data/vendors/
python etl.py --vendor-split

Notification Options (notify.py)

# Dry run - see what would be created
python notify.py --dry-run

# Demo mode - inject a fake CVE for presentations
python notify.py --demo

# Create weekly summary issue instead of individual alerts
python notify.py --weekly-summary

# Add issues to a GitHub Project board
python notify.py --project-url https://github.com/users/YOU/projects/1

# State management
python notify.py --reset-state      # Start fresh
python notify.py --prune-state 90   # Remove CVEs not seen in 90 days

Discovery Commands

Find valid vendor/product names for your watchlist:

# List all vendors in CVE data
python etl.py --list-vendors

# Search vendors containing "micro"
python etl.py --list-vendors "micro"

# List all products
python etl.py --list-products

# Search products containing "log4"
python etl.py --list-products "log4"

# Validate your watchlist against real CVE data
python etl.py --validate-watchlist

๐Ÿ“ Repository Structure

VulnRadar/
โ”œโ”€โ”€ etl.py                 # Thin CLI shim โ†’ vulnradar.cli.main_etl()
โ”œโ”€โ”€ notify.py              # Thin CLI shim โ†’ vulnradar.cli.main_notify()
โ”œโ”€โ”€ watchlist.yaml         # Your configuration (edit this!)
โ”œโ”€โ”€ watchlist.example.yaml # Extensive examples by category
โ”œโ”€โ”€ requirements.txt       # Python dependencies
โ”œโ”€โ”€ vulnradar/             # Core package
โ”‚   โ”œโ”€โ”€ __init__.py        # Version & public API
โ”‚   โ”œโ”€โ”€ cli.py             # argparse entry points
โ”‚   โ”œโ”€โ”€ config.py          # Pydantic models for watchlist + settings
โ”‚   โ”œโ”€โ”€ downloaders.py     # Sequential HTTP fetchers (requests)
โ”‚   โ”œโ”€โ”€ async_downloaders.py # Parallel fetchers (aiohttp, --parallel)
โ”‚   โ”œโ”€โ”€ parsers.py         # CVE JSON parsing, CVSS extraction
โ”‚   โ”œโ”€โ”€ enrichment.py      # KEV/EPSS/PatchThis/NVD merge
โ”‚   โ”œโ”€โ”€ report.py          # Jinja2 Markdown report writer
โ”‚   โ”œโ”€โ”€ state.py           # StateManager for deduplication
โ”‚   โ”œโ”€โ”€ notifications/     # Strategy-pattern providers
โ”‚   โ”‚   โ”œโ”€โ”€ base.py        # Abstract NotificationProvider
โ”‚   โ”‚   โ”œโ”€โ”€ discord.py     # Discord webhooks
โ”‚   โ”‚   โ”œโ”€โ”€ slack.py       # Slack webhooks
โ”‚   โ”‚   โ”œโ”€โ”€ teams.py       # Teams Adaptive Cards
โ”‚   โ”‚   โ””โ”€โ”€ github_issues.py # Issues + Projects v2
โ”‚   โ””โ”€โ”€ templates/
โ”‚       โ””โ”€โ”€ report.md.j2   # Customizable report template
โ”œโ”€โ”€ tests/                 # 331 tests (pytest)
โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ radar_report.md    # GitHub-viewable report (auto-generated)
โ”‚   โ”œโ”€โ”€ radar_data.json    # Machine-readable output (auto-generated)
โ”‚   โ”œโ”€โ”€ radar_index.json   # Vendor-split manifest (with --vendor-split)
โ”‚   โ”œโ”€โ”€ state.json         # Alert tracking state (auto-generated)
โ”‚   โ””โ”€โ”€ vendors/           # Per-vendor JSON files (with --vendor-split)
โ”œโ”€โ”€ scripts/
โ”‚   โ”œโ”€โ”€ reset_demo.sh      # Reset demo repo for presentations
โ”‚   โ”œโ”€โ”€ update_readme_metrics.py  # Auto-update README stats
โ”‚   โ””โ”€โ”€ validate_watchlist.py     # CI watchlist validation
โ”œโ”€โ”€ docs/                  # Full documentation
โ”œโ”€โ”€ .devcontainer/         # GitHub Codespaces support
โ””โ”€โ”€ .github/workflows/
    โ”œโ”€โ”€ update.yml         # Scheduled ETL (every hour)
    โ”œโ”€โ”€ notify.yml         # Issue creation on new findings
    โ””โ”€โ”€ ci.yml             # Linting and tests

๐Ÿ” Security & Privacy

  • No API keys required โ€” uses only public data feeds
  • No data leaves your repo โ€” everything runs in GitHub Actions
  • GITHUB_TOKEN is automatic โ€” no PAT needed for basic operation
  • Outputs contain CVE metadata only โ€” no secrets, no PII

๐Ÿ“š Documentation

GuideDescription
Getting StartedFirst-time setup
ConfigurationWatchlist deep-dive
Data SourcesHow we gather intel
ETL ReferenceCLI options and tuning
Data SchemaJSON output format
AutomationGitHub Actions setup
TroubleshootingCommon issues

๐Ÿ†š Why VulnRadar?

FeatureVulnRadarTypical Tools
NVD API RequiredโŒ Noโœ… Yes
API KeysโŒ Noneโœ… Multiple
Self-Hostedโœ… Your GitHubโŒ SaaS
Costโœ… Free๐Ÿ’ฐ Often paid
Setup Timeโšก 5 minutes๐ŸŒ Hours
GitHub Nativeโœ… Issues, Actions, MarkdownโŒ External dashboards

๐Ÿค Contributing

Contributions welcome! See CONTRIBUTING for guidelines.


๐Ÿ“„ License

MIT License โ€” see LICENSE for details.

Radar icon by Lucide (ISC License).


๐Ÿ”ด Live Demo

See VulnRadar in action with real data: VulnRadar-Demo


Built for BSidesGalway 2026
Made with โ˜• by RogoLabs