9 Software Supply Chain Risks Every Engineering Team Should Know

Udi Doron
Udi Doron
Jul 23, 2026 | 12 Minutes
9 Software Supply Chain Risks Every Engineering Team Should Know

Key Takeaways

  • The software supply chain is the attack surface most teams don't actively defend — open source dependencies, build tools, CI/CD pipelines, and third-party base images all represent implicit trust decisions that attackers exploit deliberately and patiently.
  • Supply chain attacks succeed because they move through trusted channels — compromised packages, backdoored build systems, and malicious maintainers bypass perimeter security and endpoint controls entirely, arriving as legitimate, signed artifacts.
  • Most exposure is reducible without a complete workflow overhaul — dependency pinning, artifact signing, pipeline hardening, and secure base images address the highest-impact risks with changes that fit inside existing engineering processes.

Why the Software Supply Chain Is the Attack Surface Engineering Teams Most Underestimate

Modern software is mostly assembled, not written. The average production application contains hundreds of direct and transitive open source dependencies, runs on build infrastructure maintained by third parties, pulls base images from public registries, and deploys through CI/CD pipelines that have broad access to production environments. The code your team writes is often a small fraction of the total software surface area that ships to customers.

Every component your application depends on represents an implicit trust decision. When a developer runs npm install, they're trusting that the packages resolved by the registry are what they claim to be, maintained by who they claim to be, and haven't been modified since they were published. Most of the time, that trust is warranted. When it isn't, the consequences propagate downstream to every system that consumed the compromised component.

This is what makes software supply chain risks qualitatively different from application vulnerabilities. An application vulnerability is a flaw in code your team controls. A supply chain attack is a flaw introduced through code your team trusted but didn't write, didn't review, and may not even know exists in your dependency tree. Perimeter security, WAFs, and endpoint controls have nothing to offer here — the attack arrives as a legitimate dependency update, a valid container image pull, or a signed build artifact.

The SolarWinds, XZ Utils, and 3CX supply chain attacks were not anomalies. They were demonstrations of a structural problem that affects every team building on open source infrastructure — which is nearly every engineering team operating today.

The Categories of Risk Hiding Inside the Software Supply Chain

Before mapping specific risks, it helps to understand the distinct threat categories they fall into. Software supply chain risks cluster around four areas:

Dependency risk covers the open source packages, libraries, and frameworks your application consumes — both direct dependencies you've explicitly chosen and the transitive dependencies they pull in. Risks here include malicious packages, abandoned maintainers, compromised accounts, and version confusion attacks.

Build system risk covers the infrastructure that compiles, packages, and signs your software — CI/CD pipelines, build servers, artifact repositories, and the credentials that move artifacts between them. Risks here include pipeline compromise, credential theft, and build output tampering.

Distribution risk covers the channels through which software moves from build to deployment — container registries, package repositories, software update mechanisms, and delivery infrastructure. Risks here include registry compromise, artifact substitution, and update mechanism hijacking.

Base layer risk covers the foundational components that application code runs on top of — operating system packages, cryptographic libraries, container base images, and runtime environments. Risks here include inherited vulnerabilities, unpatched libraries, and unverified image provenance.

The nine risks below span all four categories.

9 Software Supply Chain Risks Every Engineering Team Should Know

1. Compromised Open Source Packages

Attackers gain control of a legitimate, widely used open source package — either by compromising the maintainer's credentials, inheriting an abandoned project, or executing a long-term social engineering campaign to gain commit access — and insert malicious code into a new version. Downstream consumers update to the latest version through normal dependency management and inherit the compromise without any indication that something is wrong.

The XZ Utils backdoor is the most studied recent example. A patient, two-year social engineering campaign inserted a malicious maintainer into a project that shipped in major Linux distributions. The compromise was caught early, but the structural vulnerability it exploited — the reliance on trust in maintainer identity rather than verified build integrity — remains pervasive.

2. Dependency Confusion Attacks

A dependency confusion attack exploits the way package managers resolve internal versus public packages. When an organization uses an internal package with the same name as a public one, some package manager configurations will preferentially resolve the public registry version — even if the internal version is explicitly specified. An attacker publishes a malicious package to a public registry under the same name as a known internal package, at a higher version number, and waits for affected systems to pull it automatically.

Alex Birsan's 2021 research demonstrated this against major technology companies including Apple, Microsoft, and Netflix, achieving remote code execution in internal systems without any traditional vulnerability exploitation.

3. Typosquatting Attacks

Typosquatting is simpler than dependency confusion but consistently effective. An attacker publishes a malicious package to a public registry under a name that closely resembles a popular legitimate package — reqeusts instead of requests, colourama instead of colorama. Developers who mistype a package name during installation, or copy from documentation with a subtle error, install the malicious package instead of the intended one.

Typosquatting attacks have been discovered across npm, PyPI, and RubyGems. The payload varies: credential harvesting, environment variable exfiltration, and backdoor installation have all been documented in discovered typosquatting campaigns.

4. Malicious CI/CD Pipeline Actions and Plugins

CI/CD pipelines are high-privilege environments with access to source code, secrets, signing keys, and production deployment credentials. Third-party pipeline actions, plugins, and integrations — pulled directly from public marketplaces like the GitHub Actions marketplace — run in that privileged context with whatever permissions the pipeline configuration grants them.

A compromised or malicious GitHub Action that exfiltrates GITHUB_TOKEN or AWS credentials has access to everything those credentials can reach. CI/CD pipeline security failures in this category have resulted in source code theft, secret exfiltration, and production environment compromise across multiple documented incidents. Pinning actions to specific commit hashes rather than mutable version tags is the primary control — but most pipelines don't enforce it.

5. Compromised Build Infrastructure

The build system itself is a high-value target. An attacker who gains access to the build server, the artifact signing key, or the pipeline configuration can modify build outputs after source code review has completed and sign the tampered artifact with a legitimate key. Consumers have no way to detect the modification from the signed artifact alone — provenance attestation that records the build inputs and build system identity is the control that catches this, but most build pipelines don't generate it.

SolarWinds demonstrated this at scale. The Orion build system was compromised and malicious code was injected into the build process after source code review, signed with a legitimate certificate, and distributed to approximately 18,000 customers through an official software update channel.

6. Vulnerable or Unpatched Base Images

Every containerized application inherits the vulnerabilities present in its base image. Public Docker images on Docker Hub frequently ship with dozens of known CVEs in base OS packages, cryptographic libraries, and runtime components. Teams that pull directly from public registries without vetting or hardening those base images start every deployment with an inherited vulnerability load that has nothing to do with their application code.

The problem compounds over time. An image that was clean on the day it was first pulled accumulates vulnerabilities as new CVEs are disclosed against its component packages. Without a mechanism to continuously rebuild against patched packages, the vulnerability count in a running container grows passively with every new disclosure.

For a detailed breakdown of how base image vulnerabilities propagate into production workloads, our post on protecting against supply chain attacks covers the full attack surface.

7. Unverified Third-Party Integrations

SaaS tools, SDKs, analytics libraries, and third-party integrations that run in application context have access to the same data and environment as the application itself. A compromised analytics SDK that ships in a mobile or web application has access to user inputs, session data, and API responses. A compromised logging library running in a backend service has access to request payloads and environment variables.

The Polyfill.io compromise in 2024 illustrated this: a widely used JavaScript polyfill service was acquired by a new owner who modified the served script to redirect users to malicious sites. Thousands of websites that included the polyfill via CDN were affected without any change to their own codebase.

8. Credential and Secret Exposure in the Pipeline

CI/CD pipelines handle secrets — API keys, signing certificates, cloud credentials, deployment tokens — that have broad access to production environments. Secrets hardcoded in pipeline configuration files, committed to repositories in .env files, or exposed through overly permissive environment variable access are a persistent supply chain risk category.

Compromised pipeline credentials don't just affect one build — they give attackers ongoing access to every environment those credentials can reach, often without triggering any anomaly detection because the access pattern looks like normal pipeline activity.

9. Abandoned or Undermaintained Dependencies

Not every supply chain risk involves an active attacker. Abandoned open source dependencies — packages that are no longer actively maintained, where known vulnerabilities accumulate without patches — create passive exposure that grows over time. When a critical CVE is disclosed in an unmaintained package, there is no patch to apply. Teams are left choosing between maintaining a fork, finding a replacement, or accepting the risk.

Transitive dependencies amplify this problem significantly. A direct dependency your team chose and monitors may itself depend on three packages that haven't had a commit in four years. That exposure exists in your application whether or not your team is aware of it.

What Attackers Target First When Supply Chain Controls Are Weak

When supply chain security posture is immature, certain entry points are consistently prioritized by attackers because they offer high-value access with low detection probability:

Package registries with weak account security. npm and PyPI accounts without two-factor authentication are regular targets for credential stuffing campaigns. A single compromised maintainer account on a widely used package is a distribution channel to millions of downstream consumers.

CI/CD pipeline credentials. Long-lived pipeline tokens with broad permissions — particularly those with write access to production environments or artifact registries — are exfiltrated through pipeline misconfigurations, leaked logs, and compromised third-party actions. The access they provide is often more valuable than direct application exploitation.

Public container registries. Unverified base images pulled from public registries introduce vulnerability load silently. Teams that don't enforce image signing and provenance checks at admission are consuming trust assertions they've never verified.

Transitive dependencies. Direct dependencies get reviewed; transitive dependencies rarely do. Attackers who compromise a package two or three levels deep in a widely used dependency tree can achieve broad distribution with minimal visibility.

How to Reduce Exposure Across the 9 Risk Categories Before an Attack Happens

Addressing all nine risk categories simultaneously isn't feasible — but the controls that reduce the most exposure per unit of implementation effort are consistent across organizations:

Pin dependencies to verified hashes. Replace floating version references with lockfile-pinned, hash-verified dependencies in all package manifests. This closes dependency confusion and typosquatting as vectors for unintentional consumption.

Harden CI/CD pipeline configurations. Pin third-party actions to specific commit hashes rather than mutable version tags. Rotate pipeline credentials regularly. Apply least-privilege permissions to pipeline tokens — a deployment pipeline doesn't need write access to the source repository. For a deeper look at CI/CD pipeline security practices, our post on vulnerability patching in CI/CD environments covers the remediation workflow end to end.

Enforce artifact signing and admission policies. Sign all build outputs with Sigstore Cosign. Enforce signature verification at container admission with Kyverno or OPA Gatekeeper. Unsigned images should not run — not as a warning, but as a hard rejection.

Start from verified, continuously patched base images. The most effective single control for base layer risk is using base images that are maintained by a provider with documented security practices, signed provenance, and a committed CVE remediation SLA. Echo's hardened container images ship CVE-free, are signed and continuously patched, and come with a 7-day SLA on high and critical vulnerabilities. Teams that build on Echo's base images eliminate the entire category of inherited base image vulnerability risk from their supply chain exposure.

Audit and reduce transitive dependency exposure. Tools like Socket.dev, Snyk, and Dependabot surface transitive dependency vulnerabilities and flag newly introduced packages with suspicious behavioral indicators. Regular dependency audits — not just at initial adoption but on a recurring schedule — catch abandoned packages before their vulnerability load becomes critical.

Frequently Asked Questions

Where do most software supply chain attacks begin? The most common entry points are open source package registries and CI/CD pipeline credentials. Compromised maintainer accounts on npm or PyPI give attackers a distribution channel to millions of downstream consumers. Pipeline credentials with broad permissions give attackers access to production environments through a channel that looks like normal build activity. Registry-level controls and pipeline credential hygiene address both entry points directly.

What makes supply chain attacks different from application vulnerabilities? Application vulnerabilities are flaws in code your team wrote and controls. Supply chain attacks exploit trust relationships — they enter through components you consumed, build systems you relied on, or distribution channels you didn't verify. They arrive as legitimate, often signed artifacts, and they bypass application security controls entirely. The attack surface is everything your software depends on, not just the code your team authored.

Do supply chain attacks always have an assigned CVE? No, and this is a significant blind spot in vulnerability management programs that rely solely on CVE scanning. A malicious package inserted by a compromised maintainer, a typosquatting payload, or a backdoored build output won't have a CVE — the malicious behavior is intentional, not a disclosed flaw. CVE-based scanning catches known vulnerabilities; supply chain integrity controls like provenance verification, artifact signing, and behavioral analysis catch threats that CVE databases don't cover.

Why do transitive dependencies increase supply chain risk? Transitive dependencies — the packages your direct dependencies depend on — are rarely reviewed at adoption time and are difficult to monitor continuously. The average application has far more transitive than direct dependencies, and they inherit vulnerabilities, abandoned maintainer status, and supply chain integrity gaps from packages several levels removed from anything your team explicitly chose. A compromise in a transitive dependency is as dangerous as one in a direct dependency, but significantly less visible.

What are the 7 blind spots in your vulnerability scans?

Discover when "0 vulnerabilities" doesn't actually mean you're clean.

Read now →

Ready to eliminate vulnerabilities at the source?