FedRAMPVulnerability managementPython Updated October 2026

FedRAMP 2026 vulnerability deadlines, worked through a real scan

For years, FedRAMP vulnerability deadlines were a lookup on scanner severity: High in 30 days, Moderate in 90, Low in 180. Monthly continuous monitoring was largely the work of tracking those clocks in a POA&M.

The Consolidated Rules for 2026 end that model. The deadline now depends on what the vulnerability could actually do in your environment. This post walks through the new logic and how I implemented a first pass of it in VulnAnalyzer, the scan analysis tool I built for POA&M work. For the wider set of changes, see FedRAMP's 2026 rules: what changes for continuous monitoring.

Three questions replace one

Under the Vulnerability Evaluation and Reporting rules, a provider must evaluate every detected vulnerability for three things:

Question Rule Short name
Is it likely exploitable? VER-EVA-ELX LEV
Is it internet-reachable? VER-EVA-EIR IRV
What is the potential impact on agency customers, N1 to N5? VER-EVA-EPA PAIN

Two details are easy to miss.

Internet-reachable is not internet-accessible. A service with no route to the internet still counts if a payload from the internet can reach it indirectly. FedRAMP's own examples are SQL injection through an application tier, and Log4Shell triggered deep in a stack by a logged string.

Impact is about customers, not CVSS. N1 is a minimal effect on agencies using the service. N5 is a debilitating effect on more than one agency. A critical CVSS score on a host that holds nothing does not make an N5.

The deadline comes from all three

The timeframe to reduce a finding's impact rating is set by its N-rating, whether it is likely exploitable, whether it is internet-reachable, and the offering's Certification Class. This is rule VDR-TFR-PVR. For Class C, in days:

Impact Likely exploitable, internet-reachable Likely exploitable, not reachable Not likely exploitable
N5 2 4 16
N4 4 8 64
N3 16 32 128
N2 48 128 192

Class B is more lenient (4 days at the top left) and Class D stricter (12 hours). N1 has no fixed timeframe.

Three more rules sit on top of the table:

What the same scan looks like under each model

I ran VulnAnalyzer's example scan under both profiles. Five findings show the difference.

Finding Old deadline 2026 evaluation 2026 deadline (Class C)
Log4Shell on an internet-facing host holding multi-agency data 30 days Likely exploitable, reachable, N5 2 days, and a reportable incident
Log4Shell on an internal host 30 days Likely exploitable, not reachable, N4 8 days
OpenSSH Terrapin (CVSS 5.9) on that same internet-facing host 90 days Likely exploitable, reachable, N3 16 days
OpenSSH Terrapin on an internal low-impact host 90 days Likely exploitable, not reachable, N2 128 days
Self-signed certificate, internal, open since January 90 days, long overdue Not likely exploitable, N2 192 days, now an accepted vulnerability

The old model gave both Log4Shell findings the same 30 days and both Terrapin findings the same 90. The new one separates them by a factor of four and eight. A "Medium" on the wrong host now has a 16-day clock, which no severity-based process would have produced.

How VulnAnalyzer proposes each answer

A scan export contains none of the three answers directly, so the tool derives a proposal for each and records the evidence.

Likely exploitable. Yes if the CVE is in CISA's KEV catalog, if its EPSS score is at or above 10%, or if the scanner reports an available exploit. FedRAMP explicitly declines to prescribe a framework here, so this is my rule, not theirs, and the threshold is configurable. One deliberate choice: if exploit intelligence cannot be fetched, the finding is assumed likely exploitable. Reporting "not likely" with no evidence is the outcome the rule warns about.

Internet-reachable and asset impact. No scanner knows these. They come from a small asset context file:

host,internet_reachable,impact
203.0.113.0/24,yes,N4
10.20.1.15,yes,N5
10.20.2.0/24,no,N4
10.20.3.*,no,N2

Hosts missing from the file fall back to an assumption the analyst selects, and every value derived that way is marked as assumed in the output.

Impact rating. The lower of two limits: the asset's impact rating, and a cap from scanner severity (Critical N5, High N4, Medium N3, Low N2). The asset limits how bad it can be; the severity limits how much of that this particular finding could deliver.

The deadline is then a table lookup:

# {class: {PAIN: (LEV + IRV, LEV + not IRV, not LEV)}}
PVR_DAYS = {
    "B": {5: (4, 8, 32),  4: (8, 32, 64), 3: (32, 64, 192), 2: (96, 160, 192)},
    "C": {5: (2, 4, 16),  4: (4, 8, 64),  3: (16, 32, 128), 2: (48, 128, 192)},
    "D": {5: (0.5, 1, 8), 4: (2, 8, 32),  3: (8, 16, 64),   2: (24, 96, 192)},
}

def due_days(cert_class, pain, lev, irv):
    row = PVR_DAYS[cert_class].get(pain)
    if row is None:               # N1: no fixed timeframe
        return None
    if not lev:
        return row[2]
    return row[0] if irv else row[1]

What a tool cannot do here

The rules require the provider to evaluate each vulnerability in the context of the cloud service. A heuristic over a CSV does not meet that bar, and I have tried to be honest about it in the tool:

What the tool does well is the part that used to consume the week: merging scanner formats, applying the lookup consistently, and showing which findings moved. That leaves the analyst's time for the evaluation itself, which is where the 2026 rules want it spent.

Sources

Rules are as published on fedramp.gov on October 1, 2026, and are still being revised.

← All writing