Process

Retesting and fix verification

Published Updated 4 min read

The short answer

A retest re-runs the original attack against a fixed system to prove the vulnerability can no longer be exploited. It matters because fixes often fail: they patch one input but not another, treat the symptom instead of the cause, or break again in a later release. A finding should only be closed when the retest fails to reproduce it, and the evidence of that is what auditors and customers want to see.

Why do security fixes fail?

A fix that passes code review and unit tests can still leave the weakness exploitable. The common reasons are predictable:

Common reasons a vulnerability fix does not hold
Failure modeWhat it looks likeHow a retest catches it
Partial fixThe reported endpoint is fixed; a second endpoint with the same flaw is notTester checks sibling endpoints, parameters and versions
Symptom, not causeA filter blocks the exact input from the report; a small variation still worksTester tries variations of the original technique
Fix in the wrong layerThe button is hidden in the UI, but the API still accepts the requestTester calls the API directly, not just the interface
Variant pathsSame data reachable through export, search, a mobile API or an older API versionTester follows the impact, not only the original route
Not deployedFix merged but not released, or released to one region onlyRetest runs against the real, live target
RegressionA later refactor or dependency update reintroduces the flawPeriodic or continuous retesting of closed findings

Access control issues such as IDOR and BOLA are especially prone to partial fixes, because the same missing check is often repeated across many endpoints.

What does a proper retest check?

A retest is narrower than a full test, but it is not a checkbox. A good one covers four things:

  1. The original attack: the exact steps from the report, run against the current production system (or the agreed target environment).
  2. Close variations: different parameters, encodings, HTTP methods, roles and API versions that a narrow fix might miss.
  3. The impact path: if the original finding exposed invoices, can invoices still be reached by any other route?
  4. Side effects: did the fix break something else or introduce a new weakness, such as an overly broad error message?

Retesting is usually done by the same team that found the issue, because they know the context. Ask your vendor before signing whether a retest is included, how long after the report it can be scheduled, and whether it covers variations or only the literal steps.

When is a finding actually closed?

A finding has a lifecycle, and it helps to use the same states everywhere: in the report, your ticketing system and any customer-facing summary.

  • Open: reported, not yet fixed.
  • Fix ready for retest: your team believes it is fixed and deployed.
  • Verified fixed: a retest could not reproduce the issue. This is the only state that means closed.
  • Still vulnerable: the retest reproduced it, fully or partially. It goes back to the owner with new evidence.
  • Mitigated: exposure reduced by a compensating control (for example the feature is disabled) while a full fix is built.
  • Risk accepted: a named owner has decided not to fix, with a reason and a review date.

What evidence of closure do auditors want?

Compliance frameworks and customers increasingly want proof that findings were fixed, not just that a test happened. The Payment Card Industry Data Security Standard (PCI DSS) v4.0.1 is explicit: under requirement 11.4.4, exploitable vulnerabilities and security weaknesses found during penetration testing must be corrected according to the entity's risk ranking, and penetration testing repeated to verify the corrections. For SOC 2 and ISO/IEC 27001, the specifics depend on your controls, but auditors typically look for evidence that identified vulnerabilities are tracked to resolution. See penetration testing for compliance for more.

Useful closure evidence for each finding:

  • The original finding ID, severity and date reported.
  • The fix: a reference to the change or release, and the date it was deployed.
  • The retest date, who performed it, and what was tried.
  • The result, with evidence such as the request and the now-rejected response.
  • For mitigated or accepted items, the approver, the reason and the review date.

How do you measure whether remediation is working?

Mean time to remediate (the average time from report to verified fix) is the most common measure. Track it by severity, and measure to verified fixed, not to ticket closed, or the number will look better than reality.

Also watch the reopen rate: how often a retest finds a fix did not hold. A high rate usually points to root causes being skipped, such as authorization logic scattered across handlers instead of enforced in one place. That is a design conversation, not a bug-fixing one.

How do you stop fixed issues coming back?

A one-time retest proves a fix on the day it ran. Code keeps changing, so the same weakness can return months later. Three habits help:

  • Turn each verified finding into an automated test in your own pipeline where practical, such as an access control test that one user cannot read another's records.
  • Fix the class of bug, not the instance: shared authorization middleware, safe query builders, central output encoding.
  • Re-run past attacks periodically, either in the next scheduled test or through continuous penetration testing, which can re-check closed findings after each significant change.

How Brexa approaches this

Verify is the last stage of Brexa's method: after a fix ships, Brexa re-runs the exact attack, and a finding closes only when that attack fails. The one-time vulnerability assessment re-tests fixes before close, and continuous testing keeps re-checking as the system changes.

Frequently asked questions

How long after a penetration test should a retest happen?

As soon as fixes are deployed, ideally within the window your vendor includes in the engagement. Critical findings are often retested individually as soon as they are fixed rather than waiting for the whole batch.

Can our own team do the retest?

Your engineers should check their own fixes, but an independent retest by the testers who found the issue is stronger evidence and more likely to catch variations. Auditors generally prefer independent verification.

Is a retest the same as a new penetration test?

No. A retest checks specific findings and their close variations. A new test looks for new weaknesses across the scope, which matters after significant changes.

What if a fix is only partly effective?

The finding stays open, usually with updated evidence showing what still works. It is common for a finding to need two rounds before it is verified fixed.

Sources

  1. PCI Security Standards Council: Document Library (PCI DSS v4.0.1)
  2. NIST SP 800-115: Technical Guide to Information Security Testing and Assessment
  3. OWASP Web Security Testing Guide

Written and reviewed by the Brexa team. Educational information, not legal or compliance advice. See our editorial policy.

Find out what an attacker could do with your systems.

Book a short scoping call. Nothing is tested until scope and rules of engagement are signed, and every finding comes with proof.