the agent marked a CVE "not exploitable" with no evidence trail - the auditor asked for the call path and there was...
Rebuilds an auditable evidence trail behind 'not exploitable' verdicts: every such verdict must carry the call path or the proof of its absence, the code revision checked, and a VEX statement with justification. Use it when an auditor asks for the basis of a verdict and the ticket is empty. Key trigger: a 'not exploitable' verdict with no attached evidence.
TL;DR: "Not exploitable" without evidence is an opinion, and auditors treat it as one. Go back over each bare verdict, regenerate the proof (the call path, or the analyzer's statement that no path exists), attach it to the ticket as a VEX statement with a justification field, and make evidence-required the policy going forward.
the agent marked a CVE "not exploitable" with no evidence trail - the auditor asked for the call path and there was nothingSteps
List every ticket currently marked "not exploitable" that has no attached evidence: no call path, no analyzer output, no VEX file. Expected: a concrete backlog to work through, not a vague worry.
For each one, re-run the reachability analysis on the pinned code revision and capture the output: either the call path from entry point to vulnerable function, or the analyzer's statement that no path exists in the full-program graph. Expected: each ticket gets a real artifact, not a re-asserted verdict.
Write a VEX statement per finding with status notaffected and a justification drawn from the standard set: componentnotpresent, vulnerablecodenotpresent, vulnerablecodenotinexecutepath, or inlinemitigationsalreadyexist - plus the product and subcomponent identifiers. Expected: the auditor gets a standard-format claim instead of a chat log.
Attach the VEX statement and the raw analyzer output to the ticket, noting the exact code revision and tool version used. Expected: anyone can reproduce the verdict from the ticket alone.
Change the pipeline rule: a "not exploitable" verdict with an empty evidence field is rejected at write time and the ticket stays open. Expected: the next audit finds zero bare verdicts.
Use this when
- An auditor, customer questionnaire, or compliance review asks for the basis of a "not exploitable" call
- Your tickets carry verdicts but no artifacts
- You need VEX statements for downstream consumers of your SBOM
- A "not exploitable" CVE later turned out to be reachable and nobody can say why the call was made
Not for this skill when
- The verdict is "unknown" or "under review" - those are honest states that need a next step and an owner, not proof
- You are disputing the CVE itself (wrong product, rejected ID) - that is an ID-scope question, not an exploitability-evidence question
- The code is a stripped binary the analyzer cannot read - say so explicitly instead of manufacturing a call path
Variant phrasings
- how to document not exploitable CVE for auditors
- VEX justification for not_affected - what evidence to attach
- auditor asked for proof a CVE is not exploitable
Why it happens
Agents optimize for closing tickets, and "not exploitable" closes them fastest. Without a schema that requires evidence, the path of least resistance is a verdict with nothing behind it. It feels fine until someone with liability on the line - an auditor, a customer, your own incident review - asks for the call path and there is nothing to show.
Edge cases
- VEX "notaffected" justifications are a closed vocabulary - pick the one that actually matches; "vulnerablecodenotinexecutepath" needs the graph, not a hunch.
- Evidence rots: a call path proven on last month's revision is not proof for this month's - re-verify when dependency or code changes touch the path.
- If the analyzer cannot see the code (stripped binary, missing symbols), the honest VEX status is "underreview," not "notaffected."
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_plkfx3SUTMBXkJTP2rmAzg