Skip to content
Remediation

How to read a penetration test report

A report arrives with severities attached and the temptation is to work down the list from the top. That is rarely the right order. This covers what a CVSS score does and does not tell you, what a good finding looks like, how to challenge one, and how to decide what actually gets fixed first.

9 min read

Key takeaways

  • A CVSS base score describes the intrinsic severity of a vulnerability, independent of your environment. It is not a measure of risk to your business and was never intended to be.
  • A finding you cannot reproduce from the report is an incomplete finding. Ask for the request, the response and the exact steps.
  • Severity ordering and remediation ordering are different lists. Reachability, exposure, data sensitivity and effort all change the order.
  • Challenging a finding is a normal part of the process. Bring evidence, not an assertion, and expect the tester to either withdraw it or explain why it stands.
  • Risk acceptance is a legitimate outcome when it is documented, owned by somebody named and given a review date. Undocumented, it is indistinguishable from having missed the issue.

What the report is for, and who is reading it

A penetration test report is asked to do at least three jobs at once, for readers with almost nothing in common. An engineer needs to reproduce and fix each issue. A manager needs to know how much work is coming and in what order. An auditor or a customer needs to know what was examined, by whom, and what happened to what was found. A single document that serves all three well is unusual, which is why the same engagement is better presented in different profiles for different audiences than compressed into one file.

Read the scope statement first, before any of the findings. It tells you what the rest of the document can honestly claim. A report with no critical findings against a scope that excluded the administrative interface is telling you something quite narrow, and the finding list is not where that shows up.

Then read the dates. Testing dates and report date are usually separate and often weeks apart. The testing date is the one that matters for anything time-bound, including the observation window on a SOC 2 examination.

What a good finding contains

The test of a finding is whether an engineer who was not on the call can reproduce it, understand why it matters and fix it, without asking anybody a question. Judge every finding you receive against that.

The parts of a finding, and what each one is for
ElementWhat it should tell you
TitleThe specific issue and where it is, not a vulnerability class. Broken access control on the invoice endpoint, rather than broken access control.
Affected componentThe exact endpoint, parameter, host or screen. A finding that says the application is not actionable.
DescriptionWhat the flaw is and why it exists, in enough detail that somebody can reason about whether it appears elsewhere too.
Reproduction stepsA sequence that works. Which account, which request, which value changed, what came back.
EvidenceThe raw request and response, or a screenshot, that demonstrates the issue. This is what separates a finding from an opinion.
ImpactWhat an attacker gains, expressed in terms of your system rather than in the abstract. Reading other customers invoices, not information disclosure.
Severity and CVSS vectorBoth. The vector shows the reasoning behind the score, so you can see which assumptions produced it.
Remediation guidanceSpecific to this finding. A link to a general reference page is a starting point, not guidance.

If several findings share a root cause, a good report says so, because fixing the cause is one piece of work and fixing eight symptoms is eight. Findings we publish carry the CVSS vector, the affected endpoints and the request and response pairs that prove them, which is what lets an engineer start work without a handover meeting.

CVSS: what the score does and does not tell you

CVSS is a scoring system maintained by FIRST. The base score, which is the number you almost always see, is calculated from the intrinsic characteristics of the vulnerability: how it is reached, how hard it is to exploit, what privileges and user interaction are needed, and what it costs in confidentiality, integrity and availability. It runs from 0.0 to 10.0 and is usually presented as a severity rating.

CVSS v3.1 qualitative severity ratings
RatingBase score range
None0.0
Low0.1 to 3.9
Medium4.0 to 6.9
High7.0 to 8.9
Critical9.0 to 10.0

The important point is one FIRST makes in its own guidance: CVSS measures severity, not risk. The base score is deliberately environment-independent, because it has to mean the same thing for a hospital and a games company. It knows nothing about whether the affected system holds your customer records or a copy of your marketing site, whether it is reachable from the internet, or whether a compensating control sits in front of it. Those are the questions that decide risk, and the base score is silent on all of them.

CVSS provides further metric groups for exactly this reason. Environmental metrics let you adjust a score for your own context, and threat metrics account for whether exploitation is actually being seen. Most reports quote the base score alone, so unless somebody has explicitly said otherwise, assume the number in front of you has had no knowledge of your environment applied to it. Version 4.0 of the standard restructures these groups and is being adopted gradually; version 3.1 remains what most tooling and most reports still use.

Read the vector, not just the number

A vector string such as AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H is the reasoning behind the score. It tells you the issue is reachable over the network, needs no privileges and needs no user interaction, which is far more useful for prioritisation than the word critical. Our platform computes the score from the vector on the server rather than taking a typed number, so the two cannot disagree.

Severity is not business risk

Two findings can share a score of 8.1 and deserve completely different responses. The one on the internet-facing service holding customer payment data is an emergency. The one on an internal tool reachable only from an administrator workstation, used by four people, is a scheduled piece of work. Nothing in the score distinguishes them, and a remediation plan built purely on severity ordering will spend its first week in the wrong place.

The factors the score cannot know

  • Reachability. Who can actually get to the affected component, and what they need in order to be there.
  • Data sensitivity. What is behind it, and what the consequence of losing it would be.
  • Compensating controls. Something in front of the flaw may already reduce what an attacker can do with it, though it rarely reduces it to nothing.
  • Exploitability in practice. A theoretically exploitable condition with no known technique is not the same as one with public tooling behind it.
  • Chaining. A medium that grants the foothold for a critical is not a medium in your environment. Good reports say when a finding is a step in a chain.
  • Business context. Regulatory exposure, contractual commitments and reputational consequence do not appear anywhere in a base score.

This is also why a report from a supplier who has never spoken to you tends to be less useful than one from a tester who understood what the system is for. The impact statement is where that understanding shows, and it is worth reading the impact of every finding even when you are triaging quickly.

False positives and challenging a finding

Manual testing produces far fewer false positives than automated tooling, because a tester confirms an issue by exploiting it before writing it up. Fewer is not none. There are three things people usually mean when they say a finding is wrong, and they need different responses.

  1. Genuinely incorrect. The behaviour described does not occur, or it occurs for a reason unrelated to what was concluded. Reproduce it, capture what you see, and send that back.
  2. Correct but not exploitable here. The condition is real, but a control the tester did not know about prevents it being used. Say what the control is and how it applies, because the tester may still be able to get past it.
  3. Correct and accepted. The finding stands and you have decided not to fix it. That is not a false positive, it is a risk acceptance, and it belongs in the next section.

Challenge with evidence rather than with assertion. A message saying we do not think this is exploitable moves nothing; a request and response showing the behaviour, or a configuration extract showing the control, gives the tester something to act on. A good supplier will either withdraw the finding, downgrade it with a note explaining what changed, or explain why it stands. All three are acceptable outcomes. What is not acceptable is silence, or a finding quietly disappearing between drafts with no record of why.

Have that conversation attached to the finding rather than in email, so the reasoning survives. On our engagements each finding carries its own discussion thread and an append-only history of every change, which means the question your engineer asked in March is still readable next to the finding in November.

Accepting risk, properly

Not everything gets fixed. A finding may sit in a component being decommissioned next quarter, or the fix may cost more than the exposure justifies, or the remediation may itself introduce a larger problem. Deciding not to act is a legitimate response and every standard that touches this expects it to be available. What separates an acceptance from negligence is entirely the record.

  • A named owner. Not a team, a person, and somebody senior enough to carry the decision.
  • The rationale, written for a reader who was not in the room and may be an auditor.
  • The compensating controls relied on, if any, and how they were verified.
  • A review date. An acceptance with no expiry becomes permanent by accident.
  • The date the decision was made and by whom, so the timeline is reconstructable.

Auditors do not object to accepted risk. They object to undocumented accepted risk, because from outside it looks exactly like a finding nobody looked at. The same applies to a customer reviewing your report during a security review: an acceptance with a clear rationale reads as a functioning process, while an open finding with no annotation reads as neglect.

How to prioritise the remediation list

Work through this order rather than straight down the severity column. It usually reorders the top ten substantially.

  1. Anything currently exploitable from the internet without credentials. Whatever its score, this is where an opportunistic attacker starts and it should be closed within days.
  2. Anything giving access to data belonging to somebody who is not the requesting user. Cross-tenant and cross-account access is the category that causes the most damage per finding, and it is usually cheap to fix once located.
  3. Anything that grants a foothold others depend on. Fixing the first step of a chain can close several findings at once, so read the report for chains before planning.
  4. Root causes shared by several findings. One change closing eight rows is better value than eight separate changes, and it is more likely to hold.
  5. High severity issues on internal or authenticated surfaces, ordered by who can actually reach them.
  6. Everything else, batched into normal engineering work rather than treated as an incident.
  7. Informational observations, which are for your backlog and for the next architectural decision rather than for this sprint.

Assign each item to the person who owns the code, not to a central security queue. Findings routed through a queue lose their context and sit. Where an outside contractor is doing the fix, they should be given the work without being given the estate: a membership can be narrowed to a single application, or an individual finding assigned so they see that and nothing else.

Then verify. A fix that was never checked by anybody outside the team that wrote it is an assertion, and several standards, PCI DSS 11.4.4 among them, expect verification rather than assertion. The PCI DSS guide covers that obligation in detail. Retests are included in our engagements, so a fix is ruled on by a tester rather than closed on trust.

What to give an auditor, and what to give an engineer

Sending the full technical report to everybody is the default and it is a poor one. It hands a customer a working exploit description for a system they do not operate, and it buries the two facts an auditor needs under sixty pages they will not read.

Which audience needs which version of the same engagement
AudienceWhat they needWhat to leave out
Your engineersEverything. Reproduction steps, raw requests and responses, affected endpoints, remediation guidance, and the chains between findings.Nothing.
Your leadershipThe risk position, how many findings at what severity, what is being done and by when, and what is being accepted and why.Technical detail, reproduction steps and vector strings.
Your auditor or assessorScope, dates, tester independence, methodology, findings with severities, and evidence of remediation and verification. Mapped to their framework where possible.Exploit detail beyond what evidences the finding.
A customer doing a security reviewAn executive summary: scope, dates, who tested, severity counts and current status. Under an agreement covering confidentiality.Reproduction steps and anything that would help somebody attack the system.
A contractor fixing one thingThe findings assigned to them and the application they affect.The rest of the engagement.

Generating each of those from the same engagement, rather than editing a PDF by hand, keeps them consistent and keeps them current after a retest changes the status of something. Ours produces comprehensive, executive and framework-mapped profiles in Word, PDF and Excel, described on the compliance reporting page. If the report you have was produced by a supplier who gave you one PDF and nothing else, the comparison between platform-delivered and traditional engagements explains what the difference is in practice.

FAQ

Questions this raises

What is a good CVSS score to worry about?

There is no threshold that works on its own, which is the point of the section above. As a starting rule, treat anything 9.0 or above as needing immediate attention and anything 7.0 or above as needing a plan within days, then adjust both directions using reachability, data sensitivity and whether the finding is a step in a chain. A 6.5 that hands an unauthenticated attacker a foothold outranks an 8.1 that requires administrative access already.

Our developers say a finding is a false positive. What now?

Ask them to reproduce the behaviour and capture what they see, then send that to the tester. Most disputes turn out to be one of two things: the tester used a different account or path than the developer tried, or a control exists that the tester did not know about. Both are resolved quickly with evidence and neither is resolved by an exchange of opinions. Expect the tester to withdraw, downgrade with a note, or explain why the finding stands.

How quickly should we fix a critical finding?

Most organisations set an internal standard, commonly days rather than weeks for anything exploitable from the internet without credentials. What matters more than the number is that the standard is written down, applied consistently and evidenced, because that is what an auditor is assessing. PCI DSS in particular expects correction to follow your own documented risk assessment process rather than a fixed external deadline.

Do we have to fix informational findings?

No, and treating them as a queue to be cleared wastes effort. They are observations worth knowing about: a version disclosure, a missing hardening measure, a design choice that limits your options later. Record them, and revisit them when the surrounding component is next changed. Some of them will become relevant when something else in the architecture moves.

Can we share the report with a customer?

Usually yes, and increasingly you will be asked to. Share an executive summary rather than the full technical report: it gives the scope, dates, tester, severity counts and current status without handing over a description of how to attack your system. Put it under whatever confidentiality agreement is in place, and check your engagement terms for anything about attribution or redistribution.

What does retest passed actually mean?

On our engagements it means a tester attempted the original issue again by hand and could not reproduce it, and recorded that verdict against the finding. It is deliberately distinct from fixed, which is what the client reports. The difference between somebody saying an issue is closed and somebody independent confirming it is the difference an auditor is looking for, and it is why both states exist rather than one.