Testing
Retesting: why 'fixed' is not evidence until someone checks
The most common gap we find in an otherwise mature security programme is not a missing control. It is a folder of penetration test reports with no corresponding retest results, and a remediation tracker where every row says closed.

A finding is discovered, a ticket is raised, a developer changes some code, the ticket is closed. At no point in that sequence did anyone with attacker knowledge verify that the vulnerability is actually gone. That is not a hypothetical failure mode — in our experience a meaningful proportion of fixes verified during retesting are incomplete, and a smaller but real proportion introduce a new issue.
The three ways a fix fails
Fixed at the reported location only
The tester reported an authorisation flaw in the invoice export endpoint because that is where they found it. The same missing check exists on four other endpoints sharing the same controller pattern. The ticket said export endpoint, so the export endpoint was fixed.
This is the most common failure and it is structural: findings are reported as instances, and instances get fixed. A good report mitigates it by stating whether the finding is likely systemic, but the retest is what actually catches it.
Fixed in a way that can be bypassed
Input is now filtered — client-side. A parameter is now validated — but only on the primary code path, not the legacy one. A check was added — after the sensitive operation rather than before it. The fix is real, visible in the diff, and defeated in under a minute by someone who knows what they are doing.
Fixed, and something else broken
Tightening an authorisation check breaks a legitimate integration, so an exception is added for a service account. The exception is broader than the original flaw. This one is particularly insidious because the ticket genuinely was completed correctly, and the regression arrived a week later under operational pressure.
What a retest should actually cover
| Finding severity | Retest depth | Rationale |
|---|---|---|
| Critical | Full re-exploitation attempt, plus systemic search for the same pattern | Highest impact; systemic instances are likely |
| High | Full re-exploitation attempt | Impact justifies direct verification |
| Medium | Verification of the specific instance | Proportionate |
| Low / informational | Documentation review is usually sufficient | Effort is better spent elsewhere |
| Any finding marked risk accepted | No retest — but record the acceptance and its owner | Acceptance is a decision, not a fix |
Getting the timing right
Retest too early and you are verifying against an incomplete remediation programme, which wastes the engagement. Retest too late and the environment has moved far enough that findings and fixes no longer correspond cleanly.
- Agree a remediation window at the time of the original report — commonly 30 days for critical, 60 to 90 for high.
- Require the development or operations team to confirm in writing which findings they consider remediated, and which they are risk-accepting.
- Schedule the retest shortly after that confirmation date, not on a fixed calendar slot chosen months earlier.
- Retest only what was claimed as fixed. Findings still open do not need re-verification; they need a date.
- Issue a retest report that states, per finding, the original state, the claimed remediation, and the verified outcome.
The retest report is the compliance artefact
This is the part most organisations undervalue. The original test report shows that you found problems. The retest report shows that your process closes them — which is precisely what NIS2's effectiveness clause, DORA's remediation requirement and ISO 27001's vulnerability management control are asking about.
A retest report should be short and should contain, for each finding: the original identifier and severity, what the customer stated they changed, what the tester attempted, what was observed, and a verdict of resolved, partially resolved, not resolved, or risk accepted by the customer. Partially resolved is an important category and providers who lack it are rounding in an unhelpful direction.
Making it a process rather than an event
- Contract retesting at the same time as the original test. Mobilising a separate engagement later adds cost and delay, and is the reason most retests never happen.
- Import findings into your existing ticketing system with the stable identifiers from the report, so remediation status is visible where work actually happens.
- Treat systemic findings as a code review task, not a ticket. If an authorisation check is missing in one place, the useful action is a search across the codebase.
- Track time-to-remediate as a metric. It is more informative than finding counts, and it is the number a supervisory authority will ask for.
- Keep both reports together permanently. A test report without its retest is half an artefact.
Frequently asked questions
How much does a penetration test retest cost?
Typically 10–20% of the original engagement, because the tester already knows the environment and exactly what to attempt. Bundling it into the original contract avoids a separate mobilisation cost and is the main reason retests actually get done.
When should a retest be scheduled?
Shortly after the development or operations team confirms in writing which findings they consider remediated — not on a fixed calendar date chosen at contract time. Common remediation windows are 30 days for critical findings and 60 to 90 days for high.
Do compliance frameworks require retesting?
None of NIS2, DORA or ISO 27001 uses the word retest, but all three require that identified weaknesses are actually addressed and that measures are effective. A verified retest result is the standard way to evidence closure, and an unverified remediation ticket generally is not accepted as one.
Talk to the team
Need this tested rather than described?
QuietHours is a European cybersecurity practice operated by the securIT team. Send us the system, service, or control you are concerned about and we will help turn it into a workable scope.
Discuss your scope