EPSS Lookup Tool Changelog

Version 2.7.0 - May 27, 2026

Security Hardening & Reliability Release

A focused hardening release addressing findings from a full security and code review. No user-facing feature changes; the tool behaves the same, but is meaningfully more robust against abuse and operates more reliably.

Security Improvements

  • Stronger Content Security Policy (XSS hardening)

    All application JavaScript was moved out of index.html into an external app.js, which let us remove 'unsafe-inline' from the script-src CSP directive. Inline script injection is now blocked by the browser as a defense-in-depth layer behind the existing output escaping.

  • HTTPS Enforcement

    Added an HTTP Strict-Transport-Security (HSTS) header and a proxy-aware HTTP→HTTPS redirect (keyed off X-Forwarded-Proto to avoid redirect loops behind the CloudWays load balancer).

  • Reduced External-API Amplification

    The exploit-intelligence endpoint no longer persists database rows or writes import-log entries for CVEs that return no data from any upstream source. This prevents arbitrary, well-formed CVE IDs from filling tables and draining the shared NVD/EPSS rate budget.

  • Atomic Rate Limiting

    The per-IP rate limiter now uses exclusive file locking for its read-modify-write cycle, closing a race condition (TOCTOU) where concurrent requests could collectively exceed the configured limit.

  • Tightened CSRF Origin Check

    Requests to the POST logging endpoint that present neither an Origin nor a Referer header are now rejected (modern browsers always send Origin on state-changing requests).

  • Additional Output Escaping

    Closed several defense-in-depth gaps where trusted-but-external values (NVD score/severity, CISA KEV CWE identifiers, database severity strings) were interpolated into HTML/attributes without escaping. The OTX pulse_count is now cast to an integer server-side.

Reliability & Maintenance Fixes

  • Fixed Broken Cron Paths

    The data-update cron invoked api/import-epss-csv.php and api/download-mitre-attack.php, but those scripts live in scripts/. The full-history EPSS import (which powers the complete LEV calculation) and the MITRE refresh were silently failing; both paths are corrected.

  • Consistent Deployment Paths

    Consolidated the cron script's filesystem paths under a single APP_ROOT variable (previously a mix of /mnt/data/home/... and /home/... that relied on a symlink).

  • Data Retention / Cleanup

    The hourly cron now prunes dated EPSS/NVD snapshot files older than 30 days and clears stale per-IP rate-limit files, preventing unbounded disk growth.

  • Partial-Data Indicator

    Exploit intelligence served via the real-time API fallback (rather than the pre-computed CSV) is now flagged as (partial), since the fallback does not query every exploit repository.

  • Fixed Dead LEV Reference Link

    The "Learn more about LEV" link pointed to a NIST URL that no longer resolves. It now links to the locally hosted NIST CSWP 41 PDF.

  • Fixed "Copy Results" on CVEs Without Exploit Data

    Clicking "Copy Results" did nothing for CVEs that have no exploit-intelligence data (e.g. brand-new CVEs) due to a null-reference error in the copy-text builder. Also hardened the clipboard logic: it now detects a secure context, prefers the modern Clipboard API, falls back gracefully (with iOS handling), and shows a clear "Copy failed" state instead of failing silently.

Notes

  • Deployment: the new app.js file must be deployed alongside index.html.
  • No database migration required.
  • No changes to the cron schedule — the existing entries now resolve to the correct script paths.
Version 2.6.1 - January 20, 2026

UI Fix: Privacy Toggle Position

Bug Fixes

  • Privacy Toggle No Longer Floats

    Fixed issue where the "Search history enabled/disabled" toggle icon remained fixed at the top of the screen while scrolling through results.

    • Privacy toggle moved from fixed position to inside the Recent Lookups section
    • Now displays inline with recent CVE chips where it's contextually relevant
    • Added "Tracking On/Off" label for better clarity
    • Toggle is now visually grouped with the feature it controls
Version 2.6 - January 20, 2026

CVSS-TE Integration: Exploit Intelligence

New Feature: Exploit Intelligence & CVSS-TE Scoring

  • CVSS-TE (Threat-Enhanced CVSS)

    Added threat-enhanced CVSS scoring that factors in real-world exploit availability, powered by data from CVSS-TE project.

    • CVSS-TE Score: Threat-enhanced score factoring exploit quality and availability
    • CVSS-BT Score: Base + Temporal score with Exploit Code Maturity
    • Quality Metrics: Reliability, ease of use, and effectiveness percentages
  • Exploit Source Tracking

    Visual indicators showing which exploit repositories have weaponized code for the CVE:

    • Metasploit: Metasploit Framework module available
    • Nuclei: Nuclei detection template exists
    • ExploitDB: Exploit-DB entry available
    • GitHub PoC: Proof-of-concept code on GitHub
  • VulnCheck KEV Status

    Added VulnCheck KEV indicator as an alternative to CISA KEV for broader exploit awareness.

Data Architecture

  • Hybrid Data Approach

    Pre-computed scores from daily CSV import with real-time API fallback for missing CVEs.

  • Self-Calculated CVSS-TE

    Independent CVSS-TE calculation using quality multipliers, threat intelligence factors, and time decay - no dependency on external updates.

Server-Side Components

  • api/exploit-intel.php - Exploit intelligence API endpoint
  • scripts/import-cvss-te.php - Daily CSV import cron job
  • api/schema.sql - New exploit_intel and exploit_intel_log tables

Notes

  • Requires running database migration for new tables.
  • Set up cron job: 0 3 * * * php /path/to/scripts/import-cvss-te.php
  • Copy results now include Exploit Intelligence section.
  • Data source attribution added to footer.
Version 2.5.4 - January 19, 2026

OTX 404 Handling Fix

Bug Fixes

  • Unknown CVE Caching

    Fixed issue where CVEs not found in AlienVault OTX (404 responses) were not being cached properly, causing repeated API calls.

    • Unknown CVEs now cached with empty threat data for 24 hours
    • Reduces unnecessary API calls for CVEs with no threat intelligence
  • Error Logging

    Added improved error logging for OTX API failures to aid debugging.

Version 2.5.3 - January 16, 2026

Security Hardening

Security Improvements

  • SQL Injection Prevention

    All database queries now use parameterized prepared statements. Batch imports use single prepared statement with transactions.

  • IP Spoofing Protection

    Updated getClientIp() to validate X-Forwarded-For only from trusted proxies.

  • Regex DoS Prevention

    CVE input limited to 13-30 characters to prevent ReDoS attacks on validation regex.

  • API Response Validation

    Added validation functions for EPSS, NVD, and threat actor API responses to safely handle malformed data.

  • Malware Name Normalization

    Added normalizeMalwareName() to prevent bypass via Unicode tricks or special characters.

New Features

  • Privacy Mode

    Users can now disable localStorage search history tracking via a privacy toggle.

Version 2.5.2 - January 16, 2026

CISA KEV Enrichment

New Features

  • Ransomware Campaign Indicator

    CVEs in CISA KEV with knownRansomwareCampaignUse: "Known" now display a prominent ransomware badge, making it immediately visible when a vulnerability has been used in ransomware campaigns.

  • Enhanced KEV Details

    When a CVE is found in CISA KEV, the following additional fields are now displayed:

    • Vendor: The affected vendor/project name
    • Product: The specific affected product
    • Vulnerability Name: Official CISA vulnerability name
    • CWE: Associated weakness identifiers with links to MITRE CWE database
    • Ransomware Use: Whether the CVE has been used in ransomware campaigns (Known/Unknown)
    • Required Action: CISA's recommended remediation action (expandable section)
  • Updated Copy Results

    The "Copy Results" feature now includes all new KEV enrichment fields for easy sharing.

Security Improvements

  • Added escapeHtml() function to sanitize external data before rendering, preventing potential XSS from malicious KEV data.

Notes

  • No backend changes required - all new data comes from existing locally-cached CISA KEV JSON file.
  • This update better surfaces critical threat intelligence that was previously available but not displayed.
Version 2.5.1 - January 15, 2026

Documentation & Credits Update

Changes

  • Updated API Listing

    Reorganized and updated the external API documentation in the footer to clearly list all data sources used by the tool:

    • FIRST.org EPSS API
    • NVD (National Vulnerability Database)
    • CISA KEV (Known Exploited Vulnerabilities)
    • AlienVault OTX (Open Threat Exchange)
    • MITRE ATT&CK
  • Added Inspiration Credit

    Added acknowledgment to the original project that inspired this tool:

    • Credit added for epss-cve-lookup by Julien Mousqueton - a simple serverless web-based tool for EPSS lookups.
    • Our tool extends the original concept with additional data sources (CISA KEV, LEV calculations, threat actor intelligence) and a PHP backend for caching and analytics.

Notes

  • No functional changes in this release.
  • Documentation-only update for transparency and proper attribution.
Version 2.5 - January 13, 2026

Threat Actor Intelligence

New Feature: Threat Actor Intelligence (AlienVault OTX + MITRE ATT&CK)

  • CVE to Threat Actor Mapping

    See which APT groups, ransomware operators, and botnets have exploited a specific CVE, powered by AlienVault Open Threat Exchange (OTX) community threat intelligence.

    • APT Groups: Nation-state affiliated threat actors with attribution
    • Ransomware: Known ransomware groups exploiting the CVE
    • Botnets: Automated threat networks using the CVE
    • Malware Families: Associated malware and attack tools
    • Targeted Industries & Regions: Known targets from threat intelligence
  • MITRE ATT&CK Enrichment

    Threat actors are enriched with detailed profiles from MITRE ATT&CK including aliases, country attribution, and technique descriptions.

  • Nation-State Warning

    Visual indicator when a CVE is associated with nation-state sponsored threat actors.

  • Intel Report Count

    Shows how many community threat intelligence "pulses" reference the CVE - indicating level of threat actor interest.

Backend Performance Optimizations

  • Database Connection Pooling

    Implemented singleton pattern with persistent PDO connections to reduce connection overhead.

  • Static Data Caching

    MITRE ATT&CK and CISA KEV data now cached in memory after first load, eliminating redundant file I/O.

  • O(1) Hash Map Lookups

    Replaced O(n) loops with hash map indexes for MITRE actor lookups (by name/alias) and CISA KEV checks.

  • Threat Actor Cache

    OTX API results cached in database for 24 hours to reduce external API calls. Supports ?refresh=1 to bypass cache.

Server-Side Components

  • api/threat-actors.php - Threat actor intelligence endpoint (AlienVault OTX + MITRE enrichment)
  • api/config.php - Updated with OTX API configuration and optimized helper functions
  • scripts/download-mitre-attack.php - MITRE ATT&CK data downloader
  • data/mitre-attack/ - Local cache for MITRE ATT&CK threat actor profiles

Notes

  • AlienVault OTX is free: 1,000 requests/hour without API key, 10,000/hour with key.
  • Configure OTX API key in api/config.php for higher rate limits.
  • MITRE ATT&CK enrichment requires running scripts/download-mitre-attack.php initially.
  • Copy results now include Threat Actor information.
Version 2.0 - January 12, 2026

Major Release: NIST LEV, Search Analytics & More

New Feature: LEV (Likely Exploited Vulnerabilities)

  • NIST CSWP 41 LEV Implementation

    Added LEV (Likely Exploited Vulnerabilities) scoring based on NIST CSWP 41 - a backward-looking cumulative exploitation probability metric.

    • LEV Score: Calculates cumulative probability using formula: LEV2 ≥ 1 - ∏(1 - EPSS_i/30)
    • Composite Probability: max(EPSS, KEV indicator, LEV) - recommended prioritization metric per NIST guidance
    • Dual Calculation: Client-side approximation (30-day) + server-side full calculation (complete history)
  • LEV Analysis Panel

    New dedicated section displaying LEV Score, Composite Probability, data coverage period, and calculation source indicator.

New Feature: Search Analytics

  • CVE Search Tracking

    Track how many users searched for each CVE on the site over time.

    • Daily search counts stored in database
    • 30-day bar chart showing search interest trends
    • All-time and 30-day totals displayed

New Feature: Historical EPSS Trend Chart

  • 30-Day EPSS Score Visualization

    Line chart showing EPSS score changes over the past 30 days.

    • Uses FIRST.org API scope=time-series endpoint
    • Helps identify trending vulnerabilities and score volatility
    • Fixed-size canvas prevents browser memory issues

Bug Fixes

  • Fixed Chart.js Memory Leak

    Previous chart instances are now properly destroyed before creating new ones, preventing memory buildup during repeated lookups.

  • Added CVSS 4.0 Support

    The tool now checks for CVSS 4.0 metrics in addition to 3.1 and 3.0, ensuring newer vulnerabilities display correct severity scores.

  • Fixed Copy URL Typo

    Corrected the URL in copied results from "epsslook.com" to "epsslookuptool.com".

  • Reduced Lookup Cooldown

    Decreased the cooldown between lookups from 10 seconds to 3 seconds for faster consecutive searches.

Performance Optimizations

  • Deferred Chart.js Loading

    Moved Chart.js script to end of body with defer attribute to improve initial page load time.

  • Result Caching

    Added 5-minute client-side caching for lookup results. Cached results display instantly with a "Cached" badge indicator.

  • Parallel API Fetching

    All API calls (EPSS, NVD, KEV, LEV, Search Stats) now execute concurrently for faster results.

UI/UX Enhancements

  • Loading Spinner

    Added animated spinner with "Fetching vulnerability data..." message during API calls for better user feedback.

  • Recent Lookups

    Added clickable history chips showing up to 10 recent CVE lookups, stored in localStorage and persisted across sessions.

  • Mobile Tooltip Fixes

    Repositioned tooltips on mobile devices to prevent overflow and improve readability.

  • Keyboard Shortcuts

    Added Ctrl+Enter (or Cmd+Enter on Mac) to submit the lookup form from anywhere on the page.

Server-Side Components (New)

  • api/lev.php - LEV calculation endpoint
  • api/log-search.php - Search logging endpoint
  • api/search-stats.php - Search statistics endpoint
  • api/schema.sql - Database schema for search tracking and EPSS history
  • api/import-epss-csv.php - EPSS data importer for full LEV calculation
  • Updated cisa-kev/download_cisa_kev.sh - Now downloads EPSS CSV

Notes

  • LEV client-side approximation works immediately; full server-side calculation requires database setup.
  • Search analytics require database configuration in api/config.php.
  • Copy results now include LEV Score and Composite Probability.
Version 1.5 - April 04, 2025

Updated CISA KEV Reference Link

Enhancements

  • Updated CISA KEV Reference Link

    Modified the CISA KEV reference link to point to the specific CVE record on CVE.org instead of the general CISA KEV catalog page.

    • Changed from a static link (https://www.cisa.gov/known-exploited-vulnerabilities-catalog) to a dynamic link using the CVE number (e.g., https://www.cve.org/CVERecord?id=CVE-2025-22457).
    • Updated both the displayed results and the copied text in the "Copy Results" feature to reflect the new link.

Bug Fixes

None introduced in this update.

Notes

  • The new reference link provides more specific information about the CVE, improving user access to detailed vulnerability records.
  • No impact on performance or other functionality.
Version 1.3.2 - April 04, 2025

Added CISA KEV Due Date, Performance Optimizations, and UI Enhancements

Features

  • Added CISA KEV Due Date to Results

    Added the "Due Date" field to the results for CVEs found in the CISA KEV catalog, showing the remediation deadline (e.g., "2022-01-10"). Displays "N/A" if the due date is not available.

    • Extracts the dueDate from the matching KEV entry in the cached data.
    • Included in the copied results for reporting.
  • Performance Optimization with Caching

    Optimized performance by caching the CISA KEV data on page load and reusing it for subsequent lookups.

    • Added a cisaKevCache object to store the data, last fetch timestamp, and a Set of CVE IDs for O(1) lookups.
    • Cache expires after 24 hours, ensuring data freshness without repeated fetches.
    • Added a loading indicator during the initial fetch to improve user experience.
  • Local CISA KEV File Hosting

    Removed dependency on CORS proxies by hosting the CISA KEV JSON file locally, updated hourly via a cron job.

    • Downloads the file from https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json every hour.
    • Fetch time reduced from ~1-2 seconds (via proxy) to ~50-100ms (local file).
  • Widened Display and Enlarged Radar Chart

    Improved readability by widening the display and enlarging the radar chart.

    • Increased .container max-width from 500px to 800px.
    • Increased radar chart size from 400px to 600px, with responsive scaling.
    • Adjusted font sizes, padding, and margins for better visual balance.

Bug Fixes

  • Fixed CISA KEV Status Display

    Resolved an issue where CISA KEV status was incorrectly showing "Unknown" due to CORS fetch failures.

    • Initially fixed by isolating the CISA KEV fetch and using a CORS proxy.
    • Further resolved by hosting the file locally, eliminating CORS issues.

Notes

  • Added .loading CSS class for the loading indicator during initial CISA KEV fetch.
  • Performance improvements reduce lookup time to ~400-1000ms after the initial fetch.
  • Local file hosting requires a cron job setup (e.g., using curl or Node.js script) to download the CISA KEV file hourly.
Version 1.3.1 - April 04, 2025

Updated Footer Layout and Added CISA KEV Status

Enhancements

  • Repositioned Changelog Link

    Modified the footer layout to place the "Changelog" link on a new line below the "Data provided by" line.

    • Split the footer content into separate

      tags for better visual separation.

    • Removed the separator (|) as it was no longer needed with the new layout.
    • Improves readability and aligns with user expectations for footer navigation.
  • Added CISA KEV Status and Reference

    Added a check for whether a CVE is in the CISA KEV catalog, displaying "Yes" with a reference link or "No".

    • Fetches data from https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json.
    • Initially used a CORS proxy due to cross-origin restrictions, later replaced with local hosting in v1.3.2.
    • Included in the copied results for reporting.

Bug Fixes

None introduced in this update.

Notes

  • Initial CISA KEV implementation faced CORS issues, addressed in v1.3.2.
  • UI adjustment does not affect functionality.
Version 1.3.0 - April 04, 2025

Added Copy Results Feature for Reporting

Features

  • Copy Results to Clipboard

    Added a "Copy Results" button to the output section, allowing users to copy vulnerability details in a report-friendly text format.

    • Formats results as plain text, including CVE, EPSS, Percentile, CVSS Score, Last Updated, Published Date, Description, and References.
    • Uses the navigator.clipboard API for modern browsers, with a fallback for older browsers using a temporary textarea.
    • Provides visual feedback by changing the button text to "Copied!" for 2 seconds after a successful copy.
    • Excludes the radar chart from the copied text, as it is a visual element.

    Users can now easily paste results into reports, emails, or other documents, improving workflow efficiency.

Bug Fixes

None introduced in this update.

Notes

  • Added .copy-button CSS class to style the new button consistently with the existing design.
  • Includes error handling with an alert if copying fails.
Version 1.2.0 - April 04, 2025

Added URL Query Parameter Support and Enhanced Result Details

Features

  • URL Query Parameter Support

    Added functionality to accept a CVE ID from the URL query string (e.g., epsslook.com/?cve=CVE-2055-123456) to auto-populate the input field and trigger a lookup.

    • Introduced getQueryParam(param) function to parse URL query parameters.
    • Added DOMContentLoaded event listener to extract, validate, and submit the CVE.
    • Users can now share or bookmark direct links to specific CVE lookups.
  • Enhanced Result Details

    Expanded search result output to include additional vulnerability details from the NVD API:

    • Published Date: Shows when the CVE was published (e.g., "2022-03-15T17:15:00").
    • Description: Provides a summary of the vulnerability.
    • References: Lists up to 3 external links (e.g., advisories, NVD details) as clickable URLs.

    These fields are conditionally rendered when NVD data is available, enhancing context for users.

Bug Fixes

None introduced in this update.

Notes

  • References are capped at 3 to keep the UI manageable.
  • New fields use existing styles for consistency.
  • No additional API calls; leverages existing NVD response.
Version 1.1.0 - [Previous Version, Hypothetical]

Added URL Query Parameter Support

Features

  • URL Query Parameter Support

    Initial implementation of URL query parameter parsing and auto-submission (as detailed in v1.2.0).

    Released prior to adding enhanced result details.

Version 1.0.0 - [Initial Release, Hypothetical]

Initial Release

Features

  • Basic EPSS Lookup Tool

    Initial release with:

    • Input form for CVE entry.
    • EPSS score, percentile, CVSS score, severity, last updated date, and radar chart output.
    • Theme toggle (light/dark mode).
    • No URL parameter support or additional NVD details.