HOW-TO GUIDE | CISA KEV
Updated 11 min read

How to Set Up CISA KEV Alerts Without a SIEM (Free, Under 30 Minutes)

$0
Cost of the CISA KEV JSON feed (fully public)
30 min
Time to have automated alerts running using Option B (GitHub Actions)
1,607
CVEs in the CISA KEV catalog as of June 2026
~weekly
Average new KEV additions per week during active threat periods

SponsoredRetool

Retool's new app builder is where AI-generated code ships safely

Building apps with AI is easy. Getting them to production safely is another story.

Start building for free today

The CISA Known Exploited Vulnerabilities catalog is the most operationally relevant public vulnerability feed available. It lists only CVEs with confirmed active exploitation. Every entry is an attacker-confirmed weapon.

Most organizations either check it manually (inconsistently) or rely on an enterprise scanner that surfaces KEV data days after the fact. Neither approach works when CISA deadlines expire within 21 days of addition.

CISA publishes the full catalog as a free JSON feed. You can build an automated alert system that notifies you within hours of a new entry using a Python cron job, a GitHub Actions workflow, or a no-code tool. None of these options require a SIEM, a security vendor contract, or anything beyond a free tier account.

The CISA KEV JSON Feed: Structure and Access

CISA publishes the full KEV catalog at a stable public URL. The feed returns a JSON object with a top-level vulnerabilities array. Each entry includes:

{
  "cveID": "CVE-2026-0257",
  "vendorProject": "Palo Alto Networks",
  "product": "PAN-OS",
  "vulnerabilityName": "Palo Alto Networks PAN-OS Authentication Bypass Vulnerability",
  "dateAdded": "2026-05-11",
  "shortDescription": "Palo Alto Networks PAN-OS contains an authentication bypass...",
  "requiredAction": "Apply mitigations per vendor instructions...",
  "dueDate": "2026-06-01",
  "knownRansomwareCampaignUse": "Unknown",
  "notes": ""
}

The feed URL is:

https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json

CISA also provides a CSV version at the same base path with a .csv extension. The JSON feed is easier to parse programmatically. The baseline detection approach is simple: download the feed, extract all CVE IDs, compare against yesterday's known set, and alert on the difference.

Option A: Python Script with Daily Cron Job

This option works on any Linux or macOS server and requires only Python 3 and an SMTP server or webhook URL for notifications.

Step 1: Create the monitoring script

Save this as kev_monitor.py:

import json
import urllib.request
import os
from datetime import date

KEV_URL = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
STATE_FILE = os.path.expanduser("~/.kev_seen.json")

def fetch_kev():
    with urllib.request.urlopen(KEV_URL) as r:
        return json.loads(r.read())

def load_seen():
    if os.path.exists(STATE_FILE):
        with open(STATE_FILE) as f:
            return set(json.load(f))
    return set()

def save_seen(ids):
    with open(STATE_FILE, "w") as f:
        json.dump(list(ids), f)

def format_alert(entry):
    return (
        f"NEW KEV ENTRY: {entry['cveID']}\n"
        f"  Product: {entry['vendorProject']} {entry['product']}\n"
        f"  Due Date: {entry['dueDate']}\n"
        f"  Action: {entry['requiredAction'][:120]}"
    )

data = fetch_kev()
current_ids = {e["cveID"] for e in data["vulnerabilities"]}
seen_ids = load_seen()
new_entries = [
    e for e in data["vulnerabilities"] if e["cveID"] not in seen_ids
]

if new_entries:
    for entry in new_entries:
        print(format_alert(entry))
    # Add your notification here: email, Slack webhook, PagerDuty, etc.

save_seen(current_ids)

Step 2: Schedule with cron

Run crontab -e and add:

0 8 * * * /usr/bin/python3 /path/to/kev_monitor.py >> /var/log/kev_monitor.log 2>&1

This runs every morning at 8 AM. The script stores the previously seen CVE IDs in ~/.kev_seen.json. On first run, it will report all 1,600+ current entries as new. After that, only genuine additions trigger output.

Free daily briefing

Briefings like this, every morning before 9am.

Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.

Option B: GitHub Actions Workflow (Zero Infrastructure)

This option requires no server. GitHub Actions runs the check on a schedule using free tier compute, commits the updated KEV state to your repository, and can trigger a webhook notification on any new entries.

Step 1: Create a private repository named kev-monitor (or add to an existing private repo).

Step 2: Create .github/workflows/kev-monitor.yml:

name: CISA KEV Monitor

on:
  schedule:
    - cron: '0 8 * * *'  # Daily at 8 AM UTC
  workflow_dispatch:

jobs:
  check-kev:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Fetch KEV catalog
        run: |
          curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json \
            | jq -r '.vulnerabilities[].cveID' | sort > kev_current.txt

      - name: Compare to previous
        run: |
          if [ -f kev_previous.txt ]; then
            NEW=$(comm -23 kev_current.txt kev_previous.txt)
            echo "NEW_ENTRIES<<EOF" >> $GITHUB_ENV
            echo "$NEW" >> $GITHUB_ENV
            echo "EOF" >> $GITHUB_ENV
          else
            echo "NEW_ENTRIES=FIRST_RUN" >> $GITHUB_ENV
          fi
          cp kev_current.txt kev_previous.txt

      - name: Notify on new entries
        if: env.NEW_ENTRIES != '' && env.NEW_ENTRIES != 'FIRST_RUN'
        run: |
          curl -s -X POST ${{ secrets.SLACK_WEBHOOK_URL }} \
            -H 'Content-type: application/json' \
            --data "{\"text\": \"New CISA KEV entries detected:\\n${{ env.NEW_ENTRIES }}\"}" 

      - name: Commit updated state
        run: |
          git config user.name "kev-monitor"
          git config user.email "bot@example.com"
          git add kev_previous.txt
          git diff --staged --quiet || git commit -m "KEV state update $(date -u +%Y-%m-%d)"
          git push

Step 3: Add your Slack webhook (or other notification endpoint) as a GitHub Actions secret named SLACK_WEBHOOK_URL.

This workflow commits a sorted CVE ID list daily and diffs it against the previous run. New entries trigger the notification step. The entire setup takes about 10 minutes.

Option C: Slack Webhook Notification with Rich Formatting

If you want enriched Slack alerts that include the product name, due date, and required action text (not just the CVE ID), extend the Python script from Option A with a direct Slack webhook call.

Replace the comment in the script with:

import urllib.request
import json

def send_slack_alert(entries, webhook_url):
    lines = []
    for e in entries:
        lines.append(
            f"*{e['cveID']}* -- {e['vendorProject']} {e['product']}\n"
            f"> Due: {e['dueDate']} | {e['requiredAction'][:100]}"
        )
    payload = {
        "text": f":rotating_light: *{len(entries)} new CISA KEV entr{'y' if len(entries)==1 else 'ies'}*",
        "blocks": [
            {"type": "section", "text": {"type": "mrkdwn", "text": "\n\n".join(lines)}}
        ]
    }
    req = urllib.request.Request(
        webhook_url,
        data=json.dumps(payload).encode(),
        headers={"Content-Type": "application/json"}
    )
    urllib.request.urlopen(req)

To get a Slack webhook URL: go to api.slack.com/apps, create a new app, enable Incoming Webhooks, add a webhook to your chosen channel, and copy the URL. Store it as an environment variable rather than hardcoding it in the script.

Option D: No-Code Alert via Zapier or Make

If you want zero code, Zapier and Make both support polling a JSON URL and triggering an action when new items appear.

Zapier setup (free tier):

  1. Create a new Zap with trigger: "Webhooks by Zapier" or "Schedule" (daily)
  2. Add an action step: "Code by Zapier" (JavaScript) that fetches the KEV JSON and compares against a stored list in Zapier Storage
  3. Add a filter step that only continues when new entries exist
  4. Add an action step: send to email, Slack, or SMS

Make (formerly Integromat) setup:

  1. Create a scenario triggered on a schedule (daily)
  2. Use the HTTP module to GET the KEV JSON feed
  3. Use the JSON module to parse the response
  4. Use the Data Store module to track previously seen CVE IDs
  5. Use a Router to filter for new entries only
  6. Connect to your notification channel

The no-code approach is slower to set up correctly (data store comparison logic requires some effort) but requires no infrastructure. Use it if you are not comfortable running Python scripts or GitHub Actions.

The bottom line

You do not need a SIEM, a vendor contract, or any budget to monitor the CISA KEV catalog. The JSON feed is public and stable. A 30-line Python cron job or a GitHub Actions workflow gives you same-day alerts on every new KEV entry. Pick Option B (GitHub Actions) if you want zero infrastructure and have an existing GitHub account. Pick Option A if you have a Linux server and want richer notification formatting. Either way, set this up today: CISA adds new entries faster than most manual review cycles can catch them, and the deadline clock starts ticking the moment they do.

Frequently asked questions

How often does CISA update the KEV catalog?

CISA adds new entries on an irregular basis, typically several times per week. During periods of active exploitation discovery, multiple entries can be added within a single day. The feed does not have a fixed update schedule, which is why polling daily (rather than weekly) is recommended. CISA does not publish a changelog or announcement feed for individual additions, so automated diff monitoring is the most reliable way to catch new entries.

Does CISA ever remove entries from the KEV catalog?

Rarely. CISA occasionally removes entries when CVE records are disputed, merged, or determined to have been incorrectly added. The monitoring scripts above detect removals as well as additions because they diff the full ID list. Treat a removal notification as informational rather than urgent: it means CISA updated their assessment, not that the vulnerability is no longer exploited.

Can I filter KEV alerts by vendor or product?

Yes. The JSON feed includes vendorProject and product fields for every entry. In the Python script, add a filter before the format_alert call: only alert if entry['vendorProject'] is in your approved vendor list. This lets a team running primarily Palo Alto, Microsoft, and Cisco products ignore KEV entries for products they do not run. Start unfiltered to avoid missing relevant entries, then add product filters once you know your environment coverage.

Is there an official CISA RSS or email subscription for KEV updates?

CISA does not publish an RSS feed or email subscription specifically for KEV catalog additions. They send general alerts through US-CERT, but those cover all advisories and are not scoped to KEV additions only. The JSON feed approach in this guide is the most direct and reliable method for KEV-specific monitoring.

Can I use the CISA KEV JSON feed to automatically create tickets in my vulnerability management system?

Yes. The CISA KEV JSON feed (cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json) provides a machine-readable catalog with CVE ID, vendor, product, vulnerability name, short description, required action, and due date fields. Integrate it with your vulnerability management workflow: a Python script that fetches the JSON, compares it against your asset inventory's CVE exposure list, and creates tickets in Jira, ServiceNow, or your VM platform for each matching KEV entry. Schedule the script daily. The cveID field can be cross-referenced with your scanner's CVE outputs directly. Most enterprise VM platforms (Tenable, Qualys, Rapid7) now have built-in KEV prioritization that surfaces KEV-listed CVEs automatically without custom scripting.

How do you validate that your KEV monitoring script is actually catching every new entry and not silently missing additions?

Validate your KEV monitoring pipeline with three checks run monthly. First, compare your stored historical CVE ID list against the current feed and confirm the count of unique IDs only ever increases -- a decrease indicates a data loss or state file corruption in your monitoring script. Second, pick three CVEs added to the KEV catalog in the past 30 days from the CISA website's date-sorted view and verify each one appears in your alert history with a timestamp within 24 hours of the CISA addition date. Third, intentionally corrupt your state file by deleting it and re-running the script -- confirm it does not send a flood of 1,600 false alerts, which would indicate your first-run handling is broken. For GitHub Actions-based monitoring, check the Actions run history to confirm the workflow has not silently stopped running due to a repository inactivity timeout -- GitHub disables scheduled workflows after 60 days of no repository activity. Push a trivial commit to the monitoring repository monthly to reset the inactivity timer.

Sources & references

  1. CISA KEV JSON Feed
  2. CISA Known Exploited Vulnerabilities Catalog
  3. GitHub Actions Documentation

Free resources

25
Free download

Critical CVE Reference Card 2025–2026

25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.

No spam. Unsubscribe anytime.

Free download

Ransomware Incident Response Playbook

Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.

No spam. Unsubscribe anytime.

Free newsletter

Get threat intel before your inbox does.

50,000+ security professionals read Decryption Digest for early warnings on zero-days, ransomware, and nation-state campaigns. Free, daily, no spam.

Unsubscribe anytime. We never sell your data.

Eric Bang
Author

Founder & Cybersecurity Evangelist, Decryption Digest

Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.

Black Hat Giveaway

Win a $2,495 Black Hat pass.

Full-access to Black Hat USA 2026 in Las Vegas. Subscribe free to enter.

Joins Decryption Digest daily briefing. Unsubscribe anytime.

Giveaway: Black Hat USA 2026 Full-Access Pass ($2,495 value)

Details →
Daily Briefing

Subscribe to enter the giveaway

Every subscriber is automatically entered. You also get daily threat intel every morning: zero-days, ransomware, and nation-state campaigns. Free. No spam.

Already subscribed? You're already entered.

Giveaway

Win a $2,495 Black Hat USA 2026 pass.