Tahr Verify Security Fix
Verify the failed security control and the attacker outcome, not merely the
presence of a patch. Preserve the original finding, proof, context, and scope so
a different identity, tenant, route, payload, deployment, or render path cannot
produce a false pass.
Establish retest authority and safety
- Record the original finding ID, exact claim, required proof, original
positive evidence, affected revision, fix revision, and supplied patch.
- Record the original actor/role, owner/tenant/object, endpoint or workflow,
method/content type, payload class, state, configuration, render/trigger
context, and final impact.
- Default to source and test inspection. Exercise only an explicitly
authorized local or staging target. Do not infer permission for production,
third-party, destructive, credential-changing, billing, or broad data tests.
- Use disposable accounts and fixtures. Preserve protected identities and
extract only the minimum proof sample.
- Redact passwords, cookies, bearer/session tokens, API keys, private keys,
reset codes, personal data, and customer data. Retain only type, location,
and hash/fingerprint when necessary.
Read exact-context-retest-verdicts.md
and create separate candidate, proof, and coverage records before testing.
Inspect the remediation
Trace the original source-to-sink or missing-control path through current code.
Identify:
- the exact failed control and where the patch now enforces it;
- existing project policy, ownership/tenant scope, validator, sanitizer,
encoder, parameter binding, allowlist, network guard, or safe API reused;
- adjacent route, resolver, service, repository, serializer, worker, webhook,
content type, method, redirect, or render path that may bypass the fix;
- public behavior, auth semantics, tenant rules, response shape, data
invariants, and framework lifecycle that must remain compatible.
Search for a concrete contradiction to the fix claim. A new helper, regex, test,
or guard name is not proof that the effective path uses it.
Retest in the exact context
- Reproduce the original benign baseline.
- Replay the original exploit or closest safe equivalent using the original
actor, ownership/tenant relation, route, content type, state, and trigger.
- Confirm the expected denial, encoding, validation, scoped result, blocked
network/file action, safe query, or non-execution result.
- Read back durable state or observe the final sink. Do not stop at the first
accepting or rejecting layer.
- Run a positive control proving the legitimate owner, tenant, role, input, or
workflow still succeeds.
- Run class-relevant alternate encodings, methods, content types, object IDs,
roles, tenant relationships, render contexts, redirects, or concurrency
variants within the safe budget.
- Test sibling paths that share the changed control.
Use fresh, identity-matched sessions and prove object/tenant ownership for
authorization retests. A 200, body-size change, reflection, upload acceptance,
tool success flag, timeout, stale session, or WAF response is not a retest
verdict by itself.
Assign an exact verdict
Assign one verdict from the reference contract:
FIX_VERIFIED;
FIX_PARTIAL;
NOT_FIXED;
REGRESSION_INTRODUCED;
INCONCLUSIVE.
Support it with finding-local positive evidence, negative evidence, controls
tested, contradiction result, exact-context match, variants, limitations, and
final basis. Tooling or environment failure alone requires INCONCLUSIVE, not
a pass or failure.
Remediate securely when authorized
If the user asks only for verification, report the defect and do not edit. If
the user also asks to fix it, read
remediation-and-regression-gates.md
and:
- Localize only real repository files, symbols, routes, controls, and tests.
- Repair the failed control at the smallest correct shared layer.
- Reuse established project security primitives before creating parallel
logic.
- Avoid blacklist/regex-only fixes when parameterized, encoded, scoped,
schema-validated, or allowlisted APIs exist.
- Preserve public behavior except for the intentional rejection of the
vulnerable action.
- Add a regression test that fails on the vulnerable behavior and a positive
control for legitimate behavior.
- Run focused tests first, then feasible lint, type, build, integration, and
broader tests.
- Review the final diff for adjacent bypasses, superficial controls, generated
edits, unrelated churn, secret leakage, and compatibility breaks.
Do not mark the fix ready because a test was added; confirm the test reaches
the original sink or protected action and fails without the effective control.
Account for coverage and conclude
Account for the original path, every material alternate path, sibling consumer,
security-relevant variant, required negative control, legitimate positive
control, and test command. Give unresolved high-risk rows an exact blocker and
owner.
Do not issue FIX_VERIFIED, “ready,” or a clean conclusion while an original
proof element is missing, the exact context was not reproduced, a high-risk
bypass path is unreviewed, required tests did not run, or a material regression
remains. Use FIX_PARTIAL, REGRESSION_INTRODUCED, or INCONCLUSIVE and state
the next evidence needed.
1---2name: tahr-verify-security-fix3description: Retest a security fix in the exact vulnerable context, decide whether the exploit path is closed, and validate secure remediation and regression coverage without breaking legitimate behavior. Use after a vulnerability patch, remediation commit, PR fix, dependency or configuration change, failed security retest, or when developers need proof that a fix is complete rather than a superficial code change.4---56# Tahr Verify Security Fix78Verify the failed security control and the attacker outcome, not merely the9presence of a patch. Preserve the original finding, proof, context, and scope so10a different identity, tenant, route, payload, deployment, or render path cannot11produce a false pass.1213## Establish retest authority and safety14151. Record the original finding ID, exact claim, required proof, original16 positive evidence, affected revision, fix revision, and supplied patch.172. Record the original actor/role, owner/tenant/object, endpoint or workflow,18 method/content type, payload class, state, configuration, render/trigger19 context, and final impact.203. Default to source and test inspection. Exercise only an explicitly21 authorized local or staging target. Do not infer permission for production,22 third-party, destructive, credential-changing, billing, or broad data tests.234. Use disposable accounts and fixtures. Preserve protected identities and24 extract only the minimum proof sample.255. Redact passwords, cookies, bearer/session tokens, API keys, private keys,26 reset codes, personal data, and customer data. Retain only type, location,27 and hash/fingerprint when necessary.2829Read [exact-context-retest-verdicts.md](references/exact-context-retest-verdicts.md)30and create separate candidate, proof, and coverage records before testing.3132## Inspect the remediation3334Trace the original source-to-sink or missing-control path through current code.35Identify:3637- the exact failed control and where the patch now enforces it;38- existing project policy, ownership/tenant scope, validator, sanitizer,39 encoder, parameter binding, allowlist, network guard, or safe API reused;40- adjacent route, resolver, service, repository, serializer, worker, webhook,41 content type, method, redirect, or render path that may bypass the fix;42- public behavior, auth semantics, tenant rules, response shape, data43 invariants, and framework lifecycle that must remain compatible.4445Search for a concrete contradiction to the fix claim. A new helper, regex, test,46or guard name is not proof that the effective path uses it.4748## Retest in the exact context49501. Reproduce the original benign baseline.512. Replay the original exploit or closest safe equivalent using the original52 actor, ownership/tenant relation, route, content type, state, and trigger.533. Confirm the expected denial, encoding, validation, scoped result, blocked54 network/file action, safe query, or non-execution result.554. Read back durable state or observe the final sink. Do not stop at the first56 accepting or rejecting layer.575. Run a positive control proving the legitimate owner, tenant, role, input, or58 workflow still succeeds.596. Run class-relevant alternate encodings, methods, content types, object IDs,60 roles, tenant relationships, render contexts, redirects, or concurrency61 variants within the safe budget.627. Test sibling paths that share the changed control.6364Use fresh, identity-matched sessions and prove object/tenant ownership for65authorization retests. A `200`, body-size change, reflection, upload acceptance,66tool success flag, timeout, stale session, or WAF response is not a retest67verdict by itself.6869## Assign an exact verdict7071Assign one verdict from the reference contract:7273- `FIX_VERIFIED`;74- `FIX_PARTIAL`;75- `NOT_FIXED`;76- `REGRESSION_INTRODUCED`;77- `INCONCLUSIVE`.7879Support it with finding-local positive evidence, negative evidence, controls80tested, contradiction result, exact-context match, variants, limitations, and81final basis. Tooling or environment failure alone requires `INCONCLUSIVE`, not82a pass or failure.8384## Remediate securely when authorized8586If the user asks only for verification, report the defect and do not edit. If87the user also asks to fix it, read88[remediation-and-regression-gates.md](references/remediation-and-regression-gates.md)89and:90911. Localize only real repository files, symbols, routes, controls, and tests.922. Repair the failed control at the smallest correct shared layer.933. Reuse established project security primitives before creating parallel94 logic.954. Avoid blacklist/regex-only fixes when parameterized, encoded, scoped,96 schema-validated, or allowlisted APIs exist.975. Preserve public behavior except for the intentional rejection of the98 vulnerable action.996. Add a regression test that fails on the vulnerable behavior and a positive100 control for legitimate behavior.1017. Run focused tests first, then feasible lint, type, build, integration, and102 broader tests.1038. Review the final diff for adjacent bypasses, superficial controls, generated104 edits, unrelated churn, secret leakage, and compatibility breaks.105106Do not mark the fix ready because a test was added; confirm the test reaches107the original sink or protected action and fails without the effective control.108109## Account for coverage and conclude110111Account for the original path, every material alternate path, sibling consumer,112security-relevant variant, required negative control, legitimate positive113control, and test command. Give unresolved high-risk rows an exact blocker and114owner.115116Do not issue `FIX_VERIFIED`, “ready,” or a clean conclusion while an original117proof element is missing, the exact context was not reproduced, a high-risk118bypass path is unreviewed, required tests did not run, or a material regression119remains. Use `FIX_PARTIAL`, `REGRESSION_INTRODUCED`, or `INCONCLUSIVE` and state120the next evidence needed.