Guide 036 decision guide

How to close a finding when the vulnerable feature is removed

Close a finding after feature removal only when the affected routes, workers and restoration paths are reconciled with evidence for the deployed artifacts.

Close a verified finding as “fixed by removal” only when the harmful action is no longer possible through the feature's relevant entry points in the deployed version. Deleting a button, file or route is a starting observation. Map its callers, alternate endpoints, background jobs and old deployments; then collect positive evidence that the old path is gone or safely denied. If a replacement feature still performs the same unsafe action, keep the issue open against that path. If deployment or an alternate path cannot be checked, record the result as inconclusive and name the missing evidence. Removal does not undo any earlier disclosure, and it does not justify deleting the finding's history.

This decision is narrower than asking whether the product still offers the feature. It asks whether the specific harmful behavior represented by the finding still has a reachable path. OWASP's attack surface analysis guidance encourages looking at entry points and trust boundaries as an application changes. Use that map to decide what “removed” actually covers.

Follow one illustrative removal

Illustrative case, not a customer incident: CedarBoard previously let account members create a public report link. An approved finding at repository revision A1 described a missing account check: a signed-in user who knew a report ID could ask the legacy link service to create a share link for another account's report. The team decides to retire public sharing rather than repair it. At revision B2, the web button and POST /reports/{id}/share handler disappear.

The deletion is useful evidence, but CedarBoard also has a mobile API and a scheduled worker that renews existing share links. The report service may still expose a create_share_token function to those callers. A deployed older API instance may also continue serving the previous route during a rolling release. The original finding's harmful action was creating a link to a report the caller did not own. The AppSec lead must follow that action, rather than search only for the name of the removed web handler. OWASP's Authorization Cheat Sheet frames authorization around each access request and the resource involved; a login check or a missing UI control does not establish permission for the report.

Continue with a partial retirement instead of assuming every migration succeeded. In the constructed release B2, web and mobile creation routes are removed and old API instances are drained. The worker code is expiry-only, but its retry queue still contains old renewal messages. Token invalidation migration M4 reports 96 of 100 synthetic token partitions complete and four failed. These are exercise counts, not customer results; no migration or request was executed.

That state supports removal of the inspected new-link entry points. It does not establish that every old link is unusable or that an older worker cannot consume queued renewal work. The remaining actions are specific: bind the active worker version, inspect how it handles the old message type, and resolve or contain the four failed token partitions.

Make the decision in six steps

  1. Bind the original claim. Record finding ID, originally affected revision and deployed version, actor, entry point, failed control and harmful effect. CedarBoard's claim is about unauthorized report sharing, not “a risky file.” The owner is the AppSec lead; the output is a one-sentence behavior to disprove at the new revision.
  2. Inventory every path to that behavior. Ask the service owner for current route maps, callers of the share-token operation, scheduled jobs, old API versions, mobile or partner interfaces and alternate hosts. Include data links that may survive code removal. Mark each path removed, replaced, still active or unknown, with its evidence. A text search is a navigation aid, not proof that there are no callers.
  3. Compare immutable revisions. Review A1 and B2 side by side. Map moved functions and changed shared controls; do not let a rename appear as a deletion. If the new feature is meant to replace sharing, follow its authorization and token flow as a distinct path. NIST's Secure Software Development Framework treats reviewing and testing changed software and responding to vulnerabilities as part of secure development; a closed ticket needs evidence from the changed version.
  4. Check the deployed boundary. Obtain the release artifact or deployment record that ties the assessed revision to the live environment. For authorized validation, use a controlled staging environment with synthetic accounts and a test owner. Confirm the request reaches the intended retired route and is denied for the expected reason, while the legitimate report workflow still works. A timeout, wrong host or failed login alone cannot show that feature retirement blocks a previously authorized caller. A clean source revision does not establish the state of an older instance, cached function or delayed worker.
  5. Resolve old artifacts. Decide what happens to previously created share tokens, queued jobs, exported files and links. Some artifacts may have their own expiry or retention obligations; code deletion does not revoke them. If a separate exposure remains, track it explicitly instead of hiding it inside a “fixed” label.
  6. Record the disposition and limits. Use fixed by removal only when the dangerous path is gone across the declared scope, with a new revision and deployment evidence. Use still exists if a path remains. Use inconclusive when route, worker, artifact or deployment evidence is missing. Preserve the original finding and what was checked so another reviewer can challenge the conclusion.

The decision is about the assessed version and scope. It is not a certificate that no related authorization bug exists anywhere in CedarBoard. OWASP's Web Security Testing Guide reporting chapter calls for findings and reports to explain the tested scope and limitations; a closure note benefits from the same discipline.

Separate removed creation from surviving use

Capability Before retirement Supplied state after B2/M4 Decision
Create through web/mobile Unsafe creation operation reachable. Routes absent in the mapped deployed artifact; old API instances drained. Creation path removed in this declared scope.
Renew from queued messages Renewal worker could extend tokens. B2 handler rejects the retired renewal message type; active worker binding still requested. Source removal supported; deployed renewal closure pending.
Use previously issued token Token delivery remains available until invalidation/expiry. Four migration partitions failed; their token validity is not established as revoked. Retained-token exposure remains open.
Create/use through partner host Separate routing exists. Partner artifact not supplied. Inconclusive for that host.

The owner has two real choices for the failed partitions: repair invalidation while delivery continues under an explicit residual-risk decision, or stop public token delivery until invalidation and retry handling are verified. In the exercise, operations chooses the second. It blocks the token-delivery endpoint, confirms the restriction covers the selected hosts, and preserves normal authenticated report viewing. Partner-host coverage remains unknown and receives its own immediate restriction/evidence task.

The completed note is:

CB-17 creation scope: fixed by removal for mapped B2 web/mobile entry points, subject to the supplied deployment and positive denial evidence. Retained artifacts: open; M4 has four failed partitions, and queued renewal handling awaits active-worker binding. Interim action: selected public-token delivery blocked; this is containment, not successful token revocation. Partner host: inconclusive until its route/artifact and restriction coverage are established. Next owner: platform repairs M4 and proves old renewal messages cannot recreate validity before delivery is restored.

If the original approved finding included creation and subsequent delivery, its overall state remains partial until both are resolved. If it covered creation only, close that exact scope and link retained-token risk rather than quietly expanding the old title. Either way, removal does not undo documents previously obtained through a public link or imply physical erasure of copies.

The useful artifact is this capability map. A count of deleted files or completed migration partitions cannot replace it: even one failed partition may retain the exact capability the retirement was meant to remove.

Define what cannot be restored by rollback

Feature retirement can be reversed accidentally if the release plan treats an older image as the default recovery option. In CedarBoard, rolling the API back to A1 could restore link creation even after M4 invalidated existing tokens. The retirement decision should therefore state which capabilities must remain unavailable during recovery and which compatible rollback artifact or configuration preserves that condition.

This is a planning question to resolve with the release owner, not a reason to avoid removal. Identify the old route, token-creation operation and renewal behavior that a rollback would revive. If the only available rollback reintroduces them, the owner needs a separate restriction or a safer recovery option before declaring retirement durable.

The four failed partitions also need an explicit completion record. A rerun that reports success should be tied to the original failure set and the intended token-validity change. Do not replace “96 of 100 completed” with “migration ran” and lose the unresolved population. The numbers are useful only when they identify which artifacts can still carry the retired capability.

For retained reports or links, distinguish continued storage from continued access. The business may retain a report for legitimate authenticated use while removing public-token access. The closure question concerns the unauthorized delivery capability, not whether every report byte was deleted. Keep retention and deletion work under their own policies and owners.

Before the final retirement message, compare the capability map with the operating recovery plan. The web route, worker, token state and partner host should each have a current result or a clearly linked open issue. That gives the next on-call engineer enough context to restore service without silently restoring the vulnerability.

Choose the right outcome when evidence conflicts

What you learn Decision Why
Every relevant entry path is removed or safely denied in the deployed version, and surviving artifacts are accounted for Fixed by removal for that version and scope Positive source and deployment evidence defeats the original harmful path.
A mobile client, worker or replacement endpoint still invokes the unsafe operation Still exists The UI change did not remove the behavior.
The source change is clear but rollout, old-token state or a dependent service is unknown Inconclusive The missing fact could change the verdict.
The old behavior is gone, but a new feature has a different authorization defect Close the old finding with evidence; open a separately verified finding for the new behavior Keep identities and histories accurate.

If a reviewer disagrees, ask for the exact path that supports or defeats the claim. Re-run the path analysis at the pinned new revision, and preserve both observations until a deployment or service owner resolves the missing fact. Do not use a scanner's failure to rediscover the issue as the sole closure evidence: the route may simply have been omitted from the scan.

For your next removal, start with the original attacker action and draw one map from every entry point to that action. Record the new revision, the deployed artifact and the evidence for each path. For the broader fix-verification method, continue with how to verify a vulnerability fix in a new commit. If only one path was removed, use the residual-risk communication template before telling stakeholders the issue is closed.