Engineer working on a laptop connected to a device test rig, surrounded by wiring harnesses and test hardware

Firmware vulnerabilities & fixes

libcurl vulnerabilities in embedded firmware: which CVEs matter, how to find them, how to fix them

Last updated:

The libcurl CVEs that matter for a device are the ones whose code is compiled into its libcurl build and reachable through the protocols, proxy settings and TLS backend the firmware actually uses, starting with the SOCKS5 heap overflow CVE-2023-38545 in libcurl 7.69.0 to 8.3.0. To handle them, find every libcurl copy and its version in the image, record its protocols and TLS library, rank matches with EPSS and KEV data, then upgrade or patch, disable unused features and track curl's own advisories.

Key takeaways

  • Because libcurl is the default HTTP and file-transfer library on embedded Linux, and it is often present more than once.
  • The table below shows the pattern with five advisories.
  • Unpack the image, locate every libcurl copy (shared and static), read the version string and confirm it against the package or build record.
  • Ask the build itself where you can, and read its link dependencies and configuration where you cannot.

Why does libcurl show up in so many firmware scans?

Because libcurl is the default HTTP and file-transfer library on embedded Linux, and it is often present more than once. Firmware update clients, cloud connectors, telemetry agents, provisioning scripts and web management back ends all use it, either through the shared libcurl.so.4 or as a statically linked copy inside one binary. curl's own advisories carry the same reminder: "libcurl is used by many applications, but not always advertised as such!"

The number of published CVEs is large. The curl project's security page listed 239 curl and libcurl vulnerabilities on 2026-11-11, and its release table shows 21 published vulnerabilities for 8.22.0, the release before the current 8.23.0 (14 October 2026). Counting the project's JSON vulnerability data for older versions that device images still carry, 7.88.1 (the Debian bookworm base) has 66 entries and 7.68.0 has 74. Most are rated Low or Medium by the curl project, and many apply only to specific protocols, options or TLS libraries.

That spread is the reason a raw CVE count overstates risk. A version-only scan lists every CVE for that version, including flaws in TFTP, SMB, LDAP or NTLM code a lean device build never compiled. The work is narrowing that list to what is actually in the build.

Which curl CVEs matter for embedded devices?

The table below shows the pattern with five advisories. Severity is the curl project's own rating; EPSS is FIRST data dated 2026-11-10; none of the five was in CISA's KEV catalog (version 2026.11.10).

CVE Area Affected libcurl curl severity Build or use condition EPSS
CVE-2023-38545 SOCKS5 proxy handshake, heap overflow 7.69.0 to 8.3.0 High SOCKS5 with remote hostname resolution, download buffer under 65541 bytes 0.783, ~99.6th percentile
CVE-2026-92392 HTTP/2 upload, use-after-free 8.12.0 to 8.22.0 High HTTP/2 support built in and used for uploads 0.0128, ~70th percentile
CVE-2024-6197 ASN.1 parser frees a stack buffer 8.6.0 to 8.8.0 Medium GnuTLS, wolfSSL, Schannel, Secure Transport or mbedTLS backend 0.0430, ~91st percentile
CVE-2024-2398 HTTP/2 server push memory leak 7.44.0 to 8.6.0 Medium Application enables HTTP/2 server push 0.361, ~98.5th percentile
CVE-2023-38546 Cookie injection with "none" file 7.9.1 to 8.3.0 Low Duplicated easy handles with cookies enabled 0.0596, ~93rd percentile

CVE-2023-38545 in detail. The curl advisory explains that when curl passes a hostname to a SOCKS5 proxy for remote resolution, names longer than 255 bytes should switch to local resolution, but "due to a bug, the local variable that means 'let the host resolve the name' could get the wrong value during a slow SOCKS5 handshake" and the too-long hostname is copied into the heap download buffer. That buffer is 16 kB by default in libcurl, and the advisory states that an overflow "is only possible in applications that do not set CURLOPT_BUFFERSIZE or set it smaller than 65541." The hostname comes from the URL, so a malicious HTTPS server redirecting to a crafted URL is one route in. The code path is used when an application sets CURLPROXY_SOCKS5_HOSTNAME or a socks5h:// proxy, including through the http_proxy, HTTPS_PROXY or ALL_PROXY environment variables.

Scores for this one CVE also show why the curl rating and CVSS can differ. NVD's primary CVSS 3.1 score is 9.8; the CISA-ADP secondary score is 8.8; the curl project rates it High. Its disclosure policy says the project does "not support CVSS as a method to grade security vulnerabilities" and uses four levels instead (Low, Medium, High, Critical), taking into account "necessary build configuration, protocols involved, platform specifics" among other factors. For a device, that build-configuration view is usually closer to the real exposure.

TLS backend matters. Embedded builds often use mbedTLS or wolfSSL instead of OpenSSL to save space, and that choice moves CVEs in and out of scope. The CVE-2024-6197 advisory states that "the vulnerable code can only be reached when curl is built to use GnuTLS, wolfSSL, Schannel, Secure Transport or mbedTLS," triggered by a malicious server sending a crafted certificate. The same image with an OpenSSL-backed libcurl is not affected, although it then inherits OpenSSL's own CVEs, which our OpenSSL vulnerabilities in embedded firmware guide covers.

How do you find the libcurl version in a firmware image?

Unpack the image, locate every libcurl copy (shared and static), read the version string and confirm it against the package or build record. A practical sequence:

  1. Unpack the root filesystemExtract the SquashFS, UBIFS, JFFS2 or ext4 image with binwalk or the vendor's tools.
  2. Find the shared library and the toolSearch for libcurl.so* and a curl binary under /usr/lib, /lib and /usr/bin. Run readelf -d across the ELF files to list which programs declare libcurl.so.4 as a dependency, since those are the code paths that matter later.
  3. Search for static copiesSearch every ELF file for the literal libcurl/ followed by a version number, the prefix libcurl uses in its version text. A hit in an update agent or vendor daemon that does not link libcurl.so.4 is a separate, statically linked libcurl with its own version and its own patch status.
  4. Check the package or build recordOpenWrt-style images carry an opkg database with the libcurl package version and revision; Yocto and Buildroot builds produce manifests and license files listing it. Our Yocto and Buildroot SBOM guide covers how to get those records out of the build.
  5. Look for backports behind the versionThe version string records the upstream base, not the patch level. The Debian security tracker for CVE-2023-38545 marks bookworm's 7.88.1-10+deb12u4 and bullseye's 7.74.0-1.3+deb11u10 as fixed by DSA-5523-1, and buster as not affected because the vulnerable code is absent. Ubuntu's CVE-2023-38545 entry likewise lists 22.04 LTS fixed in 7.81.0-1ubuntu1.14 and 20.04 LTS as not affected, with the note that the flaw affects 7.69 and higher. Device vendors backport in the same way; patches in the vendor SDK or GPL source release are the evidence.

Record each libcurl copy as its own SBOM entry. A package URL (purl) with the exact version, and the path of the binary that embeds it, keeps a static copy from disappearing behind the shared library's entry. Our firmware SBOM guide covers the wider inventory.

How do you see which protocols and TLS backend are compiled in?

Ask the build itself where you can, and read its link dependencies and configuration where you cannot. Three sources, in order of reliability:

Source What it shows Notes
curl -V under QEMU user-mode emulation Version line with TLS libraries, plus "Protocols:" and "Features:" lines Only if the image ships the curl tool built against the same libcurl
readelf -d libcurl.so.4 Linked TLS library (libssl, libmbedtls, libwolfssl, libgnutls), libnghttp2 for HTTP/2, libz, libssh2 for SFTP/SCP Static builds hide this, so fall back to strings and the build config
Build configuration The configure line, CMake cache or package recipe options in the vendor's source release or build system The authoritative answer for what was compiled out

The curl manual describes the -V output directly: the first line includes "the full version of curl, libcurl and other 3rd party libraries linked with the executable," the line starting "Protocols:" "shows all protocols that libcurl reports to support," and the line starting "Features:" lists features such as HTTP2, HTTPS-proxy and AsynchDNS. If HTTP2 is missing from the features line, CVE-2026-92392 and CVE-2024-2398 do not apply. Proxy support has no line of its own in that output, so confirm from the build configuration whether libcurl was built with --disable-proxy, which removes the SOCKS code behind CVE-2023-38545.

Then check use, not only presence. Look for socks5h:// in configuration files, init scripts and environment settings, and for HTTP/2 or proxy options in the calling programs. A proxy environment variable set by a provisioning script is enough to put a daemon on the SOCKS5 path.

How should you prioritise libcurl CVEs on a device?

Rank by build and use conditions first, exploitation data second, and severity ratings third. In practice:

  • Present and reachable, high EPSS or KEV-listed: fix in the next firmware release. CVE-2023-38545 on a 7.69.0 to 8.3.0 build that uses socks5h:// is the clear example; its EPSS score puts it among the top 0.5% of scored CVEs.
  • Present, reachable, High severity, low EPSS: schedule promptly. CVE-2026-92392 on an 8.12.0 to 8.22.0 build that uploads over HTTP/2 belongs here; the curl advisory notes it "has been proven to be possible to convert into a Remote Code Execution" under a specific set of conditions.
  • Compiled in but not used by any caller: remove the feature at the next rebuild and record the reasoning in a VEX statement.
  • Not compiled in, or wrong TLS backend: document as not affected, with the build configuration as evidence.

A KEV listing overrides all of this: a curl CVE added to CISA's catalog is being exploited and goes to the top. EPSS also needs reading with care. CVE-2024-2398, a memory leak rated Medium, has a higher EPSS score than CVE-2026-92392, so use EPSS to order findings that are already confirmed reachable, not to replace the reachability check. Our KEV and EPSS prioritisation guide explains how the two signals combine.

How do you fix libcurl vulnerabilities in firmware?

Upgrade or patch, strip unused features from the build, rebuild and re-scan, then keep watching the curl advisories. Each curl advisory lists its own options.

Upgrade or backport. The CVE-2023-38545 advisory recommends upgrading to 8.4.0, applying the patch to the local version, or avoiding CURLPROXY_SOCKS5_HOSTNAME and socks5h:// proxies. For CVE-2026-92392 it is curl 8.23.0, the patch, or not using HTTP/2, and the advisory also lists fixed releases on older lines: 8.14.3, 8.16.2 and 8.20.2. A device pinned to an older libcurl for ABI reasons can carry the fix commit linked from each advisory, as Debian did for 7.88.1.

Build out what the product does not use. The curl INSTALL guide's "Reducing size" section tells embedded builders to "specify as many --disable- and --without- flags on the configure command-line as you can," including --disable-PROTOCOL for every unused URL scheme, --disable-proxy (HTTP and SOCKS proxies), --without-nghttp2 (HTTP/2) and --disable-cookies. A firmware update client that only speaks HTTPS to one server needs very little else. Every protocol removed takes its future CVEs with it, and a smaller library is a side benefit.

Rebuild, re-scan, record. Regenerate the SBOM for the new image, confirm the shipped libcurl version or patch level, and compare it with the previous release. Record "not affected" decisions for compiled-out code in a VEX document; our CSAF and VEX for device makers guide shows the format. The same discipline applies to the other components that usually sit next to libcurl, which our BusyBox vulnerabilities and Dropbear SSH vulnerabilities guides cover.

Track curl's advisories. The curl project is its own CVE Numbering Authority and publishes every advisory on its security page, together with machine-readable data in OSV-format JSON that a build pipeline can poll. Per its disclosure policy, High and Critical issues are fixed in a private branch and distributions on the distros@openwall list are informed no more than seven days before the release. Releases with security fixes are announced on the curl-announce mailing list. Subscribing there, or polling the JSON feed, gives a device team the same starting point as the Linux distributions. Updates still need a working delivery path to devices in the field, which our firmware OTA update security guide covers.

AI-assisted analysis: what SoftWSP actually runs

SoftWSP's automated scan unpacks a firmware image, catalogs the software components it can identify in the extracted file system, and records each one's name, version and identifiers. Where the image carries identifiable libcurl version evidence, such as a package database entry, it is matched against CVE records, CISA's KEV catalog and FIRST's EPSS scores. This matching is deterministic code: the code scores, and AI narrates.

AI writes the plain-language explanation on top of that matching: which libcurl CVEs matched, which are KEV-listed or have a high EPSS score, and what version evidence they rest on, with every sentence citing the component, version and record behind it. An engineer reviews every finding before the report is delivered. The judgements this guide describes as manual stay with that engineer: whether SOCKS5, HTTP/2 or a particular TLS backend is compiled in and used, whether a statically linked copy exists inside another binary, and whether a vendor backport already closes a version-matched CVE. Version matching flags Debian's patched 7.88.1 as affected by CVE-2023-38545; the review is where backport evidence turns that into a documented "not affected" decision.

For a specific image, see device & firmware security services.

This guide draws on the curl project's security page, advisories for CVE-2023-38545, CVE-2023-38546, CVE-2024-2398, CVE-2024-6197 and CVE-2026-92392, its JSON vulnerability data, release table, disclosure policy, INSTALL guide and man page, the Debian Security Tracker, Ubuntu's CVE entry, NVD, CISA's KEV catalog (version 2026.11.10) and FIRST EPSS data dated 2026-11-10, all read directly on 2026-11-11.

Put this guide to work

Frequently asked questions

Which libcurl CVEs matter most for an embedded device?

The ones whose vulnerable code is both compiled into your libcurl build and reachable through the options your firmware actually uses. CVE-2023-38545, the SOCKS5 heap buffer overflow rated High by the curl project, affects libcurl 7.69.0 to 8.3.0 but only overflows when an application uses SOCKS5 with remote hostname resolution (CURLPROXY_SOCKS5_HOSTNAME or a socks5h:// proxy, including through proxy environment variables) and leaves the download buffer below 65541 bytes. CVE-2024-6197 only exists in 8.6.0 to 8.8.0 builds that use GnuTLS, wolfSSL, Schannel, Secure Transport or mbedTLS. CVE-2026-92392, an HTTP/2 upload use-after-free rated High, needs HTTP/2 support. A version match is the start of the check, not the verdict.

How do I find the libcurl version inside a firmware image?

Unpack the root filesystem, look for libcurl.so.4 and any curl binary, and search every ELF file for the literal string "libcurl/" followed by a version number, because statically linked copies have no separate library file. Use readelf -d to see which programs list libcurl.so.4 as a dependency, and compare the result with the package database (opkg on OpenWrt-style images) or the build manifest. Treat the version as the upstream base only: Debian fixed CVE-2023-38545 in bookworm's 7.88.1-10+deb12u4 package without changing the upstream 7.88.1 version.

How do I tell which protocols and TLS backend a firmware's libcurl was built with?

If the image ships the curl tool, run curl -V under QEMU user-mode emulation: per the curl manual, its first line lists the libcurl version and linked TLS libraries, and the lines starting "Protocols:" and "Features:" show what that build supports. Without the tool, check which TLS library libcurl.so.4 links against with readelf -d (libssl, libmbedtls, libwolfssl or libgnutls), and read the build configuration in the vendor's source release or build system. The TLS backend decides whether some CVEs apply at all.

Is upgrading to the latest curl release the only fix?

No. Every curl advisory lists alternatives, typically upgrade, apply the published patch to your version, or avoid the affected feature. For CVE-2023-38545 the options are curl 8.4.0 or later, the patch, or not using socks5h:// and CURLPROXY_SOCKS5_HOSTNAME proxies. For embedded builds the most durable mitigation is configuring libcurl without unused features: the curl INSTALL guide lists --disable-PROTOCOL flags plus --disable-proxy, which removes HTTP and SOCKS proxy support entirely, and --without-nghttp2, which removes HTTP/2.

Does SoftWSP tell me whether a libcurl CVE is reachable in my firmware?

No, not automatically. SoftWSP's scan identifies software components and versions in the unpacked firmware file system and matches them against CVE records, CISA KEV and FIRST EPSS data; AI then writes a summary that cites the component, version and record behind each finding, and an engineer reviews it. Whether SOCKS5, HTTP/2 or a given TLS backend is compiled in and used, and whether a vendor backport already closes a version-matched CVE, is decided in that engineer review.

Sources

  1. curl project: curl CVEs (security page, all published curl/libcurl vulnerabilities)
  2. curl project: CVE-2023-38545, SOCKS5 heap buffer overflow (advisory, 11 October 2023)
  3. curl project: CVE-2024-6197, freeing stack buffer in utf8asn1str
  4. curl project: CVE-2024-2398, HTTP/2 push headers memory-leak
  5. curl project: CVE-2026-92392, HTTP/2 upload Use-After-Free (14 October 2026)
  6. curl project: vulnerability data in JSON (OSV format)
  7. curl project: Vulnerability Disclosure Policy
  8. curl project: How to install curl and libcurl (INSTALL, Reducing size)
  9. curl project: curl man page (-V, --version)
  10. curl project: Release table
  11. Debian Security Tracker: CVE-2023-38545 (curl)
  12. Ubuntu Security: CVE-2023-38545
  13. NIST NVD: CVE-2023-38545
  14. CISA: Known Exploited Vulnerabilities (KEV) Catalog
Was this guide helpful?

In this cluster

libcurl vulnerabilities in embedded firmware: which CVEs matter, how to find them, how to fix them