Safeguard
Application Security•

Turn Pen Test Findings Into Backlog Tickets Engineers Will Pick Up

A ticket template, a severity to priority table and a grouping method that turn a pen test PDF into work with owners, due dates and a verification step.

Safeguard Security Team
6 min read

When CISA issued BOD 26-04 on 10 June 2026, it set remediation clocks from four facts: whether the asset is publicly exposed, whether the CVE is in the KEV catalog, whether exploitation can be automated, and whether the impact is partial or total control. It also says the clock is measured in calendar days and starts at a defined trigger. A pen test report deserves the same treatment. A finding without a clock, an owner and a definition of done is a paragraph in a PDF.

This post is about the step after you read the report: getting each finding into the tracker in a form that engineers will pick up and that an auditor or customer can follow later.

What's affected

Every team that has received a penetration test report and now holds a list of findings with a severity label each. The same method works for DAST output and internal reviews.

How to check if you're exposed

Open your tracker and look at the last test's findings. You have a problem if any of these are true:

  • Findings live only in the PDF or a spreadsheet.
  • A ticket says "fix XSS" with no URL, parameter or request.
  • Nobody is named as owner, or the owner is "security".
  • There is no due date, or the due date was set by the vendor's severity alone.
  • Closed tickets have no proof that the fix was verified.

What to do now

  1. Make one ticket per root cause, not per instance. Five endpoints that skip the same authorization check are one ticket with five affected URLs. Ten reflected cross-site scripting findings caused by one missing output encoder are one ticket. Link each ticket to the report ID of every finding it covers.
  2. Keep the report's rating and add your own. The FIRST CVSS 4.0 specification (version 1.2, 18 June 2024) maps scores to None, Low (0.1 to 3.9), Medium (4.0 to 6.9), High (7.0 to 8.9) and Critical (9.0 to 10.0). It also asks that the nomenclature (CVSS-B, CVSS-BT, CVSS-BE, CVSS-BTE) be shown wherever a score appears. Record the vendor's score as given, then record your own priority after you consider exposure and data.
  3. Set priority from exposure and impact. Use the table below as a starting point and write it into your policy.
  4. Use a fixed ticket template. Copy the one below into your tracker.
  5. Name an owner and a due date at creation. The owner is the engineering team that owns the code, not the security team. The due date comes from your remediation policy.
  6. Add a verification step. The definition of done is not "merged". It is "retested by the vendor, or by a named internal reviewer with a test case that now fails safely".
  7. Open a short triage meeting within a week of the report. Thirty minutes, one engineering lead per affected service, one person from security. Leave with every ticket owned and dated.
  8. Track exceptions as tickets too. If a fix is deferred, record who accepted the risk, the compensating control and the review date.

Severity to priority

Report severityReachable from the internet?Suggested handling
CriticalYesDrop other work, fix or mitigate within days, notify leadership
CriticalNo (internal only)Next sprint, mitigate sooner if the data is sensitive
HighYesCurrent sprint, owner named in triage
HighNoNext one or two sprints
MediumEitherPlanned backlog, due date from policy
Low and informationalEitherBatch into hardening work, close with a note if you accept the risk

The numbers here are a starting point. Your policy and your customers' contracts set the real limits, so write them down once and apply them consistently.

Ticket template

Title: [Service] Short description of the weakness (report ID PT-07)
Severity (vendor): High, CVSS-B 8.1
Priority (ours): P1, internet-facing, customer data
Affected: POST /api/v2/invoices/{id}, GET /api/v2/invoices/{id}/pdf
CWE: CWE-639
Report finding IDs: PT-07, PT-09
Reproduction: steps and requests from the report, attached
Expected fix: authorize the invoice against the caller's tenant on every route
Owner: billing-api team, named engineer
Due: date from policy
Verification: vendor retest, or test case added to CI that fails if tenant A reads tenant B
Status history: opened, in progress, fixed, verified, closed

That ticket names CWE-639, broken object level access, which is the usual reason two different routes belong in one ticket.

How to avoid this trap

  • Ask the vendor for findings in a CSV or JSON export in addition to the PDF, so tickets can be created in bulk without retyping.
  • Put the report's finding ID in every ticket title. That is the thread an auditor follows from report to fix.
  • Add a regression test for each fixed finding. A fix that is not tested tends to come back in the next refactor.
  • Do not let the vendor's severity be the only input. They rarely know which of your services are internet-facing or hold the most sensitive data.

Why it matters

Reports are written for the reader who wants to understand risk. Tickets are written for the person who must change code on Thursday. The translation is where most remediation programs slow down.

BOD 26-04 is useful here even if you are not a federal agency. It shows a rule that ties urgency to facts about the asset, not to a label alone. Exposure and data sensitivity belong in your own scheme, and your tracker should record the reasons for each priority so the decision can be explained later.

Try it yourself

Take the three most severe findings from your last report. For each one, write the ticket using the template above and set a priority from the table. Then ask: if the engineer who picks it up never read the PDF, could they fix it from the ticket alone?

Click through it at your own pace, or open it full screen.

Quick check

Why combine findings that share a root cause into one ticket?

One code change fixes them all, and one verification covers them. Separate tickets split the work and let some instances stay open by accident.

What should "done" mean for a pen test finding?

Done means verified, either by the vendor's retest or by a named reviewer with a test that proves the weakness is gone. Merged code alone is not proof.

Who should own a ticket?

The engineering team that owns the affected code, with a named engineer. Security supports and verifies.

Sources

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.