OpenSSL vulnerabilities persist in embedded firmware because vendor SDKs and board support packages freeze on branches such as 1.0.2 and 1.1.1, which the OpenSSL project stopped supporting on 1 January 2020 and 11 September 2023, while the devices built on them keep shipping for years. To handle them, find every libcrypto and libssl copy in the image and read its version string, check whether the vendor backported fixes behind that version, rank the matched CVEs with KEV and EPSS data, then move to a supported branch or patch, rebuild and re-scan.
Key takeaways
- Because the OpenSSL version in a device is rarely chosen on its own.
- Unpack the image, find every copy of the library, read each copy's version text, and compare it with any package metadata.
- They break the assumption that the version string tells you the patch level.
- Use exploitation data first, reachability second, and the CVSS base score to break ties.
Why do end-of-life OpenSSL branches keep shipping in devices?
Because the OpenSSL version in a device is rarely chosen on its own. It arrives with the chip vendor's SDK, the board support package or the Yocto or Buildroot release the product was first built on, and changing it touches every program that links against libcrypto. The OpenSSL release strategy states that from 3.0.0 onward "API/ABI compatibility will be guaranteed for the same MAJOR version number", and that under the older scheme only a change of the last digit, such as 1.1.0 to 1.1.1, keeps binary compatibility. Moving from 1.0.2 to 1.1.1, or from 1.1.1 to 3.x, therefore means rebuilding and often patching the web server, the VPN client, the update agent and any vendor daemon that uses TLS, then retesting all of it on hardware that may be several years old.
Meanwhile the support clock runs out. The same release strategy page, last modified 7 May 2026, lists "Versions 3.0, 1.1.1 and 1.0.2" as no longer supported and names 3.5 as the current LTS, supported until 2030-04-08. The project's 1.1.1 end-of-life notice records that 1.1.1 was released on 11 September 2018 as an LTS and reached end of life exactly five years later, and that 3.0 would be supported until 7 September 2026. Its 1.0.2 vulnerability page states that 1.0.2 "is out of support since 1st January 2020" and that extended support is available for premium support customers.
End of life does not stop new CVEs from applying to those branches. The project's 1.1.1 vulnerability page listed 31 CVEs published after 11 September 2023 when read on 2026-11-10, two of them rated High:
| CVE | OpenSSL severity | What it is | Affected (per OpenSSL) | Public fix commits listed |
|---|---|---|---|---|
| CVE-2022-0778 | High (15 Mar 2022) | Infinite loop in BN_mod_sqrt() reachable when parsing certificates | 1.0.2 before 1.0.2zd, 1.1.1 before 1.1.1n, 3.0 before 3.0.2 | 3.0.2, 1.1.1n, 1.0.2zd |
| CVE-2023-0286 | High (7 Feb 2023) | X.400 address type confusion in X.509 GeneralName | 1.0.2 before 1.0.2zg, 1.1.1 before 1.1.1t, 3.0 before 3.0.8 | 3.0.8, 1.1.1t; 1.0.2zg as a premium patch |
| CVE-2026-45447 | High (9 Jun 2026) | Heap use-after-free in PKCS7_verify() | 1.0.2 before 1.0.2zq, 1.1.1 before 1.1.1zh, 3.0 before 3.0.21, and later lines | 3.0.21 and newer lines only |
| CVE-2026-84782 | High (29 Sep 2026) | DTLS retransmits handshake messages from a stale buffer offset | 1.0.2 before 1.0.2zs, 1.1.1 before 1.1.1zj, 3.0 before 3.0.23, and later lines | 3.4.8, 3.5.9, 3.6.5, 4.0.3 only |
The last two rows are the embedded problem in miniature. OpenSSL still lists the end-of-life branches as affected and names fixed letter releases for them, but the public git commits it links cover only supported lines. A device maker on 1.1.1 either buys extended support, ports the fix from a newer branch itself, or relies on a distribution that does. CVE-2026-84782 matters most to devices that speak DTLS, such as CoAP endpoints; our CoAP protocol security guide covers where DTLS sits in that stack.
How do you identify the OpenSSL version in a firmware image?
Unpack the image, find every copy of the library, read each copy's version text, and compare it with any package metadata. A practical sequence:
Unpack the root filesystemUse binwalk or the vendor's tooling to extract the SquashFS, UBIFS, JFFS2 or ext4 filesystem. If regions refuse to unpack, our firmware entropy analysis guide explains how to tell encrypted data from compressed data. List the shared librariesThe file name already narrows the branch: libcrypto.so.1.0.0andlibssl.so.1.0.0for the 1.0.x series,libcrypto.so.1.1for 1.1.x, andlibcrypto.so.3for the 3.x series. More than one may be present when part of the system was upgraded and part was not.Read the version textThe OpenSSL_version(3) manual documents OPENSSL_VERSION_TEXTas"OpenSSL x.y.z xx XXX xxxx", a version followed by a release date, and the 1.x branches embed the same kind of string with a letter release, for exampleOpenSSL 1.1.1n 15 Mar 2022. Runningstringsandgrepover the library finds it without executing anything.Search for static copiesRun the same search across every executable, not only the libraries. Web servers, VPN clients, cloud agents and vendor management daemons are often linked statically against their own OpenSSL build, which can be older than the shared library next to it and will not appear in the package database. Check the package recordsOpenWrt-based images carry opkg metadata and Debian-based images carry a dpkg status file. Both record a package version with a revision suffix, which is where backport evidence starts (next section). Do not forget the boot firmwareUEFI firmware built from EDK II bundles its own copy of OpenSSL in its crypto package. Ubuntu's CVE-2022-0778 tracker lists the edk2source package separately fromopenssl, fixed in jammy's 2022.02-3ubuntu0.22.04.4 and still marked vulnerable for focal and bionic. On U-Boot based devices, check which crypto library the bootloader was built with; our U-Boot bootloader security guide covers that stage.
Record each copy as a separate component with its path, version and source in the firmware SBOM. If the image was built with Yocto or Buildroot, the build system can emit that record directly, as described in our embedded Linux build systems and SBOM guide. A cryptographic bill of materials takes the same inventory one step further, down to algorithms and protocol versions.
How do vendor backports affect OpenSSL CVE matching?
They break the assumption that the version string tells you the patch level. CVE databases and scanners match on the upstream version range, so a library that reports 1.1.1d is flagged for every CVE fixed in 1.1.1e through 1.1.1w and later. A distribution or device vendor that backports fixes keeps the upstream number and changes only the package revision.
Debian's tracker for CVE-2022-0778 shows the pattern clearly. Upstream fixed the BN_mod_sqrt() loop in 1.1.1n, but Debian lists it fixed in buster's 1.1.1d-0+deb10u8 and bullseye's 1.1.1k-1+deb11u2, and in stretch's 1.0.2-based openssl1.0 package at 1.0.2u-1~deb9u7. Ubuntu lists the same fix in focal's 1.1.1f-1ubuntu2.12 and in bionic's openssl1.0 at 1.0.2n-1ubuntu5.8. For CVE-2023-0286, Debian lists the fix in 1.1.1n-0+deb10u4 and 1.1.1n-0+deb11u4, while upstream fixed it in 1.1.1t. A scanner reading only "1.1.1n" from any of those packages reports a false positive.
The reverse error is just as common. A device vendor that took a library from its SoC SDK may have applied no patches at all, and a package revision suffix proves nothing until the patch is located. Useful evidence, in order of strength:
| Evidence | Where to find it | What it proves |
|---|---|---|
| Fix commit present in the source | Vendor GPL source release, SDK patch directory, Yocto or Buildroot recipe patches | The fix is in the code that was built, if the source matches the binary |
| Distribution package with a known fixed revision | dpkg status or opkg metadata, compared against the Debian or Ubuntu tracker | The fix is in that distribution package, if the image uses it unmodified |
| Vendor advisory or VEX statement | Vendor PSIRT page, CSAF document | The vendor claims the fix or non-exploitability; check what it rests on |
| Version string only | strings output |
The upstream base version, nothing about patches |
Reachability matters as well. OpenSSL's description of CVE-2023-0286 says it requires CRL checking to be enabled and is "most likely to only affect applications which have implemented their own functionality for retrieving CRLs over a network", which many embedded clients have not. CVE-2022-0778, by contrast, is triggered during certificate parsing "prior to verification of the certificate signature", so almost any TLS client or server can reach it. When a backport or a configuration makes a CVE irrelevant, record that as a VEX statement rather than leaving it as an unexplained gap; our CSAF and VEX for device makers guide covers the format and the VEX generator drafts one.
How should you prioritise OpenSSL CVEs in firmware?
Use exploitation data first, reachability second, and the CVSS base score to break ties. Public data as of 2026-11-09:
| CVE | KEV (catalog 2026.11.09) | FIRST EPSS (2026-11-09) | Score | Typical priority |
|---|---|---|---|---|
| CVE-2014-0160 (Heartbleed) | Listed, added 2022-05-04 | 0.99999 | NVD 7.5 | Immediate on any image still carrying a vulnerable 1.0.1 build |
| CVE-2022-0778 | Not listed | 0.732, ~99th percentile | NVD 7.5 | High: reachable by any network certificate parsing |
| CVE-2023-0286 | Not listed | 0.693, ~99th percentile | NVD 7.4 | Medium unless the device fetches CRLs itself |
| CVE-2026-45447 | Not listed | 0.040, ~91st percentile | OpenSSL High | High where the device verifies PKCS#7 or S/MIME, for example signed update or configuration files |
| CVE-2026-84782 | Not listed | 0.008, ~58th percentile | OpenSSL High | High on DTLS devices, low elsewhere |
A KEV listing overrides everything else: CISA adds a CVE only when it has evidence of exploitation in the wild. Our KEV and EPSS prioritisation guide explains how the two signals combine, and the CVSS v4 vs v3.1 guide covers why a base score still needs device context.
How do you fix OpenSSL vulnerabilities in firmware?
Move to a supported branch where the product can take it, backport fixes where it cannot, and prove the result with a fresh scan.
Upgrade to a supported LTS. OpenSSL names 3.5 as the LTS supported until 2030-04-08, which covers most hardware support windows better than any older line. The OpenSSL release strategy guarantees API and ABI compatibility within a major version, so once the applications build against 3.x, later 3.5 patch releases drop in. Budget for the porting work on the applications, not only the library swap, and check the deprecated low-level APIs your vendor daemons use.
Backport where an upgrade is out of reach. For a branch past end of life, the options are OpenSSL's paid extended support, porting the upstream fix commit from a supported branch, or taking the patch a distribution already applied. Debian and Ubuntu trackers link the commits they used, which makes them a practical reference for a 1.1.1 backport. Note the patched revision in the package version or SBOM so the next scan and the next reviewer can see it.
Remove what the product does not use. OpenSSL's build configuration can leave out protocols and algorithms. A device that never uses DTLS, SSLv3 or legacy ciphers carries less code for future CVEs to land in; our weak cryptography in embedded firmware guide covers the algorithm side.
Rebuild, re-scan, publish. Rebuild every statically linked binary as well as the shared library, regenerate the SBOM, and compare it with the previous release to confirm that each copy changed. The SBOM diff tool compares two SBOM files, and our firmware diffing and patch analysis guide covers the binary view. The same inventory step applies to the other shared components in the image; see our BusyBox vulnerabilities in embedded Linux firmware guide for the shell and utilities side. Then publish the affected and fixed versions in your advisory.
AI-assisted analysis: what SoftWSP actually runs
SoftWSP's scan works from the firmware's software bill of materials. It identifies OpenSSL as a component with its version, normalises it to the NVD CPE for OpenSSL, strips OpenWrt-style package revision numbers so the upstream version can be matched, and matches that version against CVE records, CISA's KEV catalog and FIRST's EPSS scores. This part is deterministic code: the code scores, and AI narrates.
AI then writes the plain-language summary on top of that matching: which OpenSSL CVEs matched, which are KEV-listed or have a high EPSS score, and what the version evidence was. Every sentence cites the component, version and record it relies on, and an engineer reviews every finding before the report is delivered. The judgements this guide describes as manual stay with that engineer: whether a statically linked copy exists that the package records miss, whether a vendor or distribution backport closes a version-matched CVE, and whether a configuration makes a CVE unreachable. Because matching is version-based, a backported 1.1.1d-0+deb10u8 build is flagged for CVE-2022-0778; the review is where the Debian tracker evidence turns that flag into a documented not-affected decision.
For where this check fits in a full assessment, see the OWASP Firmware Security Testing Methodology guide, or device & firmware security services to have a specific image reviewed.
This guide draws on the OpenSSL project's release strategy, 1.1.1 end-of-life notice, vulnerability pages and OpenSSL_version(3) manual, the Debian and Ubuntu security trackers, NVD, CISA's KEV catalog (version 2026.11.09) and FIRST EPSS data dated 2026-11-09, all read directly on 2026-11-10.
Put this guide to work
Frequently asked questions
Why do devices still ship OpenSSL 1.0.2 or 1.1.1 when both are end of life?
Because the OpenSSL version in a device is usually inherited from a chip vendor SDK, a board support package or an older Yocto or Buildroot release, and moving branch is an API and ABI change that forces every application linking libcrypto to be rebuilt and retested. The OpenSSL project's own vulnerability pages say 1.0.2 has been out of support since 1 January 2020, and its 1.1.1 end-of-life notice is dated 11 September 2023. Its release strategy page lists 3.0, 1.1.1 and 1.0.2 as no longer supported, with security fixes for them available only through paid extended support. A product line that started on one of those branches often keeps it for the life of the hardware unless someone budgets for the migration.
How do I find the OpenSSL version inside a firmware image?
Unpack the root filesystem, list every libcrypto and libssl shared object (libcrypto.so.1.0.0 for 1.0.x, libcrypto.so.1.1 for 1.1.x, libcrypto.so.3 for the 3.x series), and search each one for its version text, which OpenSSL's documentation gives as "OpenSSL x.y.z xx XXX xxxx": a version followed by a release date. Then search the other executables for the same string, because daemons such as web servers and VPN clients are often linked statically against their own private copy. The opkg or dpkg package database, where present, gives a second record to compare against.
Does a scanner that reports "OpenSSL 1.1.1d" mean the device is vulnerable to every CVE fixed after 1.1.1d?
Not necessarily. Distributions and device vendors backport fixes without changing the upstream version. Debian's security tracker lists CVE-2022-0778, the BN_mod_sqrt() infinite loop, as fixed in buster's 1.1.1d-0+deb10u8 package, although upstream OpenSSL fixed it in 1.1.1n; Ubuntu's tracker lists it fixed in focal's 1.1.1f-1ubuntu2.12. A match on the upstream version is a starting point. The package revision, the vendor's patch set or GPL source release, or the vendor advisory decides whether the fix is actually in the build.
Which OpenSSL CVEs should a device maker fix first?
Start with whatever CISA's Known Exploited Vulnerabilities catalog lists, then rank the rest by reachability and FIRST EPSS. In the KEV catalog released 2026-11-09 the only OpenSSL entry was CVE-2014-0160 (Heartbleed), so an image still carrying a 1.0.1 build goes to the top of the list. Among later CVEs, CVE-2022-0778 (NVD CVSS 3.1 base 7.5) had an EPSS score of 0.732 on 2026-11-09 and is reachable by any device that parses a certificate from the network, which covers almost every TLS client or server.
Does SoftWSP tell me whether my vendor backported an OpenSSL fix?
No, not automatically. SoftWSP's scan identifies OpenSSL as a component with its version from the firmware's software bill of materials, normalises it to the NVD CPE for OpenSSL, and matches it against CVE, CISA KEV and FIRST EPSS data. AI then writes a summary that cites the component, version and record behind each finding. Because the match is version-based, a backported build is flagged as affected; an engineer reviews the package revision and patch evidence and records a not-affected decision where a backport is proven.
Sources
- OpenSSL Library: Release Strategy (supported versions and LTS policy, last modified 7 May 2026)
- OpenSSL Library: OpenSSL 1.1.1 End Of Life (11 September 2023)
- OpenSSL Library: Vulnerabilities fixed in OpenSSL 1.1.1
- OpenSSL Library: Vulnerabilities fixed in OpenSSL 1.0.2
- OpenSSL Documentation: OpenSSL_version(3), OpenSSL 3.0
- Debian Security Tracker: CVE-2022-0778 (openssl, openssl1.0)
- Debian Security Tracker: CVE-2023-0286 (openssl)
- Ubuntu Security: CVE-2022-0778 (openssl, openssl1.0, edk2)
- NIST NVD: CVE-2022-0778
- CISA: Known Exploited Vulnerabilities (KEV) Catalog
About this guide
SoftWSP Firmware Security Desk
Covers the Firmware vulnerabilities & fixes cluster: 104 guides.

In this cluster
Questions about this page?
