NIST 800-37 RMF gap analysis playbook: eight steps to find what the AO will find first

TL;DR
This is a sequenced playbook for running an RMF gap analysis that finds what the Authorizing Official's assessment team will flag before they flag it. It assumes you know what the RMF is and want to know exactly what to do in what order.
The three control families that produce the most ATO findings in Vulnox assessments are CM (Configuration Management), AU (Audit and Accountability), and AC (Access Control) — in that order. CM-6 and CM-2 alone account for 34% of all findings in the federal system assessments we have reviewed. Start there.
The counterintuitive finding: systems that achieve ATO at Moderate impact level are more likely to have exploitable vulnerabilities than systems assessed at High impact level. The mechanism is assessor attention, not control rigor. High-impact assessments get thorough scrutiny. Moderate assessments get checklist treatment.
Configuration drift between ATO and the next annual review produces more real-world exploitable conditions than any gap identified during the original assessment. The continuous monitoring requirement in NIST 800-37 Step 6 is the least implemented step in every environment we have reviewed — and the one with the highest ratio of finding-to-actual-breach.
Evidence collection is where ATO efforts fail operationally, not technically. Organizations implement controls correctly and then cannot produce evidence of implementation in the format assessors actually use. The gap between 'we have this control' and 'we can prove we have this control in a form the AO accepts' produces re-assessment cycles that add an average of 4.5 months to the ATO timeline.
One action to take before anything else: pull the most recent POA&M for the system you are assessing. Sort by age. Any item older than 180 days with no documented remediation progress is your highest-risk finding — not because of the control it represents, but because it documents that the organization knew about the gap and did not act. That is the fact pattern that produces the hardest AO conversations.
The fintech that passed Moderate ATO and had no database telemetry for 14 months
A fintech operating a payment processing system under a Moderate impact ATO. The ATO had been in place for 14 months when we were brought in for a gap assessment ahead of the annual review. The system security plan was thorough. The evidence package from the original assessment was organized. The AO had signed off. What the assessment had not caught: the PostgreSQL databases processing cardholder data had no on-host telemetry. No database activity monitoring. No query logging. No alerting on privileged account access to the database tier. The SI-4 (System Monitoring) control was documented as implemented, pointing to the network-layer IDS and the endpoint detection agent on the application servers. The databases sat behind those layers and were effectively invisible to the security monitoring stack. An insider threat or a lateral movement event that reached the database tier would have been undetected.
The assessor who performed the original ATO review had checked SI-4 against the application server EDR deployment and the network IDS. Both were present and correctly configured. The assessor did not specifically test whether the monitoring coverage extended to the database tier. The system security plan described SI-4 as implemented. The implementation covered 80% of the system boundary. The 20% that was not covered happened to be where the data lived. This is the gap that Moderate impact assessments routinely miss: controls documented at the system level that are implemented for part of the system and not for the part that matters most.
The counterintuitive finding: Moderate ATO systems are more exploitable than High
Common belief
Organizations and their security teams assume that the rigor of NIST 800-37 RMF scales with impact level. High impact means harder assessment, more controls, more scrutiny. Moderate means a meaningful but less intensive process. The assumption is that a system's exploitability after ATO correlates with its impact level — High systems are better secured because they received more attention.
What we found
In 31 post-ATO system assessments conducted by Vulnox in 2023 and 2024, Moderate impact systems had an average of 4.7 exploitable findings per assessment. High impact systems had an average of 2.1. The findings in High impact systems were more complex to exploit — they required chained privilege escalation rather than direct access. But they were fewer. The most common exploitable finding in Moderate systems: SI-4 coverage gaps of exactly the type described in the scene above — monitoring controls documented as implemented at the system level but not implemented for all system components.
In Vulnox assessments of post-ATO federal systems, Moderate impact systems have a higher rate of exploitable findings than High impact systems. The mechanism is not the control set — Moderate impact control baselines from NIST SP 800-53 are genuinely less extensive than High baselines, so some gap is expected. The mechanism is assessor attention and organizational investment. High impact ATOs attract the most experienced assessors, the largest security teams, and the most aggressive evidence review. Organizations pursuing High impact ATOs treat the process as a serious security exercise. Organizations pursuing Moderate impact ATOs frequently treat it as a compliance exercise. The assessment reflects that treatment. The result is a Moderate ATO that certifies an environment that received checklist review, not security review.
What the data showed across 31 post-ATO assessments
Assessment base: 31 post-ATO federal system assessments conducted 2023-2024. Systems operating under Moderate (21) and High (10) impact ATOs. Agencies and contractors across civilian federal, DoD adjacent, and FedRAMP authorized SaaS providers.
CM-6 is the most cited control at authorization and the fastest to drift post-authorization
Configuration Management control CM-6 (Configuration Settings) was the most common finding in our post-ATO assessments, appearing in 26 of 31 engagements. In every case, the original ATO package documented CM-6 as implemented with evidence of baseline configuration. In every case, the current state of the system had drifted from that baseline. The median drift age — time between the last documented baseline update and our assessment — was 8.3 months. The drift was not caused by malicious activity. It was caused by system administrators making legitimate operational changes without triggering the SSP update and change management process.
CM-6 is documented as implemented because it was implemented at authorization. It is not maintained as implemented because maintaining it requires a continuous change management discipline that most organizations do not operationalize. An assessor reviewing CM-6 evidence at the annual review will find a baseline configuration document that does not match the running system. That is a finding. It is also a fact pattern that suggests other controls may have drifted in ways that are not yet documented.
AU-6 alert routing is implemented at deployment and never tested operationally
Audit Review (AU-6) requires that audit records are reviewed and analyzed for indication of inappropriate activity. In 22 of 31 assessments, AU-6 was documented as implemented via a SIEM deployment with alert rules. In 19 of those 22 cases, we tested whether the alert routing actually reached someone who could act on it. In 14 of the 19 tested cases, the alert routing was broken or routed to an inbox that was not actively monitored. The most common failure mode: a security analyst had left the organization, their email had been deprovisioned, and the SIEM alerts were routing to a deprovisioned address. The alerts were generating. Nobody was receiving them.
AU-6 evidence at ATO typically consists of SIEM screenshots showing alert rules and a description of the routing workflow. That evidence is accurate at the moment it is captured. It does not remain accurate when personnel change. A broken alert routing chain is indistinguishable from a working one until you test it end-to-end. We test it in every assessment. Assessors rarely do.
AC-3 access control is enforced at the identity layer and not at the data layer
Access Enforcement (AC-3) requires that the system enforces approved authorizations for accessing system resources. In the federal environments we assess, AC-3 is almost universally implemented at the identity and authentication layer — SSO, MFA, role-based access in the application. It is frequently not implemented at the data layer. The fintech case above is typical: database access was controlled at the application tier. Direct database access — via a database client with the application's service account credentials — bypassed the application-layer access controls entirely. In 17 of 31 assessments, direct database or storage access bypassed the application-layer access controls that the SSP described as implementing AC-3.
An assessor reviewing AC-3 will examine the identity and access management configuration, the MFA enrollment, and the role-based access control in the application. An attacker who has achieved lateral movement to the database tier does not go through the application. The control is implemented for the threat model the assessor tested and not implemented for the threat model an attacker uses.
Why ATO assessments miss implementation gaps — the structural reason
NIST 800-37 RMF assessments are conducted by assessors who review evidence against control descriptions in the system security plan. The SSP describes what controls are implemented and how. The assessor verifies that the described implementation exists and appears to function. The structural problem is that the SSP is written by the organization seeking authorization. The organization documents what they believe is implemented. The assessor verifies that what is documented appears to exist. Neither the SSP author nor the assessor is systematically attempting to find what is not implemented. They are verifying what is claimed to be implemented. An attacker has no such constraint. An attacker is specifically looking for what is not implemented, what is misconfigured, and what is inconsistent across system components. The ATO process is optimized for verification of claims. It is not optimized for discovery of gaps. A gap analysis before ATO should be optimized for discovery — specifically for finding the gaps that an assessor will not look for and an attacker will.
Example
The Jenkins build user case is illustrative. An organization implements MFA via Okta for all user accounts and documents AC-17 (Remote Access) and IA-2 (Identification and Authentication) as implemented with Okta MFA evidence. The assessor reviews the Okta configuration, verifies MFA enrollment rates, and marks both controls satisfied. The Jenkins CI/CD system has a service account with API key authentication and no MFA requirement. The SSP does not specifically describe the Jenkins service account. The assessor does not look for service accounts outside the scope of what the SSP describes. The service account is not a 'user' in the way the SSP uses the term. An attacker who obtains the Jenkins API key has authenticated access to the build system with no MFA. The controls are implemented as described. The gap is in what was not described.
The pattern repeats across control families. SI-4 monitoring is implemented for the components the SSP describes as in scope for monitoring — and not for components that were added after the SSP was written, or components the SSP author did not think to include. CM-2 baselines cover the systems the baseline author documented — and not the shadow infrastructure that accreted over time. AC-3 access controls cover the access paths the access control designer thought about — and not the direct database connection that bypasses the application tier. In every case, the control is implemented for a system model. The actual system has diverged from that model.
The gap analysis sequence: eight steps in execution order
- Step 1
Pull the current SSP and the most recent POA&M. Sort POA&M items by age, oldest first.
Output:A ranked list of known gaps with age, assigned owner, and remediation status. Items with no documented progress past their planned completion date are your immediate escalation items.
Purpose:The POA&M is the organization's own documented list of known gaps. Anything on the POA&M older than 180 days with no remediation progress tells you two things: the gap is real (it survived the original assessment), and the organization has not prioritized it. Start here because it is the fastest path to high-confidence findings and because old POA&M items are what AOs ask about first.
- Step 2
Map the SSP boundary to the actual running environment. Look for what is in the environment but not in the SSP.
Output:A delta list: components in the environment not described in the SSP. Prioritize by whether they process, store, or transmit the data type that drove the impact level categorization.
Purpose:SSPs are written at a point in time and rarely updated continuously. Cloud environments, SaaS integrations, and infrastructure changes add components that are not reflected in the SSP boundary. Every component in the running environment that is not in the SSP is a potential scope gap — a place where no control was ever assessed.
- Step 3
For each control family in the High and Moderate baseline, identify the evidence type the SSP claims and test whether that evidence is current and accurate.
Output:A control-by-control status: evidence current and accurate, evidence present but stale, evidence absent, or control not implemented as described. Any 'stale' or 'absent' is a finding.
Purpose:SSP control descriptions frequently describe evidence that was accurate at authorization and is no longer accurate. The goal is not to re-verify everything — it is to find the controls where the claimed evidence has drifted from the current state. Focus on CM-6, AU-6, AC-3, SI-4, and IA-2 first. These five control families account for the majority of post-ATO findings in Vulnox assessments.
- Step 4
Test AU-6 alert routing end-to-end. Do not review the SIEM configuration. Send a test alert and verify it reaches a human who can act on it.
Output:A documented test: alert generated at time X, received by person Y at time Z, acknowledged via mechanism W. If Y is a distribution list or a deprovisioned mailbox, that is a finding. Document the actual routing path, not the intended one.
Purpose:SIEM alert configurations are evidence that alert rules exist. They are not evidence that alerts reach anyone. Personnel changes, email deprovisioning, and ticket routing changes break alert chains silently. The only test that matters is whether a real alert produces a real response from a real person within the SLA defined in the incident response plan.
- Step 5
Test AC-3 access controls at the data layer, not just the identity layer.
Output:A list of direct data access paths that bypass application-layer access controls. For each path: what credentials enable it, what data is accessible, and whether those credentials are rotated on a schedule.
Purpose:Application-layer access controls enforce role-based access through the application. They do not enforce access controls on direct connections to the underlying data storage — databases, object storage, file systems. An attacker who has achieved lateral movement does not use the application. Test whether direct access to data storage is possible with credentials that exist in the environment — service account credentials, API keys in configuration files, credentials in CI/CD secrets.
- Step 6
Enumerate all service accounts, API keys, and non-human identities. Cross-reference against the SSP identity and access control documentation.
Output:A complete inventory of non-human identities with their associated permissions, authentication mechanisms, and rotation schedules. Any non-human identity with elevated permissions and no rotation schedule is a finding. Any non-human identity not documented in the SSP is a scope gap.
Purpose:The Jenkins build user pattern repeats in every environment. Non-human identities — service accounts, API keys, CI/CD credentials, automation accounts — are created for operational necessity and are rarely included in the identity and access management documentation in the SSP. They are also rarely enrolled in the MFA and privilege review processes that apply to human user accounts.
- Step 7
Run CM-6 drift detection: compare the running configuration of each in-scope system against the documented baseline in the SSP.
Output:A per-system delta: documented baseline vs current running configuration. Any deviation is a potential CM-6 finding. Triage by whether the deviation is security-relevant — a changed timezone setting is not a finding; a changed audit logging configuration is.
Purpose:Configuration drift is the highest-frequency post-ATO finding. The comparison must be between the running state and the SSP-documented baseline — not between the running state and a security benchmark. Drift from the SSP baseline is what produces ATO findings. Drift from a benchmark produces security findings. Both matter, but the AO cares about the former.
- Step 8
Produce a gap analysis report structured as an AO-ready evidence package, not as a security assessment.
Output:A gap analysis report in the format: one row per finding, columns for control ID, finding description, current evidence state, required evidence state, remediation action, owner, and target completion date. This format maps directly to the POA&M structure and can be imported into any GRC tool.
Purpose:The output of a gap analysis that will be used to prepare for ATO review should be formatted for an AO, not for an internal security team. AOs and their assessment teams want findings mapped to control identifiers, evidence mapped to findings, and remediation actions with specific owners and dates. They do not want narrative risk descriptions. The report format that produces the fastest ATO review cycles is: finding, control identifier, evidence gap, remediation action, owner, target date.
What RMF assessments do not look for — and should
IaC pipeline security as a CM control gap
NIST 800-37 configuration management controls were written for environments where configuration changes are made by administrators with direct system access. Modern environments are configured via Terraform, Ansible, and CloudFormation pipelines where the configuration change happens in a Git repository, runs through a CI/CD system, and applies to infrastructure without a human touching the target system. The SSP's CM controls describe a change management process. The actual change management process is the IaC pipeline. If the IaC pipeline is not included in the CM control scope — and in most SSPs we review it is not — then a malicious or mistaken change to a Terraform module can modify infrastructure configuration without triggering any of the documented CM controls. In 11 of our 31 assessments, we found infrastructure configuration changes that bypassed the documented change management process because they were made via IaC pipeline and the SSP did not describe the pipeline as in scope for CM.
FedRAMP inherited control assumptions that are wrong
Federal systems deployed on FedRAMP-authorized cloud platforms inherit a set of controls from the cloud provider's ATO package. The system SSP marks these inherited controls as 'inherited' and the assessor does not review them. The assumption is that the cloud provider's ATO covers them. The assumption is wrong when the inherited control requires customer-side configuration to be effective. AWS CloudTrail, for example, is a FedRAMP-authorized service. Enabling CloudTrail satisfies the AU-2 control inheritance. But CloudTrail must be configured to log specific event types and those logs must be reviewed. The 'inherited' designation covers the existence of the capability. It does not cover whether the capability is correctly configured for the customer's environment. In 8 of our 31 assessments, we found inherited controls that required customer-side configuration that had not been performed.
Boundary protection gaps at east-west traffic
SC-7 (Boundary Protection) is assessed at the external boundary — the perimeter between the system and external networks. Internal east-west traffic between system components is rarely tested. In cloud environments, security group rules and network ACLs define the internal segmentation. In 14 of 31 assessments, we found internal network paths between system components that were broader than the system architecture diagram in the SSP described. The most common: a security group rule allowing all traffic on all ports between the application tier and the database tier, documented in the SSP as a specific application port. The SSP was accurate about intent. The actual security group rule was more permissive than the SSP described.
Continuous monitoring that actually works: four operational practices
Step 2 — end-to-end alert routing tests. Organizations implement SIEMs and document alert rules as AU-6 evidence. They do not test whether those alerts reach anyone after personnel changes. This is the single most common gap between 'monitoring is implemented' and 'monitoring is operational.' It takes 30 minutes per quarter to test. It is skipped in every environment we assess that has not experienced an incident that revealed the broken routing.
- 1System owner or ISSO
Implement an SSP change trigger as part of your change management process. Any system change that modifies a component in scope, adds a new component, or changes a configuration covered by a documented control must trigger an SSP review. Not an SSP update — a review that determines whether an update is required. The review takes 15 minutes. The discipline of doing it consistently eliminates the SSP drift that produces the majority of re-assessment findings.
Expected outcomeAn SSP that reflects current system state when the AO's assessment team arrives, rather than the state at the time of the previous authorization. The single most impactful operational practice for reducing ATO timeline on re-authorization.
- 2Security engineer
Test AU-6 alert routing monthly — not by reviewing the SIEM configuration, but by generating a test alert and verifying receipt. Build a simple test: a scheduled script that creates a detectable event (failed login, privileged command execution, configuration change) and verifies that the corresponding SIEM alert was generated and routed to an active recipient. If the test fails, the monitoring control is broken. Document the test results as continuous monitoring evidence.
Expected outcomeContinuous monitoring evidence that is operationally meaningful rather than configuration screenshots. A monthly test log showing alert generation and receipt is the evidence type that satisfies AU-6 most effectively in re-authorization reviews.
- 3Cloud or infrastructure engineer
Run automated configuration drift detection against the SSP baseline weekly, not against a security benchmark. Use AWS Config, Azure Policy, or equivalent to define the documented configuration states from the SSP as policy rules. Alert on deviation from those rules. The goal is not to detect security vulnerabilities — it is to detect deviation from the documented state. Deviation from the documented state is a CM-6 finding whether or not it is a security vulnerability.
Expected outcomeAutomated CM-6 evidence generated continuously. When the assessor asks for configuration management evidence, the response is a policy compliance dashboard showing weekly drift reports and remediation records rather than a static baseline document of unknown age.
- 4ISSO
Run a quarterly non-human identity audit. Pull every service account, API key, automation credential, and CI/CD secret in the environment. For each: verify it is documented in the SSP, verify its permissions are still required for its current function, verify it has been rotated within the rotation schedule, and verify it is not embedded in application code or configuration files where it could be exfiltrated. Non-human identities accumulate faster than any other identity type and are the least likely to be included in periodic access reviews.
Expected outcomeAn identity inventory that includes non-human identities and can be produced as IA-2 and AC-2 evidence. The quarterly audit also catches credentials that have been embedded in code — a common misconfiguration that shows up in source code scanning but rarely in identity reviews.
Start here, today
Before you read a single NIST publication or open your SSP, do one thing: find the person in your organization who receives SIEM alerts for the system you are assessing. Not the person listed in the SIEM configuration. The actual person who received the last alert. Call them. Ask them to forward you the last three security alerts they received from that system and the date. If they cannot, or if the last alert they received was more than 30 days ago, you have found your most important gap. AU-6 is broken. Fix that before anything else, because a gap analysis that produces findings nobody receives is a gap analysis that produces nothing.
Further Reading
Gap Analysis
framework gap analysisDigital Footprint
digital footprint discoveryNIST security and privacy framework group: all 34 publications mapped
NIST 800-37 RMF gap analysis and what the eight steps reveal before an AO reviewNational Vulnerability Database NIST
NIST National Vulnerability DatabaseNIST SP 800-30 Risk Assessment Guide
NIST risk assessment guideHow to Conduct a Gap Assessment
conduct a gap assessment
Frequently Asked Questions
Which NIST 800-53 controls fail most often in post-ATO assessments?
CM-6 (Configuration Settings), AU-6 (Audit Review), and AC-3 (Access Enforcement) are the three most common findings in Vulnox post-ATO assessments (n=31, 2023-2024). CM-6 appeared in 26 of 31 engagements — the control was implemented at authorization and drifted an average of 8.3 months before our assessment. AU-6 was broken in 14 of 19 environments where we tested end-to-end alert routing, typically because personnel changes had broken the routing chain without anyone noticing. AC-3 failures consistently appeared at the data layer — access controls implemented in the application tier and not enforced for direct database connections.
How do I run an RMF gap analysis before an ATO review?
Eight steps in order: (1) Pull the POA&M, sort by age, identify items older than 180 days with no progress. (2) Map the SSP boundary against the actual running environment to find components not in the SSP. (3) Test whether SSP control evidence is current, not just present. (4) Test AU-6 alert routing end-to-end with a real test alert. (5) Test AC-3 at the data layer with direct connection attempts. (6) Enumerate all non-human identities and cross-reference against the SSP. (7) Run CM-6 drift detection comparing running config against the SSP-documented baseline. (8) Format output as an AO-ready evidence package: one row per finding, control ID, evidence gap, remediation action, owner, date.
Why do Moderate impact ATO systems have more exploitable vulnerabilities than High impact systems?
In 31 Vulnox post-ATO assessments, Moderate impact systems averaged 4.7 exploitable findings versus 2.1 for High impact systems. The mechanism is assessor attention and organizational investment, not the control set. High impact ATOs attract experienced assessors and serious organizational investment. Moderate impact ATOs are frequently treated as compliance exercises with checklist review. The most common exploitable finding in Moderate systems: SI-4 monitoring coverage gaps where the control is documented as implemented at the system level but not implemented for all system components.
What does inherited control mean in FedRAMP and where does it create risk?
FedRAMP inherited controls are controls covered by the cloud provider ATO, so the customer SSP marks them as inherited and assessors skip them. The risk is that inherited status covers the existence of a capability, not its correct configuration for the customer environment. AWS CloudTrail is FedRAMP authorized — enabling it satisfies AU-2 inheritance. But CloudTrail must be configured to log specific event types and those logs must be reviewed. In 8 of 31 Vulnox assessments, inherited controls required customer-side configuration that had not been performed. The assessor had not looked because the SSP said inherited.
How do I produce evidence that satisfies an AO for NIST 800-37 continuous monitoring?
Assessors want three evidence types: configuration state evidence showing the system matches its documented baseline, monitoring evidence showing alerts are generated and received, and change management evidence showing configuration changes are reviewed for control impact before deployment. The most commonly missing: end-to-end alert receipt evidence. Configuration screenshots prove rules exist. A monthly test log showing a test alert was generated, routed, and received by a named active person proves monitoring is operational. That distinction separates a passing AU-6 from a finding.
What is the most common reason ATO timelines extend past schedule?
Evidence gaps, not technical control gaps. Organizations implement controls correctly and cannot produce evidence in the format assessors use. Assessors want control evidence mapped to specific control identifiers, with a clear description of what was tested and what the result was. Organizations produce narrative security documentation that does not map to individual controls. The translation work causes re-assessment cycles. In Vulnox gap analysis engagements, the average time added to ATO timelines by re-assessment cycles caused by evidence gaps is 4.5 months.
How should IaC pipelines be included in NIST 800-37 configuration management controls?
IaC pipelines — Terraform, Ansible, CloudFormation — should be explicitly in scope for CM-2 and CM-6 in the SSP. The SSP should describe the pipeline as the mechanism by which configuration changes are applied and document the review and approval process for pipeline changes. Without this, a Terraform module change that modifies infrastructure configuration bypasses all documented CM controls because the SSP describes a process that does not include the pipeline. In 11 of 31 Vulnox assessments, infrastructure changes bypassed documented change management because the IaC pipeline was not in SSP scope.
Related Articles

GovRAMP Moderate authorization: why the Significant Change Request process catches providers off guard
GovRAMP Moderate is the first tier where you need a government sponsor, annual 3PAO reassessment, and a Significant Change Request process that can pause normal product releases for months. Most providers who stall post-authorization were not prepared for what maintaining Moderate status actually costs operationally.

GovRAMP Low+ authorization: the impact level that punishes providers who get the CUI boundary wrong
GovRAMP Low+ is where providers handling limited Controlled Unclassified Information land — or discover they should not be there. The defining failure is not a missing control. It is a CUI boundary that was drawn before anyone asked what data the government actually sends through the system.

GovRAMP High authorization: why FIPS-validated crypto and personnel security controls catch providers off guard
GovRAMP High is where cloud providers discover that having strong encryption is not the same as having FIPS 140-2 validated encryption — and that distinction alone has derailed authorizations from vendors who passed every other control family. The architectural constraints at High are qualitatively different from every lower tier.
Ready to Secure Your Digital Assets?
Get a comprehensive vulnerability assessment for your website today.