Back to blog

Software Supply Chain Security: The Dependency Risk Most Engineering Teams Don't Audit Until It's Too Late

Software Supply Chain Security: The Dependency Risk Most Engineering Teams Don't Audit Until It's Too Late

Every production application today is a shell wrapped around someone else's code. A typical Node.js or Python service pulls in a few dozen direct dependencies — and those dependencies pull in hundreds more, transitively, until a "simple" web app is running tens of thousands of lines of code that no one on the team ever wrote or reviewed. AEGONTECH LLC has audited enough client codebases during technical due diligence engagements to know this isn't an edge case; it's the default state of modern software. And it's exactly the layer most engineering teams never think to secure until a dependency compromise lands in their build pipeline.

Software supply chain security is the discipline of knowing what code you're actually shipping — not just the code your team wrote, but every package, container base image, and CI/CD plugin that touches your build. It's a newer concern than application-layer security, and it's growing faster than most teams' ability to manage it. The 2024 npm "shai-hulud" worm and the 2023 3CX compromise both spread through legitimate, previously-trusted packages — not through phishing or misconfigured servers. If your threat model only covers your own code, you're defending half the perimeter.

Key Takeaways

  • Supply chain attacks target the dependencies you trust implicitly, not the application code your team reviews — traditional code review and static analysis rarely catch a compromised transitive package.
  • An SBOM (Software Bill of Materials) is now table stakes for enterprise procurement, not a nice-to-have; expect it in RFPs the same way SOC 2 reports became standard.
  • Automated dependency scanning catches known CVEs, but the harder problem — a maintainer account takeover injecting malicious code into an otherwise-clean package — requires different controls entirely.
  • Pinning versions and reviewing lockfile diffs on every dependency bump costs engineering time upfront but is dramatically cheaper than an incident response after a compromised package ships to production.
  • Container base images inherit the same risk profile as application dependencies, and teams that scan npm packages but pull latest tags on Docker images have only solved half the problem.

What Exactly Is a Software Supply Chain Attack?

A software supply chain attack compromises your application by compromising something you depend on, rather than attacking your systems directly. Instead of finding a vulnerability in your codebase, an attacker publishes malicious code into a package you already trust and install — a dependency, a build tool, a container image, or even a CI/CD integration. Because the malicious code arrives through a channel your team treats as safe (an npm install or a pip install, run without a second thought), it bypasses code review entirely. The 2020 SolarWinds breach is the canonical enterprise example — attackers inserted malicious code into a legitimate software update, and it was distributed to roughly 18,000 organizations before detection. At the open-source dependency level, the pattern repeats constantly at smaller scale: compromised npm maintainer accounts, typosquatted package names, and post-install scripts that exfiltrate environment variables and cloud credentials.

The uncomfortable truth is that most engineering teams have no visibility into this risk. A 2023 Sonatype report found that 245,000 malicious packages were identified in open-source registries that year alone — more than the cumulative total from all previous years combined. And Gartner has projected that by 2025, 45% of organizations worldwide will have experienced attacks on their software supply chains, a threefold increase from 2021. Custom software built without supply chain controls in mind inherits every one of these risks silently.

Inline blog image 1

Why Do Traditional Security Practices Miss This?

Traditional application security — code review, static analysis (SAST), dynamic testing (DAST), penetration testing — is built to catch vulnerabilities in code your team writes and controls. Supply chain risk lives in code your team never sees. A pull request that adds left-pad@1.3.0 to a package.json doesn't trigger a security review; it's routine dependency management. But if that package's next patch release contains an obfuscated payload, nothing in a standard PR review process is positioned to catch it before it ships.

This is why software composition analysis (SCA) — tooling that inventories every dependency in your build, direct and transitive, and cross-references it against known-vulnerability databases — has become a distinct discipline from SAST/DAST rather than a feature bolted onto them. Tools like Snyk, Dependabot, and OWASP Dependency-Check solve the "known CVE in an outdated package" problem well. They are far weaker against the harder case: a package that is not outdated, has no known CVE, and was simply compromised at the source by an attacker who gained maintainer access or slipped a malicious commit past review.

What Is an SBOM, and Why Does It Matter for Enterprise Deals?

An SBOM (Software Bill of Materials) is a structured, machine-readable inventory of every component in a piece of software — every library, every version, every license, every transitive dependency — typically expressed in a standard format like SPDX or CycloneDX. Think of it as the ingredient label for your codebase. In the same way SOC 2 compliance readiness has become a prerequisite for closing enterprise deals, SBOM requirements are increasingly showing up in vendor security questionnaires and procurement RFPs, particularly for organizations selling into regulated industries or U.S. federal contracts, where Executive Order 14028 has made SBOMs an explicit expectation for software vendors.

For a startup or scale-up evaluating a development partner, this matters practically: a vendor who can hand over an accurate SBOM on request is signaling that they know what's actually running in production. A vendor who can't generate one on demand is telling you, implicitly, that nobody has looked.

Custom Development vs Off-the-Shelf: Where's the Risk Actually Higher?

This is one of the more counterintuitive parts of the supply chain conversation. The instinct is to assume custom-built software is riskier because it's less battle-tested — but off-the-shelf and SaaS platforms often carry larger, less-visible dependency trees than a purpose-built system, precisely because they're optimized for broad feature coverage rather than a minimal, audited footprint. A monolithic off-the-shelf CRM or CMS platform frequently bundles plugin ecosystems, third-party integrations, and legacy dependencies that the buyer never sees and has no ability to audit or trim. Custom software, built deliberately with a smaller, intentional dependency surface, can actually be the more auditable option — provided the team building it treats dependency hygiene as a first-class engineering practice rather than an afterthought.

AEGONTECH's approach across client engagements — including the architecture decisions behind Dolfy.ai, Dialable.world, and Mimicall.app — treats every new dependency addition as a decision with a cost, not a free convenience. That means pinning exact versions in lockfiles, running automated SCA scans in CI/CD on every build, reviewing lockfile diffs (not just package.json diffs) on dependency bumps, and scanning container base images with the same rigor as application code, since a compromised node:20 base image tag introduces exactly the same risk as a compromised npm package.

Inline blog image 2

What Should Engineering Leaders Actually Do This Quarter?

Start with visibility before controls. Generate an SBOM for your primary production services — tools like Syft or the native SBOM generation in GitHub and GitLab make this a same-day exercise, not a multi-week project. Layer in automated SCA scanning in your CI/CD pipeline so new vulnerable dependencies fail the build rather than merge silently. Pin dependency versions in production and treat every version bump as a reviewable change, with someone actually looking at the lockfile diff, not rubber-stamping it. Extend the same scrutiny to your container images and CI/CD plugins — a compromised GitHub Action has the same blast radius as a compromised npm package, and 2023's tj-actions incident demonstrated exactly that. None of this requires a security team headcount to start; it requires treating the dependency tree as part of the codebase, because it is.

FAQ

Do we need a full-time security engineer to manage supply chain risk? No — most of the foundational controls (SCA scanning, SBOM generation, lockfile review) can be automated into an existing CI/CD pipeline by the development team already maintaining it. A dedicated security hire becomes valuable as scale and compliance requirements grow, but it isn't a prerequisite to start.

Is this only a concern for large enterprises? No. Startups are frequently more exposed, not less — smaller teams move faster, add dependencies more casually, and rarely have SCA tooling configured from day one. A compromised package doesn't check company size before executing.

How is this different from the security work covered in SOC 2 audits? SOC 2 evaluates your organizational controls and processes broadly; supply chain security is one specific technical domain within that broader picture. A SOC 2 report can pass without deep supply chain scrutiny unless the auditor specifically tests for it, which is part of why SBOM requirements are increasingly showing up as a separate line item in enterprise procurement.

What's the fastest first step if we're starting from zero? Run a software composition analysis scan against your current production dependency tree this week. It will surface known CVEs immediately and give you a concrete, prioritized list rather than an abstract risk.

Getting This Right From the Start

Supply chain security isn't a problem you bolt on after a compromise — it's a set of habits that either exist in your engineering culture from the first npm install or don't exist at all until an incident forces the conversation. AEGONTECH LLC builds this into how we architect and maintain software for clients from day one, because the cheapest time to establish dependency hygiene is before you have ten thousand transitive dependencies to audit retroactively. If your team is evaluating a development partner and wants to understand how supply chain risk gets managed in practice — not just in a policy document — we're always glad to talk through it.