Est.

Dependency and Supply Chain Security in SaaS Applications

Most SaaS security programs ignore the attack surface they don't directly own or control.

Correspondent · · 11 min read
Cover illustration for “Dependency and Supply Chain Security in SaaS Applications”
Secure SDLC & Continuous Testing · August 30, 2026 · 11 min read · 2,462 words

Most SaaS applications run mostly on code nobody on the engineering team actually wrote. Open-source libraries, cloud-managed services, SaaS-to-SaaS integrations, CI/CD tools, infrastructure-as-code modules: that's the bulk of what's running in production on any given Tuesday, and the team itself may write only a sliver of it. Everything else got inherited from an upstream maintainer, a package registry, or a vendor's API, yet most security programs still budget and staff as if that ratio doesn't exist.

Here's the part nobody says out loud enough: if most of your codebase isn't yours, most of your attack surface isn't yours to control either. Traditional security thinking assumes you can inventory what you own and patch it on a schedule, and that assumption breaks the moment most of your running code comes from somewhere else. Vulnerabilities show up in code your team wrote, sure, but they also travel quietly through dependency trees, through packages your packages depend on, through SaaS platforms that already share data and identity with your systems.

SaaS-to-SaaS integrations make it worse. An OAuth grant to a marketing platform, a webhook into a CRM: each one builds a trust relationship an attacker can ride without ever touching your application code, and I've stopped being surprised by how big this surface gets once someone actually maps it out. Rarely is the surface what the team thinks it is.

The main paths an attacker actually uses to enter through dependencies

Compromised open-source packages sit at the top of the list, and they're not subtle once you know what to look for. Attackers publish malicious packages with names close to popular libraries and wait for a typo during install, or they take over a maintainer's account and slip bad code into something people already trust. Transitive dependencies, the packages your packages pull in without you ever choosing them, get almost no review at all, and malicious or vulnerable code can sit three or four layers down with zero visibility from the application layer.

There's also lockfile poisoning: quietly changing what a lockfile resolves to, so the declared dependency looks identical on paper while the installed code is compromised. It's a nasty one because nothing in the diff looks wrong.

Then there's the boring version of the same problem, and honestly it's the one I see most: a library that was fine on install day becomes a liability the moment a CVE gets published against it. Without active monitoring, that library keeps running in production indefinitely, and nobody's watching it. Dependency trees run deep, so a flaw in one foundational library ripples out to every application built on top of it, not just the ones that pulled it in on purpose. I've watched a team trace an incident back to a package three layers removed from anything they chose themselves, and the honest answer to "who owns this" turned out to be nobody. That's the whole problem in one sentence.

CI/CD pipelines get targeted for a simple reason: they hold privileged access to source code, secrets, and deployment infrastructure, all in one place. Compromise a build step and you control what ships, full stop. Third-party GitHub Actions, build scripts fetched at runtime, base container images pulled from a registry: none of it goes through the code review your own commits go through, and CI environment variables often hold API keys, cloud credentials, and signing certificates. When a build system gets popped, those are the first things grabbed.

SaaS-to-SaaS integration abuse is its own animal, and a messier one. OAuth tokens and API keys pile up over the years, and most organizations have no real inventory of what access they've handed out or to whom. When a connected vendor gets breached, attackers walk through the trust relationship that's already sitting there and land inside your environment without touching your app at all, and webhook endpoints receiving data from those platforms are frequently under-authenticated too, which turns them into an easy way in.

Infrastructure modules pulled from public registries, Terraform modules, Helm charts, CloudFormation templates, can carry misconfigurations or outright backdoors that get deployed straight into cloud infrastructure with nobody the wiser.

Why standard vulnerability scans miss most of this exposure

Software composition analysis tools do one job well: flag vulnerable package versions. What they don't do is tell you whether that vulnerability can actually be reached from your application's call graph, and that gap cuts both ways: real risk slips through, and teams drown in alerts for flaws that don't matter in their environment at all.

I've watched a team burn a full week triaging a CVE in a package that's imported but never actually called anywhere in the code, while the real exposure sat two dependencies over, completely untouched. That week doesn't come back.

Pipeline risk and integration risk are invisible to scanners built to inspect application code. A malicious GitHub Action doesn't show up in a dependency manifest, and an OAuth grant carrying far more scope than it needs doesn't either.

Point-in-time scanning has a deeper problem baked in: the dependency graph never sits still. New packages get added, versions get bumped, new integrations get connected on a rolling basis, so a scan that was accurate last month can be badly wrong today. Some vulnerabilities live entirely in business logic too, in the assumptions your application makes about third-party data, like trusting a webhook payload will always arrive well-formed. Catching that takes a human who understands what the application is supposed to do. Matching signatures against a database won't surface it, not now, not ever.

Teams shipping weekly, connecting new integrations constantly, can't run on scan-and-forget. The thing they're scanning keeps moving under them while they're still reading last week's report.

What rigorous supply chain assessment actually covers

Real assessment starts with the full dependency tree, not just what's declared in a manifest. Pull out every transitive package and flag the ones with known CVEs, odd provenance, or a maintainer who changed hands recently, since that last one is a signal people skip past too often. Reachability analysis, figuring out whether a vulnerable code path can actually get called from the running application, is what separates real risk from noise on a report.

Pipeline and build systems need the same scrutiny. Are third-party Actions and base images pinned to a verified hash, or floating on a mutable tag that can change under you with zero warning? Where do secrets live during a build, and what can reach them? Can a compromised build step alter an artifact before it hits production? These are concrete, answerable questions, and a rigorous assessment answers them directly instead of waving at them from a distance.

Integrations get the same treatment: a full inventory of every active connection and the scopes each one holds. Organizations doing this for the first time routinely find connections to tools nobody's touched in a year, still carrying broad permissions nobody remembers granting. Webhook endpoints get checked for whether they actually verify incoming payloads, HMAC signatures, IP allowlisting, or whether they just trust whatever shows up at the door.

None of this works without whitebox access. Reviewing a dependency tree in any real depth means having the source code and package manifests in hand; poking at the network boundary from outside won't get you there. Cloud configuration access surfaces over-permissioned IAM roles, storage that's publicly reachable, and trust relationships nobody meant to create, and a blackbox test would never catch any of it. Architecture diagrams and product docs matter too, since they show where third-party services plug in and where the application quietly assumes trust it hasn't actually verified.

Every finding needs a working exploit path attached, not a theoretical flag on a spreadsheet. A vulnerable dependency that's present but unreachable is a different animal than one that can actually be triggered to pull data or escalate privileges, and a good assessment says so plainly instead of blurring the two together. The parts scanners can't reach, chained paths combining a vulnerable dependency with an over-permissioned integration, or a pipeline misconfiguration that turns a low-severity package flaw into something critical, need a person doing that analysis by hand.

How supply chain vulnerabilities map to SOC 2, HIPAA, and ISO 27001 requirements

SOC 2's Trust Services Criteria don't name dependency scanning outright, but auditors increasingly read the risk evaluation requirements under the Common Criteria to cover third-party software and integration risk. A penetration test scoped to include supply chain components is the cleanest way I know to show you've actually done the work, rather than just claiming it in a questionnaire.

HIPAA's Security Rule requires periodic technical evaluation of systems that handle ePHI, and that requirement extends to the libraries and integrations those systems lean on. A proposed rule update expected to finalize in 2026 would make annual penetration testing explicitly mandatory. Anyone running third-party components against ePHI shouldn't wait around for the final language before doing something about it.

ISO 27001:2022's Annex A Control 8.8, covering management of technical vulnerabilities, goes straight at the dependency problem. Organizations have to maintain a process for assessing vulnerabilities across their technical environment, third-party code included. The October 2025 transition deadline has already passed, and every ISO 27001:2013 certification has expired as of that date. The 2022 version is the only one that counts now, and anyone still running against 2013-era controls is out of compliance, and not by a small margin.

The efficient move is scoping one penetration test to cover the supply chain layer, the application layer, and cloud configuration together, then mapping each finding against every framework it satisfies. That saves you from paying for three separate engagements and hands you audit-ready evidence for SOC 2, HIPAA, and ISO 27001 at once. Compliance frameworks are finally catching up to where security teams have stood for years now: third-party code and integrations are squarely in scope, whether the checklist spells it out or not.

The specific vulnerability classes supply chain paths most commonly deliver

Server-side request forgery is a significant risk in cloud-native applications that consume third-party APIs. If an attacker can control a URL parameter that gets passed into a server-side HTTP call, they can pivot into internal services, cloud metadata endpoints, or infrastructure that was never meant to be reachable from outside. OWASP elevated SSRF to its own dedicated category, A10:2021, reflecting how frequently it appears chained with other weaknesses in cloud environments. Any integration that accepts a URL as input, a file import, a webhook setup, a link preview, deserves priority for SSRF testing.

Injection through dependency-supplied data is another recurring pattern, and a sneakier one. A third-party library handling user input or external data may sanitize that data based on assumptions that don't match your application's context. SQL injection slips in this way, and so does template injection and command injection, riding in through a dependency that processes data before handing it to your own logic.

Hardcoded secrets keep turning up too: API keys, database credentials, signing tokens embedded in third-party packages or leaking through build logs. Once a secret reaches a public container registry or artifact repository, treat it as burned immediately. There's no window where it's still safe to use, none.

Broken access control through integration trust is one of the most consistent findings in supply chain-aware assessments, and it's rarely subtle once you see it. Integrations get set up with elevated permissions, and nobody revisits those permissions six months later. Over-scoped OAuth grants and API keys that should've been rotated months ago show up again and again; broken access control has held the top spot in web application security findings across multiple assessment cycles running now, and dependency-driven access issues are a big part of why.

Insecure deserialization is the last one worth naming here. Libraries that parse external formats, XML, YAML, serialized objects, can be vulnerable to deserialization attacks the moment they process data coming in from a third-party integration.

A practical framework for finding and fixing supply chain exposure

Start with inventory, and don't skip this even though it feels like busywork. Build a full software bill of materials for every service: direct dependencies, transitive dependencies, base images, build tooling. Separately, inventory every active SaaS integration and exactly what permissions it holds. This list is almost always bigger and stranger than teams expect going in; the first pass usually turns up at least one integration nobody remembers approving, sitting there with permissions it never needed.

Monitoring has to be continuous after that, not scheduled. Wire SCA tooling into the CI/CD pipeline so new CVEs against existing dependencies surface the moment they're published, not at next quarter's scan. Pin dependencies to specific, verified versions or commit hashes rather than floating ranges, especially for build tooling and CI actions that hold privileged access, and scan pull requests for newly added dependencies before they merge, not after they've shipped to production and it's too late to matter.

Expert-led penetration testing is where the automated stuff earns its keep or gets exposed. Automated SCA tells you what's present; testing tells you what's actually exploitable, and neither one replaces the other. A whitebox test scoped to include the dependency surface, the build pipeline, and the integration layer finds chained attack paths automated tools simply can't find alone. Insist on findings backed by a working exploit, because a list of CVE numbers with no demonstrated impact doesn't tell anyone what to fix first or how urgently. Retest after major changes too: new integrations, big dependency upgrades, a CI/CD platform migration. Don't wait on the next scheduled engagement to find out something broke.

Remediation should follow exploitability in your actual environment, not CVSS score alone. A critical-rated CVE sitting in unreachable code is lower priority than a medium-severity flaw in an integration that touches production data, and treating them the same wastes real hours. After a fix ships, retest that specific finding, since patches that don't fully close the path are more common than people admit, and easy to miss if nobody checks.

Governance is the part that never really ends. Put a review step in front of every new SaaS integration before it connects: what scopes is it asking for, what data can it reach, does that access actually match the use case? Revoke integrations nobody's using anymore, and rotate credentials on a set schedule, because a dormant connection is a standing invitation and attackers know it. Document the decisions so an auditor can see third-party access gets actively managed, not that it just piled up over the years while nobody was looking.

Continuous monitoring catches the known vulnerabilities, expert-led testing catches the exploitable paths scanners walk right past, and governance keeps the surface from quietly growing while nobody's watching it. Together they add up to a habit worth keeping, one that outlasts any single checklist.

Sources

  1. deepstrike.io
  2. cobalt.io
  3. cybri.com
  4. zafran.io
  5. deepstrike.io
  6. javapro.io
  7. arxiv.org

More in Secure SDLC & Continuous Testing