Lab 02 — Security Finding Quality Reviewer

Difficulty: 3/5 | Runs locally: yes

Pairs with the Phase 12 WARMUP Chapter 3 (the defensible finding) and Chapter 4 (risk framing).

Why This Lab Exists (Purpose & Goal)

A security finding is a claim you must defend — to the engineer who has to fix it, the executive who has to fund it, and sometimes an auditor or a vendor. A weak finding (vague location, no reproduction, inflated severity) is dismissed; a strong one gets acted on. The goal of this lab is to build the reviewer that enforces what makes a finding defensible, and — critically — that rejects severity claims the demonstrated evidence doesn't support.

The Concept, In the Weeds

A defensible finding contains a specific chain, and the reviewer checks each link:

authorization · evidence · preconditions · demonstrated impact · uncertainty · root cause · remediation · regression test · owner · residual risk

The two highest-value checks encode lessons from across the curriculum:

  • Demonstrated impact vs. claimed severity. The reviewer rejects severity claims unsupported by the demonstrated boundary (Phase 08's proven-vs-inferred). A "critical" with no demonstrated boundary crossing is not critical — and turning every risk into a critical is the fastest way to be ignored. When everything is critical, nothing is, and engineers stop reading your reports.
  • Root cause + remediation + regression test. A finding that names the what but not the why, or that has no concrete fix and no test to prevent recurrence, is incomplete — it's a symptom report, not engineering.

The discipline is calibration: severity must reflect demonstrated impact in context (exploitability × impact × asset criticality), with uncertainty stated honestly. A reviewer who calibrates is trusted precisely when a real critical appears.

Why This Matters for Protecting the Company

A security team's entire ability to reduce risk flows through its findings — if engineers don't act on them, nothing improves. Findings get acted on when they are defensible and calibrated: precise enough to fix, honest enough to trust, severe enough to prioritize but not inflated. Severity inflation is a slow poison: it trains the organization to discount security, so the one finding that is critical lands in a muted inbox. A finding-quality bar protects the company by keeping the security signal credible, which is the only way it drives action. This is the program-scale version of the calibration you learned in the Android (Phase 04) and crash-triage (Phase 08) labs.

Build It

Implement the reviewer: check findings for authorization, evidence, preconditions, demonstrated impact, uncertainty, root cause, remediation, regression test, owner, and residual risk. Reject severity claims unsupported by the demonstrated boundary.

LAB_MODULE=solution pytest -q

Secure Implementation Patterns

The anti-pattern. A finding that's a vibe — "critical" with no demonstrated boundary, "sanitize input" as the fix:

severity: critical
demonstrated_impact: "looks exploitable"      # no boundary crossed shown
remediation: "use encryption"                  # non-actionable

The secure pattern — enforce the defensible-finding chain (mirrors solution.py):

REQUIRED = ("authorization", "asset", "preconditions", "evidence", "demonstrated_impact",
            "uncertainty", "root_cause", "remediation", "regression_test", "owner", "residual_risk")

def review(finding: dict) -> tuple[str, ...]:
    issues = []
    for field in REQUIRED:
        if not str(finding.get(field, "")).strip():
            issues.append(f"missing:{field}")                          # the full chain or it's incomplete
    # severity must be backed by DEMONSTRATED impact, not asserted
    if finding.get("severity") == "critical" and \
       "system compromise" not in str(finding.get("demonstrated_impact", "")).lower():
        issues.append("unsupported-critical-severity")
    # remediation must be actionable, not a platitude
    if str(finding.get("remediation", "")).lower() in {"sanitize input", "use encryption", "fix it"}:
        issues.append("non-actionable-remediation")
    return tuple(sorted(issues))

Two checks carry the weight: a critical severity must be backed by demonstrated (not inferred) impact, and the remediation must be concrete enough to act on. Together they enforce calibration — the property that makes findings trusted.

A defensible finding:

authorization: "in-scope per ROE-2026-04"
asset: "tenant billing records"
preconditions: "authenticated low-priv user"
evidence: "request/response showing tenant-2 invoice returned to tenant-1 user (1 record)"
demonstrated_impact: "cross-tenant read of one record; full-table read inferred, not shown"
uncertainty: "exploitability of write paths not tested"
root_cause: "object id trusted without tenant/relationship check on GET /invoices/{id}"
remediation: "enforce object-level authZ: WHERE tenant_id = caller_tenant; return 404 on miss"
regression_test: "test_reader_cannot_read_other_tenant_invoice"
owner: "billing-platform"
residual_risk: "low after fix; monitor cross-tenant access metric"

Production practices to carry forward:

  • Separate demonstrated from inferred impact — say what you proved; never inflate severity.
  • Severity inflation is a slow poison — when everything is critical, nothing is, and the real critical lands in a muted inbox.
  • Every finding has a concrete fix and a regression test so the bug class can't silently return.
  • Calibrate by exploitability × impact × asset-criticality in context, not a reflexive CVSS number.

Validation — What You Should Be Able to Do Now

  • Write a defensible finding (location, repro, root cause, demonstrated-vs-inferred impact, calibrated severity, concrete fix, regression test, residual risk).
  • Reject and re-score severity claims the evidence doesn't support.
  • Explain why severity inflation destroys credibility and gets real criticals ignored.

The Broader Perspective

This lab crystallizes the professional voice of a security engineer: precise, calibrated, and honest about uncertainty — the qualities that make your assessments trusted and acted upon. It ties together the proven-vs-inferred discipline (Phase 08), the requirement-to-evidence chain (Phase 03/07), and the consequence-based prioritization (Phase 10) into one standard for how you communicate risk. At the staff level, your influence is your impact, and your influence rests on a track record of findings that were right and severities that were calibrated. Crying wolf is not just a style problem — it operationally degrades the company's response to real threats. Carry the calibration habit into every report, memo, and severity call you ever make.

Interview Angle

  • "Walk me through what makes a finding defensible." — Exact location, reproduction from clean state, root cause (why not just what), demonstrated impact separated from inferred, calibrated severity (exploitability × impact × criticality), a concrete fix with a regression test, honest limitations, and an owner. And never inflate severity — when everything is critical, nothing is.

Extension (Stretch)

Score a corpus of real-style findings, compute a precision metric for your reviewer, and feed accepted findings into the security roadmap prioritizer.

References

  • Phase 12 WARMUP Chapters 3–4; FIRST CVSS; OWASP risk-rating methodology.