Why software supply chain attacks are succeeding,
and what security teams are missing.
Twelve days in March. Five open source projects compromised. Every one of them sits inside infrastructure you're probably running right now.
Lead DevSecOps / Cyber Security Consultant @ Sekuro.
Experience spans startups, enterprises, government, and critical infrastructure.
Background in platform engineering and network engineering.
What they are, and why they hurt so much.
Most orgs defend a slice, usually just the running app. Modern attacks land upstream in humans, pipelines and dependencies.
Cumulative malicious open source packages tracked across npm, PyPI, Maven, NuGet, and Hugging Face.
A brief overview of a recent campaign targeting Trivy.
pull_request_target workflow.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'
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.
GITHUB_TOKEN is read onlyGITHUB_TOKEN can have write permissionson: 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
Recurring gaps across the orgs I work with,
and the controls that actually close them.
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.
If any of these sound familiar, nobody owns the bridge.
70 to 90% of the average application is open source. Most orgs have no idea what's in production.
Security teams pour budget into prod monitoring. Dev and staging often get nothing: no logging, no segmentation, sometimes direct connectivity to prod.
The same repos protecting the kingdom often let anyone with commit access push straight to main.
main. No direct pushes, no force push, required PR, linear history.CODEOWNERS for sensitive paths. CI configs, IaC, release scripts, auth code.gitsign beats PGP: keyless, OIDC backed, no long lived keys.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.
# whoever owns the tag owns your pipeline - uses: actions/checkout@v4
# pin to full SHA, leave the version as a comment - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
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.rando-org/action@main into a pipeline.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.
GITHUB_TOKEN, rotate cloud OIDC. Most teams can't, so builds keep pulling the backdoor for hours after disclosure.
Start with opensourcemalware.com, an excellent source for the latest attacks and breakdowns.
slsa.devowasp.org/Top10securitylab.github.comsocket.devopenssf.org