Software Securityhome
Fix a findingSearch
Phase 6 · Maintenance

Root cause analysis

Root cause analysis asks why a vulnerability was possible, not only where it was. It traces a fixed bug back to the missing requirement, unsafe pattern, absent check or knowledge gap that let it through, so the fix covers the whole class of bug rather than one instance.

Fixing one instance leaves its siblings in place. If a cross-tenant leak came from an endpoint that skipped the shared tenant-scoped query helper, other endpoints may skip it too, and the next report will find one. SSDF practice RV.3 asks teams to record root causes, look for patterns and change the process, and CISA's Secure by Design pledge suggests tracking the root cause (CWE) of CVEs over time.

Who
The engineers who fixed the bug, facilitated by AppSec or a security champion, with the product owner for the actions
When
Once the fix has shipped for a significant vulnerability: exploited, high severity, reported from outside or a repeat
How often
Per significant vulnerability, plus a periodic review of causes across all findings, often each quarter
You end up with
A root-cause record with a CWE, a class-level fix such as a shared helper or a new check, and owned backlog items

Do this

  1. Decide which findings get an analysis

    Set the triggers in advance, for example any exploited vulnerability, any critical or high finding, anything reported from outside, and any repeat of a weakness already fixed in the same service. OWASP SAMM's Incident Management practice asks for root cause analysis of high-severity incidents at maturity level 2 and of all security incidents at level 3; NIST SP 800-61 Rev. 3 asks incident analysis to find underlying or systemic root causes.

  2. Classify the weakness with a CWE

    Map the vulnerability to the weakness that caused it, not to its impact: "remote code execution" is an outcome, while CWE-639, Authorization Bypass Through User-Controlled Key, is a cause. MITRE's root cause mapping guidance asks for the most specific Base or Variant entry that fits, and never a Category. Store the CWE on the finding so you can count it later.

  3. Ask why each phase let it through

    Walk the lifecycle with evidence. Was there a requirement (Security requirements)? Did the threat model (Threat modeling) cover this boundary? Was a safe pattern available, and was it used? Should code review, SAST or a test have caught it? Did the author know the risk? Record each answer; there is often more than one cause.

  4. Describe the system, not the person

    Write it blamelessly: what people knew and could see at the time, and which gaps in design, tooling or process allowed the mistake. Google's SRE workbook notes that changing human behavior is less reliable than changing automated systems and processes, so treat "the developer forgot" as the start of the question, not the answer.

  5. Fix the class, not only the instance

    Search the codebase for siblings of the same pattern and fix them now, as SSDF task RV.3.3 asks. Then pick the change that stops recurrence: a shared helper or secure default (Secure design patterns), a SAST rule or regression test in CI (CI security checks), a new requirement, or training for the teams that wrote the code (Role-based training).

  6. Track each action like a bug

    File each action in the backlog of the team that owns it, with a priority, one owner and a due date. The SRE workbook warns that action items without clear owners are less likely to be resolved, and that untracked ones are often forgotten. Review open actions with the product owner until they close, and verify the class fix with a test.

  7. Look for patterns over time

    Periodically count findings by CWE, service and the phase that should have caught them, and flag any CWE that returns in a service that already fixed it. SSDF task RV.3.2 asks for this pattern analysis, and the FIRST PSIRT Services Framework suggests feeding CWE data back into the development lifecycle and training. Report repeats with your program metrics (Exceptions and metrics).

Done when

Each significant vulnerability has a recorded root cause, and the changes it calls for are owned backlog items for the earlier phases.

Mark it in the gap check

Common mistakes

  • Stopping at "human error" or naming a person. Blame makes people guarded about what they report, and the gap that allowed the mistake stays open.
  • Fixing only the reported endpoint. The same missing check in the download, preview and bulk export paths waits for the next researcher.
  • Making retraining everyone the default action without evidence that a knowledge gap caused the bug. A shared helper and a regression test often prevent more.
  • Writing actions with no owner or due date, so they are often never done and the same class of bug returns.
  • Recording causes as free text. Without a CWE or a fixed list of causes, the periodic review has nothing to count.

Common root causes and the fix that removes them

Each cause points back to the phase where a lasting fix belongs. These pairings are common starting points, not a complete list.

Common root causes and the fix that removes them: table
CauseExampleClass-level fix
Missing requirementNo rule that exports are scoped to the caller's tenantA testable requirement and abuse case (Security requirements)
No safe patternEach endpoint builds its own tenant filter by handA shared, tested data-access helper that applies it by default (Secure design patterns)
Missing checkNo test for cross-tenant access, and no SAST rule for the patternA regression test or custom rule that fails the build (CI security checks)
Knowledge gapThe team did not know a framework default was unsafeTargeted training for that team, measured by repeats (Role-based training)
Skipped processA high-risk change went out without a design reviewA review trigger in the change process (Security design review)
Stale componentA vulnerable library shipped long after a fix was releasedAutomated update pull requests and due dates (Dependency patching)

Tools and guides

Standards

NIST SSDF 1.1
RV.3 Analyze Vulnerabilities to Identify Their Root Causes

Sources

  1. NIST SP 800-218: Secure Software Development Framework (SSDF) Version 1.1 (RV.3). February 2022.
  2. MITRE CWE: Root cause mapping guidance
  3. MITRE CWE-639: Authorization Bypass Through User-Controlled Key. CWE 4.20.
  4. Google SRE workbook: Postmortem Culture
  5. Google SRE book: Postmortem Culture: Learning from Failure
  6. OWASP SAMM: Incident Management, Incident Response stream
  7. OWASP SAMM: Defect Management, Metrics and Feedback stream
  8. CISA: Secure by Design Pledge
  9. FIRST: PSIRT Services Framework 1.1
  10. NIST SP 800-61 Rev. 3: Incident Response Recommendations and Considerations for Cybersecurity Risk Management. April 2025.

Find your next answer

Type to search. Search runs in your browser.

Searches run in your browser, but the host can infer them from the index files they load. The address shows your search so you can bookmark or share it.