Back to blog

// OSSeva Blog

Compliance

How to Document End-of-Life Software Risk: Risk Register, Exceptions and Compensating Controls

Randall McClure10 min read

The short answer

Document end-of-life software risk as one register entry per unsupported component and version, not as a line in a general IT risk log. Each entry records the component, the version you run, the upstream end-of-life date and where that date came from, how exposed the component is, the known CVEs against it, an owner, a decision, the compensating controls in place, a review date and an exit plan. Where the decision is to keep running the component, attach a time-boxed exception approved by someone with the authority to accept the risk. Then review the entry on a fixed cadence and close it only with evidence that the component was upgraded, replaced, retired or put under a documented source of security fixes.

That structure maps onto what the main frameworks ask for. NIST SP 800-53 SA-22 wants replacement or an alternative source of support, and assessors examine "documented approvals, including justification" for continued use. PCI DSS 12.3.4 wants end-of-life plans documented and a remediation plan approved by senior management. This article is general information, not legal or audit advice. Your auditor or assessor makes the final call on whether the evidence is enough.

The fields of an end-of-life risk register entry

Keep one row per component and version line in each environment where it runs. A ZooKeeper 3.6 ensemble in production and another in a payment environment are two rows, because their exposure, owners and controls differ.

FieldWhat to recordWhy an auditor asks for it
ComponentProduct name and where it runs: cluster, service, image or host group.Ties the entry to the inventory (NIST CM-8, PCI DSS 12.5.1).
VersionThe exact version in production, taken from the build or SBOM, not from a design document.End-of-life status applies to a version line, and scanners match on version.
Upstream EOL date and sourceThe date security fixes stopped, plus a link to the project's announcement or release history.Shows the date was checked, not guessed. PCI DSS 12.3.4 asks you to document vendor end-of-life plans.
ExposureInternet-facing or internal, which networks can reach it, what data it handles, which frameworks put it in scope.Exposure drives likelihood in the risk assessment (NIST RA-3).
Known CVEsPublished CVEs affecting this version, their severity, whether a fix exists for this line, and any VEX status.Shows the risk is assessed against real vulnerabilities, not just age.
OwnerA named person, not a team alias, accountable for the decision and the exit plan.Assessors interview the people responsible for component replacement under SA-22.
DecisionUpgrade, replace, retire, or keep with a named source of fixes, plus the exception reference if kept.SA-22 accepts replacement or an alternative source of support; this field says which.
Compensating controlsEach control, the finding it addresses, and the date and result of its last test.A control nobody has tested is a description, not evidence.
Review dateWhen the entry is next reassessed, and the triggers that force an earlier review.Shows the risk is managed over time, not accepted once.
Exit planTarget version or replacement, target date, dependencies and the change ticket.PCI DSS 12.3.4 asks for a plan to remediate outdated technologies; NIST CA-5 asks for a plan of action and milestones.

The register sits next to your SBOM rather than inside it. NTIA's minimum SBOM elements have no field for support status, which is why our post on SBOMs and end-of-life components argues that an inventory finds the problem without fixing it. Our comparison of end-of-life tracking tools covers how to populate the date and source columns automatically.

A filled-in example: ZooKeeper 3.6

Apache ZooKeeper 3.6 reached end of life on 30 December 2022, with 3.6.4 as its final release, as recorded on our ZooKeeper 3.6 end-of-life page. The deployment details below are illustrative.

FieldExample entry
ComponentApache ZooKeeper ensemble zk-core, three members, coordinating two internal Kafka clusters and a service-discovery layer
Version3.6.4, confirmed with the srvr command on each member
Upstream EOL date and source30 December 2022. Apache ZooKeeper release history, cross-checked against endoflife.date
ExposureInternal only. Reachable from the application subnet. Holds service metadata, no cardholder or patient data. In scope for SOC 2.
Known CVEsCVE-2024-23944 (rated critical by Apache): persistent watchers can expose child znode paths a client should not see. The advisory lists 3.6.0 through 3.7.2 as affected and fixes it only in 3.8.4 and 3.9.2, so there is no upstream fix for 3.6.
OwnerPlatform engineering lead (named)
DecisionKeep on 3.6 with an external source of backported fixes until the upgrade completes. Exception EX-0142.
Compensating controlsClient connections limited to named hosts and SASL principals; ACLs reviewed so no client can read parents of sensitive subtrees; four-letter-word commands restricted. Last tested on the date of the exception, results attached.
Review dateQuarterly, and on any new CVE that names 3.6 or an earlier line
Exit planRolling upgrade to 3.9 after every client is inventoried; change ticket linked; target date set in the exception

Two details make this entry hold up. The CVE field says plainly that upstream has no fix for this line, so nobody reads a clean scan as a clean bill of health. And the decision names where fixes will come from, which is the question an SA-22 assessor asks first. Our SA-22 guide lists the evidence for each route.

What a time-boxed exception should contain

An exception, sometimes called a risk acceptance, is the signed decision to keep running something that policy says should be upgraded. It is separate from the register entry because it has a different lifecycle: it is approved once, expires, and is either closed or renewed with fresh justification. A useful exception contains:

  1. Scope. The register entry it covers, the component, version and environments. One exception per entry keeps renewals honest.
  2. The constraint. Why the component cannot be upgraded yet: client dependencies, vendor certification of a dependent product, a change freeze. PCI DSS's compensating controls worksheet asks for the legitimate technical or business constraint first.
  3. The risk statement. What could go wrong, using the exposure and CVE fields, and what risk remains after controls. The PCI worksheet calls this the additional risk posed by not meeting the original requirement.
  4. The source of fixes. In-house team or external provider, and the contract or procedure that defines it. This is SA-22 part b.
  5. Compensating controls and their tests. Each control, how it was validated, and how it will be maintained.
  6. Approver. Someone with authority to accept the risk at its level, named in your policy. SP 800-53A looks for documented approvals with justification, and PCI DSS 12.3.4 asks for senior-management approval of the remediation plan.
  7. Start date, expiry date and maximum duration. Expiry is what makes it time-boxed. Set a maximum duration and a limit on renewals in your policy, so that a long-running exception has to be argued again on its merits.
  8. Conditions that void it early. For example, a new CVE on the component listed in CISA's Known Exploited Vulnerabilities catalog, a change that exposes the component to the internet, or a lapse in the support contract.
  9. Link to the exit plan. The ticket or plan of action and milestones (NIST CA-5) that ends the need for the exception.

An expired exception should be treated as an open finding, not quietly extended. Our compliance versus security post explains why: an accepted exception closes the audit finding but not the risk.

Compensating controls auditors usually accept, and their limits

Auditors generally accept compensating controls for an end-of-life component when they reduce a specific risk, have been tested, and come with a plan to stop needing them. They are much less comfortable with controls offered as a permanent substitute for support. The common ones:

ControlWhat it reducesLimits
Network isolationWho can reach the vulnerable service. The SA-22 discussion names prohibiting connection to public or uncontrolled networks as a mitigation.Holds only while the network design stays the same. Isolation reduces risk but is not one of SA-22's two ways of complying. Cyber Essentials accepts unsupported software only if it is removed or placed in a sub-set that prevents all traffic to or from the internet.
Web application firewallKnown attack patterns against HTTP interfaces.Covers only traffic that passes through it and only signatures it knows. No help for non-HTTP protocols such as ZooKeeper's client port, or for attacks from inside the trusted zone.
Virtual patching (IPS or WAF rules for a specific CVE)Exploitation of one named vulnerability, often within days of disclosure.Needs a rule per CVE, and the vulnerable code is still present. Evasion and protocol variants are a standing concern, so auditors expect a fix to follow.
Monitoring and detectionTime to notice an attack in progress.Detects; does not prevent. Acceptable as a layer, rarely as the only control for an exposed component.
Backported security patchesThe vulnerability itself, on the version you already run.Strictly a fix rather than a compensating control, and it covers only the CVEs patched. It satisfies SA-22 part b when a contract or in-house procedure defines it, and it still needs change records and a register entry until the upgrade.

Whichever controls you use, record for each one the finding it addresses, the test, the result and the date. A firewall rule that was correct before the last network change is the usual reason a compensating control fails sampling.

How often to review

At least annually for every entry, because that is the floor in the frameworks that set one. PCI DSS 12.3.4 requires a review of hardware and software technologies at least once every 12 months. DORA Article 8(7) requires financial entities, other than microenterprises, to run a specific ICT risk assessment on all legacy ICT systems "on a regular basis, and at least yearly", and before and after connecting new technologies, applications or systems. DORA's definition of a legacy ICT system in Article 3(3) includes one that has reached end of life or is no longer supported by its supplier or an ICT third-party service provider.

Annual is the floor, not the target. A quarterly review suits most end-of-life entries, with an immediate review when one of these happens:

  • A new CVE names the component's version line, or upstream publishes an advisory without listing older lines.
  • A CVE affecting the component is added to the Known Exploited Vulnerabilities catalog.
  • The component's exposure changes: a new network path, a new data type, a new framework in scope.
  • The exception is within a month of expiry.
  • The source of fixes changes, including a contract renewal or a team reorganisation.

How to close the item

Close a register entry only when the risk it records no longer exists, and attach the evidence:

  • Upgraded. The change record, the SBOM or inventory showing the supported version, and a scan after the change. Then close the exception.
  • Replaced. The same evidence for the replacement product, plus confirmation that the old component no longer runs anywhere, including disaster-recovery copies and base images.
  • Retired. The decommissioning record and evidence that the hosts, images and data were removed or archived.

Moving a component onto extended support does not close the entry. It changes the decision to "kept, with an external source of fixes" and the review continues, because new CVEs will keep arriving against an old line. What changes is that each new CVE now has somewhere to go. Our audit evidence checklist shows how the closed entry, the change records and the approvals fit into one package for sampling.

Where OSSeva fits

OSSeva is the external source of fixes that the decision field can name for community end-of-life runtimes. OSSeva Patch delivers drop-in builds with backported security patches quarterly and out of cycle for CVSS 9.0 and above, signed with GPG and attested with Sigstore Cosign. For ZooKeeper that includes patched 3.6.x builds. OSSeva Operate commits to patching Critical CVEs (CVSS 9.0 or higher) within 48 hours and High within 7 days. OSSeva Assure adds architecture review and compliance documentation. Our end-of-life dates and EOL tracker give you the date and source for the register.

Frequently asked questions

What is the best way to document software end of life risk?

Keep one risk register entry per unsupported component and version, with the upstream end-of-life date and its source, exposure, known CVEs, an owner, a decision, compensating controls, a review date and an exit plan. Link a signed, time-boxed exception to any entry where the component stays in service.

How do you manage end of life software compliance?

Track support status alongside your inventory, decide for each end-of-life component whether to upgrade, replace, retire or keep it with a documented source of fixes, and review the decisions on a fixed cadence. Our end-of-life software policy template sets out the rules in a form you can adopt.

How do you prepare for an end of life software audit?

Make sure every end-of-life component in scope has a register entry, a current approval with justification, evidence of where its fixes come from, tested compensating controls and change records for fixes applied in the period. Auditors sample, so assemble the evidence per component rather than per framework.

How do you reduce risk from obsolete software?

Contain it first with isolation and access restrictions, get a source of security fixes for the version you run, and schedule the upgrade or retirement. Controls lower the risk quickly; only a fix or removal takes the vulnerability away.

Is a risk acceptance enough on its own?

Rarely. Frameworks allow documented risk acceptance, but auditors expect it to be time-boxed, approved at the right level, backed by tested controls and linked to a plan that ends it.

Tags

ComplianceRisk ManagementEnd of LifeAuditVulnerability Management

Ready to get your open source under control?

Talk to an OSSeva engineer about CVE coverage, compliance, and migration support for your stack.