Join our Newsletter — 33% off our NHI Course
Home› Guides› End-of-Life Language Runtimes: Java, Node.js and Python Dates…
Guide Application Security

End-of-Life Language Runtimes: Java, Node.js and Python Dates and Upgrade Plans

← All guides
By NHI Mgmt Group, edited by Lalit Choda Updated 8 November 2026 12 min read
On this page

When a language runtime reaches end of life, newly disclosed vulnerabilities in it are never fixed, and every application, function and container image built on it inherits that exposure. Node.js 18 and 20, Python 3.9 and 3.10 have all passed upstream end of life since April 2025, and Java 17 leaves Oracle Premier Support in September 2026, yet these versions remain common in build images, serverless functions and long-lived services. This guide is for application security teams, platform engineers and engineering leads. It sets out each project's official lifecycle and current dates, how cloud and container platforms layer their own deprecations on top, how to find every runtime and the identities attached to it, the upgrade options, testing and rollback, and what staying put costs. Runtimes are listed alphabetically; order is not a ranking. The PHP-specific companion is Unsupported PHP versions.

Key takeaways

  • Each project publishes its own clock. Java LTS releases follow Oracle's support roadmap, Node.js even-numbered releases get about 30 months of LTS, and each Python branch is supported for five years, the last three as security-only.
  • Platforms add a second clock. AWS Lambda deprecates a runtime when a major component reaches end of community support, then blocks creates and updates on published dates; container base images age the same way.
  • Inventory runtimes, not just dependencies. Software composition analysis often reports libraries but not the interpreter or JVM underneath; check images, functions, CI runners and hosts directly.
  • Upgrade one major step at a time, behind tests. Most breakage comes from removed APIs and dependencies that do not support the new version, so upgrade dependencies first and pin the runtime explicitly.
  • Commercial extended support is a bridge. The Node.js project itself describes paid support for EOL lines as a temporary solution; the same applies to any runtime.

What is changing and why

Language runtimes are retired on fixed, published schedules so that maintainers can focus fixes on a small number of branches. The models differ, which matters for planning:

RuntimeRelease modelSupport modelOfficial source
Java (Oracle Java SE)Feature release every six months; designated LTS releases (8, 11, 17, 21, 25)LTS: Premier Support then Extended Support, years apart; non-LTS: about six months of Premier Support, superseded by the next feature release, no Extended SupportOracle Java SE Support Roadmap
Node.jsNew major twice a year; six months as Current; even-numbered majors become Active LTSLTS typically 30 months of critical fixes (Active then Maintenance); odd-numbered majors are short-lived; production should use Active or Maintenance LTS onlyNode.js previous releases page and Release working group schedule
Python (CPython)Recent branches have each shipped in OctoberBugfix phase with binary releases about every two months for two years (18 months before 3.13), then security fixes only as source releases, end of life five years after releasePython Developer's Guide, Status of Python versions

For Java, the vendor matters: Oracle's dates apply to Oracle JDK, while other OpenJDK distributions publish their own support periods. Licence terms also change during a release's life; Oracle's roadmap notes, for example, that Java 17 public updates after September 2024 moved from the No-Fee Terms and Conditions to the Java SE OTN licence. Record which distribution each application uses.

Official timeline and current status

Dates below are from each project's own pages, checked on 8 November 2026. "EOL" means the project no longer issues fixes for that line. Scheduled dates can move.

Runtime and versionKey datesStatus on 8 Nov 2026
Java 8 (LTS)Oracle Premier Support ended March 2022; Extended Support to December 2030Extended Support only
Java 11 (LTS)Premier Support ended September 2023; Extended Support to January 2032Extended Support only
Java 17 (LTS)Premier Support to September 2026 (or later); Extended Support to September 2029 (or later)Leaving Premier Support
Java 21 (LTS)Premier Support to September 2028; Extended Support to September 2031Supported
Java 25 (LTS)GA September 2025; Premier Support to September 2030Supported
Node.js 18End of life 30 April 2025EOL
Node.js 20End of life 30 April 2026EOL
Node.js 22Maintenance LTS from 21 October 2025; end of life 30 April 2027Maintenance LTS
Node.js 24Maintenance LTS from 20 October 2026; end of life 30 April 2028Maintenance LTS
Node.js 26Active LTS from 28 October 2026; end of life 30 April 2029Active LTS
Python 3.9End of life 31 October 2025EOL
Python 3.10End of life 1 October 2026EOL
Python 3.11Security fixes only; end of life scheduled October 2027Security only
Python 3.12 and 3.13Security fixes only; end of life scheduled October 2028 and October 2029Security only
Python 3.14Bugfix phase; end of life scheduled October 2030Bugfix

Platform deprecations: the AWS Lambda example

Managed platforms run their own schedules. AWS documents that Lambda deprecates a runtime when a major component reaches end of community long-term support, gives at least 180 days' notice, may stop applying security patches on the deprecation date, then blocks function creation at least 30 days later and updates at least 60 days later. Functions on deprecated runtimes keep running indefinitely, which is exactly why they are forgotten.

Lambda runtime identifierDeprecation dateBlock createBlock update
java8 (Amazon Linux 1)8 January 20248 February 202431 August 2027
java8.al2, java11, java17 (Amazon Linux 2)30 June 202729 July 202731 August 2027
nodejs18.x1 September 202529 July 202731 August 2027
nodejs20.x30 April 202629 July 202731 August 2027
python3.915 December 202529 July 202731 August 2027
python3.1031 October 202629 July 202731 August 2027

Lambda details, including the Amazon Linux 2 end of life on 30 June 2026, are in the AWS Lambda Runtime Deprecation guide. Other function platforms and managed services publish comparable lists; check each one you use.

Who and what is affected

  • Container images: application images built on a language base image tag for an EOL version, and multi-stage builds where the build stage uses a newer runtime than the final stage, or the reverse.
  • Serverless functions: functions on deprecated runtimes that still run and still hold execution roles.
  • CI runners and build tools: build images, linters and deployment scripts that pin an old interpreter. These often hold the most powerful credentials in the organisation.
  • Hosts and operating system packages: runtimes installed from distribution packages follow the distribution's support, not upstream's, which can extend or shorten coverage. See Ubuntu LTS End of Standard Support.
  • Embedded and vendor software: products that bundle a JVM, Node.js or Python and update it only when the vendor ships a release.
  • Libraries and frameworks: as the Node.js project notes, popular packages drop support for EOL lines, so an old runtime also freezes dependencies at vulnerable versions.

Finding affected systems and identities

  1. Read the manifests. Collect declared versions from source: the engines field in package.json and .nvmrc for Node.js; requires-python in pyproject.toml, python_requires and .python-version for Python; the compiler release or toolchain setting in Maven and Gradle builds for Java. Declared versions show intent, not reality, so continue.
  2. Inspect images. Parse the FROM lines in Dockerfiles and the image configuration in registries, and use image scanners or SBOMs to report the runtime package and version inside each image. See the SBOM Guide.
  3. Query function platforms. List every function with its runtime identifier across all accounts and regions, and compare against the platform's deprecated list. Platform notifications go to account contacts that may be unmonitored.
  4. Query running hosts. Use endpoint or configuration management inventory to record installed runtime packages and running processes with their versions. Include developer workstations and build agents.
  5. Join to owners and credentials. For every EOL runtime found, record the owning team and the identities the workload uses: the function's execution role, the service account, API keys and database credentials in its configuration. An EOL runtime with a broad role is a priority regardless of exposure. See the NHI Discovery Across Cloud, SaaS, CI/CD and On-Premises Environments guide.
  6. Rank by exposure. Internet-facing services, code that parses untrusted input and CI systems first; internal batch jobs with narrow permissions later.

Migration options

OptionWhen it fitsTrade-offs
Upgrade to the newest LTS or supported branchDefault for maintained applicationsMost engineering effort up front; longest runway (for example Java 25, Node.js 24 or 26, Python 3.13 or 3.14)
Upgrade to the next supported version onlyLarge code bases, many dependencies, limited test coverageSmaller change; another upgrade sooner (for example Node.js 22 ends 30 April 2027, Python 3.11 in October 2027)
Distribution or vendor extended supportApplications that cannot change before EOL, with a funded replacement planCost; fixes limited in scope; the Node.js project calls this a temporary solution
Rewrite, replace or retireUnowned services, abandoned functions, vendor products with newer versionsRequires an owner decision; often cheaper than upgrading code nobody understands
ContainShort-term only, while one of the above is deliveredNetwork isolation, removal of internet exposure, narrowed credentials and a dated exception

Decision guidance: set a policy that production uses only versions in active or security support with at least six months remaining, and that new projects start on the newest LTS. Small teams should upgrade straight to the newest LTS to reduce the number of migrations. Large organisations should upgrade shared base images and build templates first, because one change there moves many services, then let teams follow with deadlines tied to the official dates above. Automate routine version bumps; see the Dependency Update Automation Guide.

Testing and rollback

  1. Upgrade dependencies first. Move libraries to versions that support both the old and new runtime, deploy, and only then change the runtime. This splits one risky change into two smaller ones.
  2. Run the test suite on both versions. Add the target version to the CI matrix and fix failures before switching the default. Watch for removed standard library modules, changed defaults (cryptography, TLS, locale) and deprecation warnings that become errors.
  3. Canary in production. Deploy the new runtime to a small share of traffic or one function alias, compare error rates and latency, then expand.
  4. Pin explicitly. Use exact base image tags or digests and explicit function runtime identifiers so the change is reviewable and reproducible.
  5. Keep the rollback path open. Keep the previous image or function version deployable until the new one is stable. On Lambda, AWS warns that rolling back to a deprecated runtime may be blocked after the update block date, so finish migrations before that date.
  6. Verify after. Rescan images and functions, close the inventory item, and rotate any credential that was exposed in old configuration during the move.

Risks of doing nothing

  • Known, permanent vulnerabilities: the Node.js project states that when fixes ship for supported lines, EOL lines affected by the same vulnerability get no release, so users are immediately exposed once details are public. That enables MITRE ATT&CK T1190 Exploit Public-Facing Application.
  • Dependency freeze: libraries drop old runtimes, so security fixes in dependencies become unreachable, raising supply chain exposure (T1195.001 Compromise Software Dependencies and Development Tools).
  • Platform cut-offs: functions that cannot be updated after a block date cannot receive even a configuration fix during an incident.
  • Audit findings: the Node.js project notes that many industry audits forbid unmaintained runtimes, and NIST SP 800-53 SA-22 requires replacement or documented alternative support.
  • Tool-chain breakage: old runtimes may stop linking against newer system libraries, blocking operating system updates on the same host.

Framework mapping and metrics

FrameworkReferenceWhat it asks for here
NIST SP 800-53 Rev. 5SA-22 Unsupported System ComponentsReplace EOL runtimes or document alternative support
NIST SP 800-53 Rev. 5CM-8 System Component Inventory; RA-5 Vulnerability Monitoring and ScanningRuntime inventory across images, functions and hosts; scanning that reports runtime versions
NIST SP 800-53 Rev. 5SI-2 Flaw Remediation; SR-3 Supply Chain Controls and ProcessesTimely upgrades; base images and build tools as supply chain components
NIST CSF 2.0ID.AM-02; PR.PS-02; ID.RA-01Software inventory; software maintained and replaced by risk; vulnerabilities identified

Metrics to track: number of workloads per runtime version, split into supported, security-only and EOL; percentage of production workloads with at least six months of support remaining; functions on deprecated platform runtimes (target zero before block dates); median days from a version's EOL to its last production use; percentage of base images rebuilt in the last 30 days; open exceptions past their end date.

Practitioner checklist

  • Publish a runtime policy: supported versions only in production, newest LTS for new projects.
  • Record official EOL dates for every Java, Node.js and Python version in use, with the date checked.
  • Inventory runtimes in manifests, images, functions, CI runners and hosts, joined to owners.
  • Record the identities each EOL workload uses and narrow them while migration is pending.
  • Upgrade shared base images and build templates before individual services.
  • Upgrade dependencies first, test on both versions in CI, then canary the runtime change.
  • Finish platform migrations before create and update block dates.
  • Treat paid extended support as a dated bridge with an exit plan.
  • Track runtime versions as a standing vulnerability management metric.

Standards and references

Related NHI Mgmt Group resources: Unsupported PHP versions · AWS Lambda Runtime Deprecation · Java and Spring Security Guide · Node.js Security Guide · Python Security Guide

Free weekly newsletter

Subscribe to the NHI & AI Identity Journal

The latest on NHI and Agentic AI security – articles, research, breaches, news and events every week.

Bonus 33% off our NHI Course when you subscribe.

NHIMG Editorial Note
Researched and written by the NHI Mgmt Group editorial team using AI tools, under the editorial direction of Lalit Choda. Facts are drawn from the sources listed on this page and checked by our automated quality process. Last updated 8 November 2026. Spotted an error? Use our contact page.
NHI Mgmt Group, the independent authority on Non-Human Identity, IAM and Agentic AI security. nhimg.org