Apache Commons Lang EOL and How to Stay Patched

php2shell patches (CVE-2026-109618 and CVE-2026-109619) for EOL PHP are out now. With sales replies slower than usual due to high demand, the fastest route to patched packages is to buy ELS for Runtimes online (opens in new tab). Read the patch FAQ

Go straight to an AI summary of this blog post instead

  • Summarize this post with Perplexity
  • Summarize this post with Gemini

Key Takeaways

  • Commons Lang turns up throughout enterprise Java stacks, so one unpatched copy becomes a fleet problem.
  • Apache delivers fixes in later releases rather than backport branches, so older 3.x versions stop getting them.
  • Rushed upgrades go badly because commons-lang3 usually arrives transitively, and mediation surprises show up at runtime.
  • TuxCare’s ELS publishes patched builds of older Commons Lang versions, so you stay covered while you plan.

Commons Lang is the dependency nobody schedules a meeting about. It hands you the helpers the JDK never shipped, StringUtils and ClassUtils and NumberUtils and the builder classes, then disappears into the background of every service you own. It pulls in nothing at runtime, it almost never breaks, and it has been doing that quietly since Commons Lang 1.0 shipped in 2002. MvnRepository currently puts it at the top of the Core Utilities category, with roughly 50,000 artifacts listed as using it, which is a polite way of saying it is almost certainly in your build file somewhere.

That is exactly what makes a stale copy irritating. A CVE in a library only your billing service touches has a blast radius of one service. A CVE in commons-lang3 lands wherever your code calls into it, and in a lot of enterprise Java estates that is a long list of places nobody has a clean inventory for.

Here is the part that catches teams out. Apache does not publish an end-of-life date for individual Commons Lang releases. No sunset notice, no advisory telling you the branch you are on has stopped moving. What you also do not get is a maintained branch for your older release, so once a fix lands in a newer version there is generally no maintenance stream carrying it back to yours.

How Apache Commons Lang Actually Handles Releases

Worth understanding before you end up arguing with a scanner about it.

Start with the split. Apache shipped Commons Lang 3.0 in 2011 with a deliberate package namespace break. The 2.x line lives at org.apache.commons.lang and 3.x lives at org.apache.commons.lang3. That was on purpose so both could sit on the same classpath without fighting, which is also why plenty of large codebases still carry both. For lifecycle purposes, 2.x is finished in every sense that matters. The last release was 2.6 in 2011, development moved to the 3.x line, and nothing has shipped since. Anyone still on 2.x has been running without upstream fixes since 2011.

The 3.x line works differently from what most people assume. Apache does not maintain parallel long-term-support branches the way the JDK does. Fixes go into the next release, and the published release history shows no 3.12.x maintenance stream and no 3.17.x backport branch. So while Apache has never formally declared any 3.x release end of life, the practical result is the same. If a fix lands in a newer version, it is not coming to yours.

That distinction is worth getting right when you write it up for an auditor. “No upstream backport release for this version” is accurate and defensible. “Officially EOL as of a specific date” is not, because Apache has never published one.

As of September 2026 the newest release is 3.20.0, published on November 12, 2025. The Java floor is worth knowing too. Starting with 3.9 the library requires Java 8, so every release from 3.9 onward needs Java 8 or later, and the project’s CI currently runs against the supported LTS releases, meaning 8, 11, 17, 21 and 25.

Version line Package namespace Where it stands Newest release
Commons Lang 2.x org.apache.commons.lang Development ended, no fixes since 2011 2.6 (2011)
Commons Lang 3.x, older releases org.apache.commons.lang3 Still shipping in production, but no backport branch n/a, superseded
Commons Lang 3.x, current org.apache.commons.lang3 Where fixes actually land 3.20.0 (Nov 2025)

What Commons Lang EOL Means in Practice

The Fixes Stop Reaching You

CVE-2025-48924, disclosed in July 2025, is a good illustration precisely because it is unglamorous. ClassUtils.getClass() resolved nested class names recursively, so a long enough input could exhaust the stack and throw a StackOverflowError. Because that is an Error rather than an Exception, applications usually will not handle it, and the failure can stop the application. Apache rated it low, CISA’s ADP scored it 5.3, and OSS-Fuzz found it. It was never going to make headlines.

The shape of it is the interesting part. The advisory covers commons-lang 2.0 through 2.6 and every commons-lang3 release from 3.0 up to but not including 3.18.0, which carries the upstream fix. There is no upstream-patched 3.17.0. If a framework pins you there, or a change freeze does, or nobody has the budget to regression-test a utility library across forty services, that finding sits in your scanner output indefinitely.

One thing to keep straight while triaging is that a newly disclosed Commons Lang CVE does not automatically affect whatever version you happen to be running. Plenty will not. What EOL takes away is the ability to fix the ones that do without also changing versions.

Where Compliance Gets Awkward

PCI DSS v4.0.1 Requirement 6.3.3 requires patches for critical vulnerabilities, ranked through your own Requirement 6.3.1 process, to go in within one month of the patch’s release. Everything else runs on a timeframe you determine from your own assessment of how critical the risk is to your environment. PCI DSS v4.0 had applied that one-month window to critical or high-security patches as well, and v4.0.1 narrowed it back to critical vulnerabilities.

Other regimes are less prescriptive, and overstating them is a reliable way to lose a technical reader. FedRAMP sets remediation windows by severity. HIPAA’s Security Rule requires you to run a risk analysis and manage known vulnerabilities without naming a number of days. SOC 2 is criteria-based, so your auditor cares whether the patch process you documented is the one you actually follow. None of them makes a component with no remediation path easy to defend.

The specific headache with a utility library is scoping. A vulnerable application server sits in one place and produces one finding. A vulnerable commons-lang3 shows up once per artifact that bundles it, which turns a single unpatched version into a remediation exercise spanning teams that have never spoken to each other. Compensating controls can buy time and are often the right call, but whether they are sufficient is a conversation with your assessor rather than a box you tick.

Your Options After Apache Commons Lang EOL

Upgrade to the Current Release

For teams that can, moving to the current release is the right long-term answer. Apache keeps compatibility within 3.x reasonably tight, the lang3 namespace has been stable across the whole line, and the project publishes binary compatibility reports for its releases. Individual releases still deprecate things and adjust behavior, so treat it as an upgrade rather than a rubber stamp.

The catch is that it is rarely a one-line change. commons-lang3 is usually in your tree because something else put it there, a persistence layer or a framework or another Apache Commons component, and the version you end up with is whatever Maven’s mediation picked. A direct declaration with its own version in your pom.xml wins that contest. Leave the version off and let a parent POM or an imported BOM supply it, and the managed version decides instead. A shaded copy bundled inside somebody else’s artifact sits outside mediation entirely and will not be touched by any of it. That is why mvn dependency:tree -Dverbose is the first command to run rather than the last.

Swap in a Different Utility Library

Some teams use the moment to reconsider the dependency entirely. Guava covers a lot of the same ground, Spring ships its own utility classes, and core Java 8+ APIs absorbed a fair chunk of what Commons Lang existed to provide in the first place.

It is a legitimate architectural decision, but be honest about the trade. Guava is also a third-party dependency with its own CVE history, and it takes a looser line on churn than Apache Commons does, since anything marked @Beta can change or disappear in any release. You are exchanging one supply-chain surface for another rather than removing one. Migration also means auditing every call site, rewriting them, and validating behavior under the replacement. That is a migration project, not a sprint, which makes it a poor answer to a remediation deadline landing next month.

Keep Your Version and Patch It Anyway

The third option is to leave the version where it is and get security fixes for it from somewhere other than upstream. That is what TuxCare’s Endless Lifecycle Support does, and it is the only one of the three that decouples your patch status from your upgrade schedule.

Why Rushing a Commons Lang Upgrade Backfires

When the pressure arrives, and it usually arrives as a scanner finding rather than a decision, the instinct is to bump the version and ship it. A few things tend to go wrong.

Version mediation is the first. Once several dependencies declare different commons-lang3 versions, Maven resolves to the nearest declaration in the graph rather than the one your code was tested against, with declaration order breaking ties at the same depth. The build can stay green while a NoSuchMethodError, a NoClassDefFoundError or some other compatibility failure surfaces later, on a code path that testing missed.

The usual response can make it worse. Teams reach for <exclusions> in Maven or dependency constraints in Gradle to force the version they want, which clears the immediate error and leaves behind a dependency graph nobody wants to touch at the next upgrade. Do that across a handful of services under time pressure and you have traded a patch problem for a maintenance one.

Behavioral drift is the quieter risk. Commons Lang’s string, reflection and numeric helpers have been refined across a lot of releases, and code that leans on an edge case, null handling in a particular StringUtils method, for instance, can change behavior without changing signature. Nothing fails at compile time. It just returns something slightly different in production.

None of this is inevitable. It is what happens when the work gets compressed into a window sized by a compliance calendar rather than by the dependency graph. Teams that come through these transitions cleanly do the same three things every time. They audit the tree properly, they test the behavior their code actually relies on, and they hold a steady security posture while both of those happen.

What ELS for Apache Commons Lang Gives You

TuxCare has been patching open source software for fifteen years and has shipped more than 420,000 patches across its portfolio. The Commons Lang service points that at the versions people are actually stuck on. The docs currently list Commons Lang 2.4 and 2.6 on the old namespace, plus commons-lang3 3.4, 3.8.1, 3.10, 3.11, 3.12.0, 3.14.0, 3.15.0 and 3.17.0.

Mechanically it is unremarkable, which is rather the point. Your credentials go in Maven’s settings.xml, the TuxCare repository goes in your pom.xml, or the Gradle equivalents of both, and you point the dependency at the maintained build, so 2.6 becomes 2.6-tuxcare.1. Your call sites do not change, your build tooling does not change, and CI keeps resolving artifacts the way it always has. If you would rather your builds did not reach out to a vendor directly, you can proxy the whole thing through your own repository manager.

On timing, TuxCare targets 14 days from public disclosure for high and critical vulnerabilities at CVSS 7.0 and above, 60 days for medium and 90 days for low. Those clocks start at disclosure. PCI DSS starts counting from patch release, so the 14-day target is built to leave you room inside the one-month window Requirement 6.3.3 applies to critical vulnerabilities.

A note on dependency coverage, because it is easy to oversell. commons-lang3 has no runtime dependencies at all, by design, so there is no hidden tree underneath it. It works the other way round. commons-lang3 is usually the transitive dependency sitting in somebody else’s tree, which is exactly why it goes unnoticed. ELS for Libraries does cover direct and transitive dependencies of supported components at no extra cost, and that matters enormously for something like Struts or Tomcat. For Commons Lang specifically, the value is that the library everything else depends on finally has a maintained build behind it.

The rest is the plumbing you would want. Packages carry detached OpenPGP signatures and come from a TuxCare-managed registry, so authenticity and integrity are verifiable rather than assumed. There is a CycloneDX VEX feed for the Java libraries, Commons Lang included, which tells your scanners and your auditors which CVEs genuinely apply to a given build rather than which ones merely mention the package. SBOMs ship in SPDX and CycloneDX, with the Java feed published in Nexus alongside the packages. Support runs 24/7/365 through the TuxCare Support Portal for triage, patch requests and the occasional argument with a build system.

For the current list of supported Apache Commons Lang versions, see TuxCare’s documentation. To check which Apache Commons Lang CVEs have already been fixed, have a look at the live CVE tracker.

Don’t Let Commons Lang EOL Put Your Applications at Risk

Losing upstream maintenance does not break anything on its own. That is the problem, really, and why it stays off the roadmap until a scanner or an auditor puts it there. Your applications keep running, your tests keep passing, and the only thing that changed is that upstream fixes for your version stopped arriving.

Upgrading to the current release is still the right destination. Getting there properly means scoping the dependency audit, testing the behavior your code actually relies on, and fitting the work into a release calendar that other people also have claims on. That is a plan, and plans take time you do not have when the deadline belongs to somebody else.

Extended support is what buys that time. It does not replace the upgrade, and nobody should pretend otherwise. It keeps the Commons Lang versions it supports patched, gives you something defensible to put in front of an assessor, and lets your engineers spend their quarter on the roadmap instead of an emergency library migration.

If Apache Commons Lang EOL is on your radar right now, take a look at TuxCare’s ELS for Apache Commons Lang for extended support on selected out-of-support Commons Lang and commons-lang3 versions.

Summary
Apache Commons Lang EOL and How to Stay Patched
Article Name
Apache Commons Lang EOL and How to Stay Patched
Description
Running an older Commons Lang build? Here is what Apache Commons Lang EOL means and how TuxCare ELS keeps you patched.
Author
Publisher Name
TuxCare
Publisher Logo

Join 4,500+ Linux & Open Source Professionals!

2x a month. No spam.

Table of Contents
Get the open-source security answers you need

Join 4,500+ Linux & Open Source Professionals!

2x a month. No spam.