OWASP SPVS

OWASP SPVS: Lessons from Securing the Software Pipeline

Verify the Whole Software Pipeline: The Friction, the Wins, and the Lessons from Adopting OWASP SPVS

The OWASP Secure Pipeline Verification Standard (SPVS) reached version 1.0 in October 2025. We decided to use the standard across our organization for the reasons explained below.

This post is an honest account of why we took it on, how we adapted it, what hurt, and what we would recommend to anyone walking the same road.

Why a Pipeline Standard, and Why Now

For years, attackers went after applications one at a time.

But their tactics have changed.

Why compromise one application when you can compromise the pipeline that builds many?

Sonatype tracked over 512,000 new malicious packages in 2024 alone, a 156% year-over-year increase. And each high-profile incident from the last few years hit a different link in the software delivery chain.

Incident What Happened
SolarWinds, 2020 Build-environment compromise. Backdoored updates were shipped to 18,000 customers.
Codecov, 2021 A misconfigured Docker image allowed attackers to modify a bash uploader script and exfiltrate CI secrets from more than 23,000 customers.
CircleCI, 2023 Session-cookie theft on an engineer’s laptop turned into access to production tokens. Every customer was told to rotate every secret.
XZ Utils backdoor, 2024 A multi-year social engineering campaign almost reached nearly every Linux distribution. Read more.
tj-actions, 2025 A GitHub Actions supply-chain cascade poisoned a component used by 23,000+ repositories. Read more.
Aqua Trivy and Checkmarx, 2026 The TeamPCP campaign turned two widely used security scanners into attack vectors, then used stolen CI/CD credentials to cascade downstream into npm, OpenVSX, and PyPI. Aqua Trivy / Checkmarx.

Each attack exploited a different part of the pipeline:

  • Build environments
  • CI tooling
  • Dependencies
  • Developer credentials
  • Maintainer trust
  • Mutable references to artifacts

Most organizations respond with point controls.

  • A scanner in CI
  • 2FA on the IdP
  • Branch protection on main

We did too.

What was missing was a way to ask:

Are we systematically covered?

Instead of:

Did we remember to enable X after the last incident?

Because application security vendors sit directly in the crosshairs, compromising one vendor can affect every customer that trusts its artifacts. For us, the pressure to move from reactive controls to systematic pipeline protection was not theoretical.

Then we got first-hand experience.

In March 2026, the xygeni-action GitHub Action compromise involved:

  • A compromised GitHub App private key
  • A poisoned mutable tag
  • A C2 implant disguised as telemetry

Branch protection rules and other technical controls did their work, but they were not enough.

Although the real customer impact was zero, reputational damage demands transparency and a structural response. We understood that, as a software security vendor, we needed a radical departure from point, ad-hoc controls toward systematic protection of our software pipelines.

That motivated us to adopt the OWASP SPVS standard as a top-priority project.

What SPVS Is, and Why the Structure Matters

The origin story is simple.

At LASCON 2023, Farshad Abasi and Cameron Walters kept asking each other the same question:

Where is the ASVS for pipelines?

OWASP ASVS had given application security a comprehensive, verifiable standard. Nothing equivalent existed for CI/CD.

There were useful frameworks and tools, but each covered only part of the problem:

Framework or Project Main Focus
OWASP Top 10 CI/CD Risks Awareness-oriented, not fully testable.
SLSA Build provenance.
S2C2F Secure dependency consumption.
OpenSSF Scorecard Repository-specific checks.

Each covered a piece.

None covered the whole.

That conversation became two years of work. In October 2025, the SPVS working group released v1.0:

  • 127 requirements
  • Covering the full lifecycle:
    • Plan
    • Develop
    • Integrate
    • Release
    • Operate
  • Organized into three maturity levels:
    • L1 Foundational
    • L2 Standard
    • L3 Advanced
  • Mapped to:
    • NIST SP 800-53
    • OWASP CI/CD Top 10
    • CWE
OWASP SPVS

The structure is the point.

As the SPVS authors explain:

Verify your entire pipeline, not just one piece. This is where most organizations struggle. They scan dependencies but ignore release governance. They sign artifacts but don’t threat model their pipeline architecture. They monitor production but not their build environments.

That was the thesis that justified the effort for us.

Strengths in one stage do not compensate for weaknesses in another. Attackers only need one link to break.

A lifecycle standard forces you to check all of them, and the L1 → L2 → L3 progression lets you do it without boiling the ocean.

SPVS does not replace SLSA, S2C2F, Scorecard, or Sigstore. It gives you the scaffolding that tells you where each of them fits.

Adapting the Standard to Our Organization

Our first step was a straight audit of our organization and software infrastructure against each requirement.

We captured the audit in a Google Sheet seeded from the official SPVS requirements CSV .

We used three main views:

  • Requirements matrix
    Status and owner per control.
  • Per-repository heatmap
    Visibility into repository-level gaps.
  • Dashboard by stage and level
    Progress across Plan, Develop, Integrate, Release, and Operate.

We also expanded our internal Technical Guidelines for Secure Software Pipelines to cover every stage from plan to operate.

We found that we were already largely at maturity level L2. That was reassuring, though not surprising for a company whose business is software supply-chain security.

That allowed the first phase to focus on closing specific gaps rather than building foundations from scratch.

But a spreadsheet is only a snapshot.

SPVS asks for more.

Some controls require recurring review:

SPVS Area Requirement Type
V1.1.7 Quarterly audit of VCS administrators.
V5.1.1–V5.1.3 Regular user audits, access-log review, and privileged-access monitoring.
V2.1.x, V3.3.x, V4.2.x Ongoing workflow YAML hygiene.

Run manually across the organization, this becomes a half-day of click-tracking every quarter, with a real risk of quiet omissions.

That kind of job either gets automated or is reviewed only after something bad has happened.

So we built xygeni-vcs-audit.

It is an in-house tool that runs under org-owner identity and produces a structured quarterly bundle covering:

  • Admin roster
  • Branch protection
  • CODEOWNERS coverage
  • Workflow YAML hygiene
  • Pinned actions
  • Explicit permissions
  • pull_request_target gating
  • Member 2FA
  • Installed GitHub Apps
  • Deploy keys

What used to be a half-day of spreadsheet archaeology is now a single command emitting JSON and Markdown.

The quarterly 30-minute review between the CISO and the organization administrators is now a decision meeting, not a data-gathering meeting.

Actionable findings become backlog issues with severity-based SLAs.

The tool is internal for now, but the pattern is simple: a weekend of scripting against the GitHub API can remove a lot of recurring manual work.

We also added an allow-list policy covering:

  • Approved admins
  • Approved apps
  • Permissions by function for repositories and workflows

This policy lives as YAML inside the tool’s own repository and is gated by PR review from our security team.

Any allowlist change leaves a review trail, so the audit evidence generates itself.

No SaaS.
No third-party rule pack.
No extra credential to manage.

The effect has been to turn aspirational controls into routine controls.

Instead of saying:

We should audit quarterly.

We can now say:

This quarter’s audit landed on Monday.

That gives us a repeatable mechanism for the drift detection that the end-to-end principle demands.

The Frictions We Did Not Plan For

Technical controls are the easy part.

People are harder.

The standout example was CODEOWNERS.

Adding this line on every repository sounds trivial:

.github/workflows/ @xygeni/security

One file.
One line.

But it meant engineers who had been self-merging workflow changes for years now needed a security review.

Even security-conscious people pushed back:

I wrote this workflow. I understand it. Why am I waiting?

It took real conversation to establish the why.

Workflows can:

  • Exfiltrate credentials
  • Redirect artifacts
  • Poison downstream consumers

A second pair of eyes is not distrust. It is the same logic as four-eyes review on production database changes.

The xygeni-action incident helped. Nothing crystallizes a control like a concrete example of what happens when that control is missing.

Other frictions followed the same pattern.

Friction What Happened
Explicit permissions: blocks Some workflows failed until contributors understood scoped permissions. It was a mental-model problem, not a permissions problem.
Tag immutability Release tooling broke because it had been silently retagging for years.
Signed commits Onboarding friction appeared until GPG or SSH keys were correctly set up across workstations.
PAT migration Replacing classic personal-access tokens across repositories and workflows touched almost every team.

We had used GPG-signed commits in our main repositories from the start. SPVS made it mandatory across every repository and contributor.

The pattern that worked was:

  • Introduce each control with the specific threat it blocks.
  • Pilot it on one or two repositories.
  • Roll it out with allowlisted exceptions.
  • Retire the exceptions on a timeline.

Interestingly, the engineers who pushed back hardest often became the strongest advocates once they understood the rationale.

There is also a deeper point.

The end-to-end principle bites here.

We could not pick and choose. Hardening the build stage while leaving release governance loose would have created false confidence, which is exactly the failure mode the SPVS authors warn about.

Every stage had to advance together, even when a specific control felt disproportionate in isolation.

Cost

Phase 1, focused on L2 compliance, took roughly one month of elapsed engineering time, spread thinly across:

  • DevOps
  • Security
  • Engineering reviewers

We are small enough to make that possible, but your mileage may vary.

The investment pays back easily. A single prevented supply-chain incident covers it many times over.

Mapping the Incident to SPVS v1.0

Mapping the xygeni-action incident onto SPVS v1.0 was instructive.

Incident Element SPVS Mapping
Over-permissioned GitHub App key V1.1.5, service-account over-permissioning review.
Lack of least privilege V1.1.3, least privilege.
Six-day detection gap V5.4.1 / V5.4.2, pipeline log generation and review.
Tag poisoning No clean mapping in SPVS v1.0.

The tag poisoning gap is important.

SPVS v1.0 has no explicit control for tag or release immutability, and no requirement for signed tags.

V3.4.1, signed artifacts, is the nearest neighbor. But signed artifacts help consumers detect tampering. They do not prevent a tag from being moved in the first place.

Tag immutability, and arguably required signed commits and signed tags, are natural candidates for future SPVS revisions.

What Is Next

SPVS v1.5 is on the horizon with AI-related controls, including:

  • Provenance of AI-assisted code
  • Guardrails for CI workflows that call LLMs
  • Review trails for AI-generated pull requests
  • Defenses against emerging threats like slopsquatting

Slopsquatting refers to attackers registering package names that AI coding assistants hallucinate.

We already tag Claude-assisted commits and PRs under our internal AI development guidelines, so this adaptation should be incremental rather than a new program of work.

Version 2.0 is expected to deepen:

  • Runtime monitoring
  • Credential lifecycle requirements

Our own roadmap is clear:

  • Close remaining L3 gaps by the end of Q2 2026
  • Integrate SLSA provenance into standard CI/CD
  • Add manual gates for production deployments
  • Centralize identity provider controls
  • Shift into maintenance mode

The goal is simple:

Every new repository starts compliant.
Every quarterly audit catches drift early.

A sincere thank-you to Farshad Abasi, Cameron Walters, and the OWASP SPVS working group.

Projects like this lower the bar for every organization that wants to approach software supply-chain security systematically rather than reactively.

Key Takeaways

OWASP SPVS

A few lessons translate beyond our specific context:

1. Start with the SPVS requirements CSV

Download the SPVS requirements CSV and map your current controls in a spreadsheet.

You will know within a day whether it fits your organization.

2. Pick one target level and ship it

L1 → L2 → L3 is a feature, not a limitation.

Do not try to do everything at once.

3. Treat the pipeline as the target

Application-centric controls are necessary, but not sufficient.

Your pipeline is now a first-class attack surface.

4. Verify the whole pipeline

Strong dependency scanning does not compensate for weak release governance or unmonitored build environments.

5. Automate drift detection

Spreadsheets are snapshots. Drift is continuous.

Even a modest in-house tool can make audits repeatable and actionable.

6. Budget for organizational work

The people side is harder than the technical side.

Explain the specific threat each control blocks, pilot before rollout, and give teams a path to adapt.

To Read More

About the Author

Co-Founder & CSRO

Luis Rodríguez is Co-Founder and Chief Security Research Officer at Xygeni Security. With 20+ years in application security, he focuses on AppSec protection and advanced code-analysis capabilities that help teams reduce real delivery risk.

sca-tools-software-composition-analysis-tools
Prioritize, remediate, and secure your software risks
7-day free trial
No credit card required

Secure your Software Development and Delivery

with Xygeni Product Suite