BSides Melbourne · 2026

From XZ
to NPM

Why software supply chain attacks are succeeding,
and what security teams are missing.

The new normal.

Twelve days in March. Five open source projects compromised. Every one of them sits inside infrastructure you're probably running right now.

  1. Date Project What it is Blast radius
  2. 2026-03-19 Trivy Container scanner C2 hits in 12,000+ public repos
  3. 2026-03-23 Checkmarx KICS IaC scanner 5M+ Docker pulls
  4. 2026-03-24 LiteLLM AI gateway 95M downloads/month
  5. 2026-03-27 Telnyx SDK Telephony SDK 742K downloads/month
  6. 2026-03-31 Axios HTTP client for JS 100M downloads/week
Intro

Matt Crozier.

Lead DevSecOps / Cyber Security Consultant @ Sekuro.

Experience spans startups, enterprises, government, and critical infrastructure.

Background in platform engineering and network engineering.

Intro

Three things, 30 minutes.

  1. 01 Supply chain attacks 101 Overview of the modern software supply chain.
  2. 02 The TeamPCP case study A brief overview of a recent campaign targeting Trivy.
  3. 03 Five gaps I see every engagement And the controls that actually close them.
01

Supply chain
attacks 101.

What they are, and why they hurt so much.

Supply chain attacks 101

Visualising the modern
software supply chain.

Most orgs defend a slice, usually just the running app. Modern attacks land upstream in humans, pipelines and dependencies.

People
  • Internal developers
  • Upstream maintainers
  • Reviewers
  • Admins & ops
Source
  • Direct dependencies
  • Transitive dependencies
  • Lockfiles & manifests
  • Install scripts (postinstall, etc.)
SCM
  • Repo permissions
  • PRs & reviews
  • Branch protection
  • GitHub Apps / OAuth
CI / CD
  • GitHub Actions
  • Runners (hosted / self)
  • Third party actions
  • Secrets & PATs
Artefacts
  • Build binaries
  • Container images
  • Release archives
  • Provenance & signatures
Registries
  • npm / PyPI / Maven
  • GHCR / Docker Hub
  • Tag & version mutability
  • Publishing tokens
Runtime
  • Operating systems
  • Containers
  • App servers
  • APIs / IDPs
Edge & infra
  • CDN
  • Cloud services
  • DNS
  • Hostnames / certs
Supply chain attacks 101

From rare to routine.

Cumulative malicious open source packages tracked across npm, PyPI, Maven, NuGet, and Hugging Face.

1.5M 1M 500k 0 Cumulative packages 2023 2024 2025 Mar 2026 XZ Utils Shai-Hulud Axios
Sonatype 20261.35M cumulative · +22k in Q1 2026 alone
ReversingLabs 2026+73% YoY in malicious package detections
IBM X-Force 2026~4× rise in supply chain compromises since 2020
02

The TeamPCP
case study.

A brief overview of a recent campaign targeting Trivy.

The TeamPCP case study

The four steps. Trivy compromised.

STEP 01
Open PR
Pwn request: Fork PR against a vulnerable pull_request_target workflow.
STEP 02
Privileged exec
Attacker's fork code runs in the base repo's context, with the repo's secrets in scope.
STEP 03
PAT Exfil
Privileged PAT shipped to attacker C2. Now full write access to the org.
STEP 04
Tag rewrite
Force-push 75 of 76 trivy-action tags to malicious commits. Every consumer pinned to a version tag pulls the stealer on next CI run.
# .github/workflows/ci.yml
- uses: actions/checkout@v6
- name: Build an image from Dockerfile
  run: docker build -t docker.io/my-organization/my-app:${{ github.sha }} .
- name: Run Trivy vulnerability scanner
  uses: aquasecurity/trivy-action@v0.34.2 # rewritten for ~12h on Mar 19, 2026
  with:
    image-ref: 'docker.io/my-organization/my-app:${{ github.sha }}'
    severity: 'CRITICAL,HIGH'
The TeamPCP case study

Two PR triggers. One word apart.
Total opposites.

GitHub Actions has two ways to run a workflow when a PR is opened. They look almost identical. They behave nothing alike. GitHub now flags it.

✓ pull_request
  • Workflow runs from the fork's code
  • GITHUB_TOKEN is read only
  • No access to repo secrets
  • The default. Safe for any contributor.
✗ pull_request_target
  • Workflow runs in the base repo's context
  • GITHUB_TOKEN can have write permissions
  • Full access to every repo secret
  • Built for maintainer bots: labelling, comments, milestones
on:
  pull_request_target: # ← not pull_request
jobs:
  pre-merge-thing:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with: 
          ref: "${{ github.event.pull_request.head.sha }}" # fork code, full secrets
      - run: go run do_a_thing.go
03

Five gaps I see every engagement.

Recurring gaps across the orgs I work with,
and the controls that actually close them.

Five gaps I see every engagement

No one owns the bridge
between dev and security.

Most security teams have minimal, often zero presence in the SDLC, and when they do engage, it's far too late. Dev teams get handed generic, non prescriptive requirements that fail to translate into controls they can actually ship. The result: shouting across the gap.

← Security says
Dev says →
"We'll catch it in the pen test before release."
"Release is Friday. The pen test is booked for Q3."
"We need to threat model this."
"We threat modelled it in 2023. It's been refactored 40 times since."
"All devs need secure coding training."
"The course is 4 hours, from 2019, and the examples are in PHP."
"We have a secure SDLC."
"We have a Confluence page about a secure SDLC."
"Your code. Your vuln. Your fix."
"Your policy. Your process. Your escalation."
"Did security review the AI generated PRs?"
"Did security review the 200 human written ones from last month?"
Five gaps I see every engagement

Check your org.

If any of these sound familiar, nobody owns the bridge.

  • CI changes ship without security review.
  • “Security review” means “ask security the day before release.”
  • Your security team owns a SIEM, an EDR, a CSPM, a CNAPP, and an ASPM. They do not own a seat in sprint planning.
  • Your vulnerability dashboard has 14,000 open findings. Nobody has time to triage.
  • Penetration test findings get a Jira ticket. Jira tickets get a label. Labels get a dashboard. Dashboards get a screenshot in a board pack.
  • Your SOC can enumerate MITRE ATT&CK. Not one analyst has read a GitHub Actions workflow.
Five gaps I see every engagement

You can't secure
what you can't see.

70 to 90% of the average application is open source. Most orgs have no idea what's in production.

  • Generate SBOMs in CI. Every build, aggregated and queryable.
  • Run continuous SCA. Every push, against the locked graph, not just the manifest.
  • Watch maintainer health, not just CVEs. OpenSSF Scorecard, Socket, deps.dev.
  • Invest in a CNAPP. See which prod workload is running which dep, with context.
Five gaps I see every engagement

Non prod is often where
attackers land first.

Security teams pour budget into prod monitoring. Dev and staging often get nothing: no logging, no segmentation, sometimes direct connectivity to prod.

  • Network isolation first. Fastest to implement, hardest to work around.
  • Separate IAM per environment. No shared roles across dev, staging, prod.
  • Don't share data stores. Surprisingly common. Same RDS or Mongo across envs means a dev compromise reads prod data.
  • Avoid click ops dev environments. Same IaC patterns and guardrails as prod: log retention, region lockdowns, tagging.
  • Include non prod in your SIEM. You won't catch what you don't log.
Five gaps I see every engagement

Commit access is deploy access.

The same repos protecting the kingdom often let anyone with commit access push straight to main.

  • Enforce branch protection on main. No direct pushes, no force push, required PR, linear history.
  • Require reviewers, not your own. Minimum one approver, block self approval.
  • Use CODEOWNERS for sensitive paths. CI configs, IaC, release scripts, auth code.
  • Audit access quarterly. Rotate stale PATs, remove ex employees, downgrade over scoped tokens.
  • Require signed commits. gitsign beats PGP: keyless, OIDC backed, no long lived keys.
Five gaps I see every engagement

Insecure pipelines - the wild west of CI/CD

Review and pin every third party action or step in your CI/CD. If you're using composite actions, review the actions inside them too. Pinning the wrapper doesn't pin what it calls.

✗ Mutable tag
# whoever owns the tag owns your pipeline
- uses: actions/checkout@v4
Tag can be rewritten without your knowledge. This is the TeamPCP vector.
✓ Immutable SHA + pinned comment
# pin to full SHA, leave the version as a comment
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683  # v4.2.2
SHA can't be silently rewritten. The comment keeps Dependabot / reviewers sane.
  • Default GITHUB_TOKEN to read only. Repos created before 2023 still ship with write all. Grant write at the workflow level only where it's actually needed.
  • Use OIDC for cloud access. Short lived, workload scoped credentials issued per job. No long lived AWS/GCP keys sitting in repo secrets.
  • Allowlist actions at the org level. Restrict workflows to verified publishers and repos you've vetted, so a dev can't drop rando-org/action@main into a pipeline.
  • Ship secure CI/CD templates devs consume. Platform team owns the defaults (patterns, pinning, permissions, OIDC) and devs plug their job in instead of authoring yaml from scratch.
Five gaps I see every engagement

You don't have a runbook for this.

Teams drill ransomware, credential dumps, DDoS. Nobody drills "the npm package we depend on shipped malware overnight." Axios lands at 2am. The first hour gets burned figuring out who to wake up. Zero orgs I've worked with have rehearsed this scenario.

  • Build the runbook AND drill it. Decision tree: is it in our graph, what's the blast radius, what gets rotated, who calls impact. Tabletop it like you tabletop ransomware.
  • Name the team upfront. Sec? Platform? App team? Don't argue ownership at 2am.
  • Know your kill switches. Halt all CI, revoke every GITHUB_TOKEN, rotate cloud OIDC. Most teams can't, so builds keep pulling the backdoor for hours after disclosure.
  • Watch the right feeds. Socket, GHSA, OSV, your registry's advisories. If your first signal is a LinkedIn thread, you're already last.
Outro · Takeaways

Five gaps. A path forward.

  1. 01 Fund the bridge between dev and security A role with authority to block releases.
  2. 02 See all of your dependencies, aggregated and queryable SBOMs in CI. Continuous SCA. Maintainer health, not just CVEs.
  3. 03 Treat non prod like prod Network isolation. Separate IAM. No shared data stores.
  4. 04 Lock down git Branch protection. CODEOWNERS. Signed commits.
  5. 05 Review your pipelines! SHA pinned actions. OIDC. Allowlisted publishers. Secure templates.
  6. + Drill the IR runbook Supply chain attacks need their own scenario.
Outro · Resources

Want to learn more?

Start with opensourcemalware.com, an excellent source for the latest attacks and breakdowns.

  • SLSA. Supply-chain Levels for Software Artifacts. Framework for hardening the build pipeline. slsa.dev
  • OWASP Top 10. Baseline vocabulary for the whole org. owasp.org/Top10
  • GitHub Security Lab advisories. Attack write-ups and CVE research. securitylab.github.com
  • Socket. Live npm and PyPI malware feed. socket.dev
  • OpenSSF Scorecard and Best Practices. openssf.org
?
Questions
Matt Crozier  ·  BSides Melbourne 2026