Repository navigation
feat: Add VEX (Vulnerability Exploitability eXchange) Workflow #1220
Description
Activity
- addedenhancementNew feature or requestNew feature or requestsecuritySecurity-related changes or concernsSecurity-related changes or concernsneeds-triageRequires triage and prioritizationRequires triage and prioritization
on Mar 27, 2026 WilliamBerryiii commented
on Apr 21, 2026 MemberMore actionsDeep technical review: how to ship this with minimum human intervention
After auditing the existing CI/CD, security, release, and agentic surfaces, hve-core is not greenfield for VEX — roughly 80% of the plumbing already exists. What's missing is a VEX document, a VEX-aware scanner trigger, and a routing layer. This comment proposes an architecture that pushes everything except the merge click onto agents and machines.
Note: this is complementary to #1221 (the
vex-generatoragent). #1221 builds the tool; this issue builds the workflow that consumes it. Phase C below is exactly where #1221 lands.
1. What hve-core already has (the leverage)
Capability Where it lives What it gives us for VEX SPDX-JSON SBOMs per artifact + dependency-wide release-stable.yml(anchore/sbom-action@v0.24.0)Authoritative input for any vulnerability scanner Sigstore keyless attestation pipeline release-stable.ymlattest-and-uploadjob (actions/attest@v4.1.0,actions/attest-build-provenance@v4.1.0) withid-token: write+attestations: writeOne additional actions/atteststep + one extragh release uploadargument adds VEX with zero new infrastructuregh-awagentic workflow framework.github/workflows/*.md+.lock.ymlpairs,engine: copilot,safe-outputscapability gating,noopactivation guardsDrop-in pattern for vex-draft.mdandvex-triage.mdworkflowsIssue-triage agent precedent issue-triage.md,issue-implement.mdCanonical safe-outputs template for AI-drafted PRs with max:capsScheduled + post-release scanning cadence scorecard.yml(cron +workflow_run)Direct precedent for VEX rescan triggers Dependency change firehose dependabot.yml(weekly Mon, npm/github-actions/uv)Natural trigger source for "rescan VEX on dependency change" GitHub App auth RELEASE_APP_ID/RELEASE_APP_PRIVATE_KEYAlready-trusted identity for autonomous PR creation Practical implication: adding VEX to the existing
attest-and-uploadjob is a ~10-line YAML change — one extraactions/attest@v4.1.0step on the VEX file, one extragh release upload --clobberargument. The.sigstore.json+.intoto.jsonlpair drops out automatically.
2. The trust constraint, and why it doesn't block automation
CISA VEX requires an identifiable accountable author. OpenVEX's trust anchor is the Sigstore signing identity. Neither requires that a human drafted the document — only that a human (or accountable identity) attested it.
In the GitHub-native model:
- Drafter = AI agent (no trust requirement)
- Reviewer = CODEOWNERS-required human approver
- Author of record = merge commit author (the approver)
- Trust anchor = Sigstore identity of the release workflow
This means an agent can perform every step except clicking "Merge". That's the human-touch budget.
3. Proposed end-to-end flow
Trigger (3 sources, all autonomous): ├─ release-please tagging → vex-detect.yml runs against new SBOM ├─ Dependabot PR merged → vex-detect.yml runs against changed deps only └─ Weekly cron (Mon, post-Dependabot) → vex-detect.yml runs full scan │ ▼ vex-detect.yml (no AI) └─ OSV-Scanner (or Grype) against latest SBOM, emit JSON └─ Diff against current security/vex/hve-core.openvex.json └─ If new findings or status drift detected: dispatch vex-draft.md │ ▼ vex-draft.md (gh-aw, engine: copilot, agent: vex-triage) └─ For each new CVE: ├─ Fetch OSV.dev advisory (CC0 — license-clean, see §6) ├─ Reachability analysis on the codebase (codebase + search tools) ├─ Compute confidence score └─ Route per §4 confidence table └─ safe-outputs: create-pull-request (max: 1) with updated VEX + assessment report └─ PR template auto-populated with evidence, confidence, suggested status │ ▼ Human (only required step) └─ CODEOWNERS-required review on security/vex/** └─ Approve → squash-merge → merge commit author = accountable author │ ▼ release-stable.yml attest-and-upload (extended) └─ actions/attest@v4.1.0 on security/vex/hve-core.openvex.json └─ gh release upload hve-core.openvex.json + .sigstore.json + .intoto.jsonlSteady-state human touch: review and merge a small VEX PR. Estimated ~20 min/month at typical Dependabot volume.
4. Confidence-banded routing (the autonomy lever)
The agent must classify each finding into one of three confidence bands, with hard rules on what it's allowed to draft autonomously:
Confidence Reachability evidence Agent action Human action High — not_affected Vulnerable symbol provably unreachable (no import path, dead code, or guarded by mitigation) Draft not_affectedwithvulnerable_code_not_in_execute_pathjustification + code citationsApprove PR (skim evidence) High — affected Vulnerable symbol on a reachable execution path Draft affected+ link to remediation issueApprove PR + triage remediation Medium Symbol reachable in some configurations but ambiguous (feature flags, optional codepaths, runtime conditional) Draft under_investigation+ structured questions for human reviewerDecide final status, edit PR Low Cannot determine reachability (closed-source dep, dynamic dispatch, native code) Draft under_investigationonly — forbidden from draftingnot_affectedManual analysis, may downgrade Vendor-disputed OSV/NVD shows dispute or CVSS < 4.0 with no known exploit Draft not_affectedwithinline_mitigations_already_existonly when accompanied by code citationApprove PR Hard rule: the agent is forbidden from drafting
not_affectedat low confidence. Uncertain cases default tounder_investigation, which is safe and fully retractable in OpenVEX.
5. Mandatory human-touch surface (the non-negotiables)
Step Why a human Frequency Approve VEX PR Author-of-record requirement; Sigstore identity needs accountable approver Per Dependabot wave / per release Decide ambiguous reachability Agent forbidden from low-confidence not_affectedEdge cases only Override agent draft Human judgment on operational context the agent cannot infer Rare Initial CODEOWNERS + workflow PRs Bootstrap trust One-time Everything else — scanning, drafting, evidence collection, PR creation, attestation, upload, release-asset publication — is automated.
6. Licensing: use OSV.dev as the evidence source
Sidesteps the GHSA prose attribution problem entirely:
Source License Use for OSV.dev advisory data CC0 (public domain) Drafted summaries, references, affected ranges, severity NVD API 2.0 US Gov public domain CVSS vectors, CWE classification GitHub Advisory DB prose CC-BY-4.0 (attribution required) Avoid quoting; use only as a pointer OpenVEX
references[]URLs are facts, not copyrighted expression — safe to include from any source. Drafted prose should paraphrase OSV/NVD only.This pairs cleanly with #1221's "no MCP dependencies, fetch via REST" approach — same data sources, same licensing posture.
7. Revised rollout (3 phases, each independently shippable)
Phase A — Plumbing only, no AI (estimated half-day)
security/vex/hve-core.openvex.json(empty document with product identity)- CODEOWNERS entry:
/security/vex/ @microsoft/hve-core-security-leads .github/PULL_REQUEST_TEMPLATE/vex-triage.md- Extend
release-stable.yml attest-and-uploadto attest + upload the VEX file .github/instructions/security/vex-standards.instructions.md
Ship as a normal PR with no agentic dependencies. Closes the "we have no VEX document at all" gap immediately.
Phase B — Detection only, no AI drafting (estimated 1 day)
.github/workflows/vex-detect.yml(cron +workflow_runon release-stable + Dependabot merge)- OSV-Scanner against latest release SBOM
- On new findings, file a regular GitHub issue (no PR yet) with structured triage prompt
- Manual VEX edits during this phase, but with automated detection cadence
This proves the detection cadence and surfaces real-world signal volume before adding AI drafting.
Phase C — AI drafting via #1221 (estimated 2 days, depends on #1221 shipping)
.github/workflows/vex-draft.md(gh-aw wrapper that invokesvex-generatorfrom feat(agents): VEX Generation Agent — AI-Assisted Vulnerability Triage for Any Codebase #1221)- Confidence-routing rules from §4 enforced via
vex-triage.agent.mdinstructions safe-outputs: create-pull-requestwithmax: 1cap- PR template auto-populated with evidence + confidence + suggested status
- Forbidden-transitions list enforced in agent instructions
Phase C cannot ship until #1221 lands. Phase A and B can ship now and provide value independently.
8. Recommendation
- Treat feat: Add VEX (Vulnerability Exploitability eXchange) Workflow #1220 (this issue) as the workflow track and feat(agents): VEX Generation Agent — AI-Assisted Vulnerability Triage for Any Codebase #1221 as the tooling track. They are complementary, not redundant.
- Ship Phase A as a single PR this week — it's pure plumbing, no agent dependencies, and closes the immediate gap.
- Begin Phase B in parallel with feat(agents): VEX Generation Agent — AI-Assisted Vulnerability Triage for Any Codebase #1221's Phase 1 (core agent + skill).
- Phase C lights up automatically once feat(agents): VEX Generation Agent — AI-Assisted Vulnerability Triage for Any Codebase #1221 reaches
experimentalmaturity.
Open question for maintainers: confirm
microsoft/hve-core-security-leads(or equivalent) as the CODEOWNERS group forsecurity/vex/, and confirm the autonomy posture in §4 is acceptable for thenot_affectedforbidden-transition rule.
Cross-references: #1221 (VEX Generation Agent — provides the AI drafting capability for Phase C above).
- addedfeatureNew feature triggering minor version bumpNew feature triggering minor version bumpand removedneeds-triageRequires triage and prioritizationRequires triage and prioritization
on Jun 28, 2026 - added a commit that references this issue
on Jun 30, 2026 WilliamBerryiii commented
on Oct 10, 2026 MemberMore actionsThank you for proposing the VEX workflow. PR #2038 delivered the end-to-end capability, and the repository now contains the maintained OpenVEX document, release verification guidance, and VEX management workflow. We’re closing this as completed; please reopen it if a specific acceptance criterion is still unmet.
Issue Description
Proposal: Add VEX (Vulnerability Exploitability eXchange) Workflow
Overview
To complement our existing supply chain security practices (SBOM and build provenance attestations), introduce a VEX (Vulnerability Exploitability eXchange) document and process. VEX provides a machine-readable status for vulnerabilities in dependencies, dramatically improving signal-to-noise for downstream consumers and aligning HVE Core with modern supply chain standards.
Motivation
Affected,Not Affected,Fixed,Under Investigation) for CVEs, helping consumers prioritize real vulnerabilities, not theoretical ones.Current State
The release pipeline already produces and attests the following artifacts per release:
.spdx.json.sigstore.json.intoto.jsonlVEX would add a new row to this table as a natural extension.
VEX Workflow
VEX is not auto-generated — it requires human triage. The workflow is:
security/vex/hve-core.openvex.jsonwith a status entryImplementation Plan
Phase 1: Foundation
security/vex/hve-core.openvex.jsonopenvexto.cspell/general-technical.txtPhase 2: CI Integration
Phase 3: Release Pipeline
attest-and-uploadjob (in bothrelease-stable.ymlandrelease-prerelease.yml) to:.spdx.json,.sigstore.json, and.intoto.jsonlfilesSECURITY.mdto include the new.openvex.jsonsuffixappend-verification-notesjob to reference VEX in release notesPhase 4: Documentation
docs/security/vex-verification.md(parallel tosbom-verification.md) covering:not_affected,affected,fixed,under_investigation)docs/security/security-model.mdcontrol table with a new VEX control entrydocs/agents/sssc-planning/phase-reference.mdcapability tableProposed Repo Structure
Example VEX Statement
{ "@context": "https://openvex.dev/ns/v0.2.0", "@id": "https://github.com/microsoft/hve-core/security/vex/2026-03-27", "author": "Microsoft HVE Core Maintainers", "timestamp": "2026-03-27T00:00:00Z", "statements": [ { "vulnerability": { "@id": "https://nvd.nist.gov/vuln/detail/CVE-2026-XXXXX" }, "products": [ { "@id": "pkg:npm/@microsoft/hve-core" } ], "status": "not_affected", "justification": "vulnerable_code_not_in_execute_path", "impact_statement": "The affected parsing function is never invoked by HVE Core" } ] }References
attest-and-uploadjob in release-stable.ymlattest-and-uploadjob in release-prerelease.ymlAdditional Context
No response