Home/Journal/Pattern
Patternexploit-chainthreat-modelingdefense-in-depth

Chaining: Where Real Severity Comes From

Individually-medium findings combine into a critical breach. Scanners score each in isolation and miss the chain. Here is how chaining works.

Ajay Kumar··8 min read

What this is

Vulnerability chaining is where two or more individually-medium findings combine into a critical breach. Each link looks unremarkable in a triage queue. The severity comes from the composition: the output of one flaw is exactly the key the next flaw needs, and the chain as a whole reaches something no single link could reach alone. Severity is emergent, which is precisely why triaging findings in isolation systematically under-rates risk.

This is the gap between what a scanner reports and what an attacker achieves. A scanner rates each finding on its own, against a fixed table, and misses the chain. A human assembles it.

Why it keeps happening

Severity scoring was built for a world of independent findings. You take a flaw, you rate its impact assuming nothing else is true, and you sort the queue. That model is convenient and it is wrong in the one situation that matters most, because real breaches are rarely one flaw. They are a sequence, and the impact of a sequence is not the maximum of its parts. It is the product.

A tool cannot reason about the sequence because it has no model of what a finding unlocks. It sees an open self-signup and marks it low, because signup is supposed to be open. It sees a missing ownership check and marks it medium, because plenty of apps have one somewhere it does not much matter. It has no way to notice that this particular signup produces the account that this particular missing check then fails to constrain. The two rows sit in the report a few lines apart, each correctly scored on its own, and the critical that they form together appears nowhere.

The consequence is a queue of mediums that a team reasonably deprioritizes in favor of the one high, while the actual critical is spread across three of the mediums nobody connected. This is not a failure of the scanner doing its job. It is the job being the wrong job.

How the attack works

The canonical shape, generic enough to teach from, is three links:

  1. An exposed environment variable leaks a credential or a piece of configuration. On its own, maybe a medium. It is a secret in the wrong place, but what it opens is not yet obvious.
  2. That credential grants cloud-storage access. The leaked variable turns out to be a key to a storage bucket. Still not a headline: it is one bucket, and buckets hold all kinds of unremarkable things.
  3. The bucket holds an unencrypted backup. And the backup is the whole database. Now the three innocuous links are a full data breach.

Exposed variable, plus storage access, plus unencrypted backup, equals breach. No single step is a critical. The severity is entirely in the arrows between the steps. An attacker does not experience the findings as a list. They experience them as a path, and they walk it from the first thing they can reach to the last thing worth taking.

The general move is always the same: the output of one flaw, an ID, a key, a bucket name, a valid session, becomes the input that satisfies the next flaw’s one precondition. Chaining is just noticing which findings hand each other exactly what they need.

What it looks like in the wild

We assemble these chains on nearly every engagement. Four show the shape clearly.

The consistent theme: in each case a per-finding scanner would have produced a queue of mediums, and the actual critical lived in the space between them.

How to tell if you are exposed

A self-check aimed at the chain, not the finding:

  1. Read your last scan as a path, not a list. For each medium and low, ask one question: what does this give an attacker that another finding needs? An ID, a key, a session, a bucket name, an account. Draw the arrows.
  2. Look for the ingredients of the canonical chain. Any secret in the wrong place, any credential that grants storage access, any unencrypted backup. Each is a medium. Together they are the textbook breach.
  3. Test your own multi-step paths. Take a low-severity information leak and ask what the leaked information unlocks downstream. Take a weak auth finding and ask what a sequential or guessable ID would let it reach at scale.
  4. Assume one control fails. For each place where a single check is the only thing standing between a user and someone else’s data, ask what the impact is if that one check is bypassed. If the answer is “everything,” that control is load-bearing and the design has no depth.

How to fix it

The durable fixes are about the design and the process, not any single bug.

  1. Never triage findings in isolation. Model how a medium plus a medium becomes a critical. When you rate a finding, ask what it unlocks, and re-rate the pair, not just the part.
  2. Build defense in depth so no single control is load-bearing. Authorization on every object, not just at the front door. If one check is the only thing protecting the data, its bypass is a breach, and every check eventually gets bypassed.
  3. Assume an attacker will chain. Design as if the low-severity leak, the open signup, and the convenience proxy will all be found and connected, because that is what an attacker does. Close the arrows, not just the boxes.
  4. Use human-led testing for the assembly. A scanner scores each finding alone and is genuinely useful for coverage. It will not walk the path. The chain is assembled by a person who reasons about what each flaw hands the next, which is exactly why human-led testing beats an automated scanner that scores each finding in isolation.

The takeaway

Severity is emergent, so a queue of mediums can hide a critical that no single row reveals. Score the chain, not the finding, build depth so no one control is load-bearing, and assume the attacker will connect the dots your scanner rated separately.

Frequently asked

What is vulnerability chaining?
Vulnerability chaining is combining two or more individually low-or-medium findings into one critical impact. Each link is unremarkable on its own, but the output of one becomes the key that unlocks the next, and the chain as a whole reaches something neither flaw could reach alone. Severity is emergent: the chain is worth far more than the sum of its parts.
Why do automated scanners miss vulnerability chains?
A scanner rates each finding in isolation, against a fixed severity table, with no model of what the finding unlocks next. It sees an open signup form and a missing ownership check as two separate mediums, not as the two halves of a full data breach. Chaining requires reasoning about how one flaw's output feeds the next, which is assembly work a human does and a per-finding scanner does not.
Why does triaging findings in isolation under-rate risk?
Because severity is emergent. A medium plus a medium can be a critical when the first flaw supplies exactly what the second needs. Scoring each finding alone assumes independence that does not hold, so a queue of mediums can contain a critical breach that no single row reveals. Isolation systematically under-rates the real risk.
How do you defend against exploit chains?
Model how findings combine rather than triaging them alone, build defense in depth so no single control is load-bearing, and assume an attacker will chain. Fixing the highest-severity item first is not enough when a stack of mediums composes into a critical. This is why human-led testing, which assembles chains, outperforms a scanner that scores each finding separately.

This is one finding from a harness that runs continuously. See how Greywatch finds, proves, and fixes them.

How it works →