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

Firmware vulnerabilities & fixes

BusyBox vulnerabilities in embedded Linux firmware: identify, prioritise and fix

Last updated:

BusyBox vulnerabilities pile up in embedded Linux firmware because BusyBox packs the shell, awk, networking tools and dozens of other utilities into one multi-call binary, so every CVE in any compiled-in applet lands on that single component. To handle them, identify the BusyBox version and its enabled applets in the image, check which applets untrusted input can reach, prioritise with EPSS and KEV data, then upgrade or backport the fix commits and re-scan the image.

Key takeaways

  • Because one executable contains many programs, and a CVE filed against any of them is a CVE against the whole binary.
  • Extract the root filesystem, find the binary the shell symlinks resolve to, and read its version banner.
  • List the applets that are compiled in, then trace which of them untrusted input can actually reach on the running device.
  • Rank by reachability first and exploitation data second, then use the CVSS base score to break ties.

Why does one BusyBox binary carry so many CVEs?

Because one executable contains many programs, and a CVE filed against any of them is a CVE against the whole binary. The BusyBox project's own description is that it "combines tiny versions of many common UNIX utilities into a single small executable," and that it is "extremely modular so you can easily include or exclude commands (or features) at compile time." On a typical router, camera, PLC gateway or industrial switch, /bin/sh, /bin/ls, /usr/bin/awk, /usr/bin/wget and /sbin/udhcpc are all symlinks to the same file. BusyBox reads the name it was called by (argv[0]) and runs the matching applet.

That design keeps firmware small, but it has a side effect for vulnerability management. A software bill of materials lists one component, busybox, with one version. Every CVE recorded against that version, whether it is in the shell parser, the awk interpreter, the DHCP client or a decompressor, then attaches to that one line. The five CVEs in the title show the pattern:

CVE Applet / code Weakness NVD CVSS 3.1 Upstream status (sources below)
CVE-2022-48174 ash shell (ash.c) Stack overflow (CWE-787) 9.8, AV:N Fix commit in the 1.37.0 line, per Debian's tracker
CVE-2023-42363 awk (xasprintf) Use-after-free (CWE-416) 5.5, AV:L, UI:R Listed in the 1.37.0 change log
CVE-2023-42364 awk (evaluate) Use-after-free (CWE-416) 5.5, AV:L, UI:R Fix commits in the 1.37.0 line
CVE-2023-42365 awk (copyvar) Use-after-free (CWE-416) 5.5, AV:L, UI:R Fix commits in the 1.37.0 line
CVE-2023-42366 awk (next_token) Heap buffer overflow (CWE-787) 5.5, AV:L, UI:R Patched downstream only (Debian unstable 1:1.37.0-8)

These are not lab curiosities that stay in the bug tracker. Siemens ProductCERT's SSA-089022, published 2026-01-28, lists all five among the third-party component vulnerabilities fixed in SINEC OS V3.3 for products such as the RUGGEDCOM RST2428P. Its SSA-585531, published 2026-07-14, lists CVE-2022-48174 for the SIDIS Secured SmartPlug before V7.26.0310. Industrial vendors ship BusyBox in exactly this way, and their own advisories show the CVEs travelling with it.

The same multi-call design means the CVE count says little about real exposure on its own. An image built without the awk applet does not contain the code behind CVE-2023-42363 to CVE-2023-42366, whatever the version string says. An image whose web interface passes request parameters to sh -c hands untrusted input straight to ash. That is why the next two steps, version and applets, have to be done together.

How do you identify the BusyBox version in a firmware image?

Extract the root filesystem, find the binary the shell symlinks resolve to, and read its version banner. Then confirm whether the vendor backported fixes behind that banner. A practical sequence:

  1. Unpack the imageUse binwalk or the vendor's own tooling to pull out the SquashFS, UBIFS, JFFS2 or ext4 root filesystem. If large regions refuse to unpack, our firmware entropy analysis guide covers telling encrypted blobs from compressed ones.
  2. Find the multi-call binaryList symlinks under /bin, /sbin, /usr/bin and /usr/sbin. The target that most of them share, usually /bin/busybox, is the binary to inspect. Some images contain more than one BusyBox build, so check every distinct target.
  3. Read the bannerBusyBox embeds a banner string beginning BusyBox v1.36.1 (build date), which strings and grep will find without running anything. If the binary was stripped of that string, the build date and the applet table still narrow the version down.
  4. Check the package databaseOpenWrt-based firmware carries opkg metadata in which busybox has a version plus a package revision, so there is a second, independent record to compare against the banner.
  5. Look for backportsThe banner records the upstream base version, not the patch level. Debian's tracker shows why that matters: CVE-2022-48174 is marked fixed in bookworm's 1:1.35.0-4+deb12u1 even though the upstream fix landed in the 1.37.0 line, and Debian LTS advisory DLA-4019-1 fixed CVE-2022-48174, CVE-2023-42364 and CVE-2023-42365 in bullseye's 1.30.1-based package. A device vendor can do the same. GPL source releases, patch directories in the vendor SDK or a vendor advisory are the evidence that a backport exists.

Version data from public records is not always tidy either. NVD's description of CVE-2022-48174 says "before 1.35", while its CPE configuration covers versions up to and including 1.36.1. For CVE-2023-42363, Debian's tracker notes that the proof of concept "triggers on bookworm but not on bullseye" and traces the cause to a change in the 1.34.0 line, which is a narrower range than "every version up to 1.36.1". When records disagree, take the source code and the fix commit as the reference, not the summary text.

How do you tell which BusyBox applets are enabled and reachable?

List the applets that are compiled in, then trace which of them untrusted input can actually reach on the running device. Compiled-in and reachable are two different questions:

Question How to answer it from the image What it changes
Is the applet compiled in? Symlink names pointing at the binary; the NUL-separated applet name table inside the binary; busybox --list under QEMU user-mode emulation; the .config in the vendor's GPL source release An applet that is not compiled in contains none of the vulnerable code
Is it on a path untrusted data takes? Init scripts, CGI handlers and web UI binaries that call system(), popen() or sh -c; cron jobs and hotplug scripts that run awk on received data Reachable applets move up the list; ones only used at build time move down
Who controls the input? Network-facing services, authenticated admin pages, local users only, or the firmware author only Sets how much NVD's attack vector applies to this device
Is there a mitigation in place? Compiler hardening flags, a read-only root filesystem, no interactive shell for service accounts Lowers impact; does not remove the flaw

For the five CVEs above, this check usually splits them into two groups. ash is the system shell on nearly every BusyBox image, so CVE-2022-48174 is almost always compiled in. Whether it is reachable depends on whether attacker-controlled strings reach the shell, the same pattern our command injection in embedded firmware guide describes for web and CLI handlers that shell out. The awk CVEs need a crafted awk program, the "crafted awk pattern" in NVD's descriptions. They matter where a script builds awk programs from received data, and much less where awk only runs fixed one-liners written by the firmware author. Memory-safety bugs like these follow the patterns in our memory corruption in embedded firmware guide.

How should you prioritise BusyBox CVEs?

Rank by reachability first and exploitation data second, then use the CVSS base score to break ties. The base score describes the flaw in general, not your device. Public data as of 2026-11-09 gives a clear order for the five CVEs:

CVE KEV (catalog 2026.11.09) FIRST EPSS (2026-11-09) Typical priority
CVE-2022-48174 Not listed 0.0316, ~88th percentile High where untrusted input reaches ash; fix in the next release
CVE-2023-42364 Not listed 0.0043, ~38th percentile Medium if awk processes received data, otherwise low
CVE-2023-42363 Not listed 0.0042, ~37th percentile Same as above
CVE-2023-42366 Not listed 0.0042, ~36th percentile Same as above; needs a downstream patch
CVE-2023-42365 Not listed 0.0039, ~34th percentile Same as above

KEV listing would override all of this: a BusyBox CVE added to CISA's catalog is being exploited in the wild and moves to the top of the list regardless of score. Our KEV and EPSS prioritisation guide explains how the two signals combine, and the CVSS v4 vs v3.1 guide covers why a 9.8 base score for a shell bug still needs environmental context on an embedded device.

How do you fix BusyBox vulnerabilities in firmware?

Move to a BusyBox version that contains the fixes, or backport the specific fix commits, then trim unneeded applets, rebuild, and re-scan to prove the result. Each step has a trap worth knowing.

Choose between upgrade and backport. The BusyBox release page lists 1.36.1 (19 May 2023) as the last release labelled stable; 1.37.0 (27 September 2024) and 1.38.0 (13 May 2026) are labelled unstable. The 1.37.0 change log includes "awk: fix use after free (CVE-2023-42363)" and "awk: fix use-after-realloc (CVE-2021-42380)". A team that requires a "stable" label therefore backports onto 1.36.1. A team that tracks the newest line takes 1.37.0 or 1.38.0 and tests its scripts against the shell changes those releases contain.

Patch what upstream releases leave open. Debian's tracker for CVE-2023-42366 lists bookworm (1.35.0) and trixie (1.37.0-6) as vulnerable, with the fix only in its unstable 1:1.37.0-8 package. Moving to 1.37.0 alone does not close that heap overflow, so carry the distribution patch or remove awk if nothing needs it.

Trim the applet set. BusyBox's compile-time configuration is the cheapest mitigation available. Disabling awk, telnetd, httpd, ftpd or nc where the product does not use them removes their code, and their future CVEs, from the attack surface. Document the configuration in the SBOM or a VEX statement so that "awk not compiled in" is recorded evidence, not just a claim. Our CSAF and VEX for device makers guide shows the format, and the VEX generator drafts one.

Rebuild, re-scan, release. Rebuild the image, regenerate its firmware SBOM, and compare it with the previous release to confirm the new BusyBox version or patch level is what actually shipped. The SBOM diff tool does this for two SBOM files, and our firmware diffing and patch analysis guide covers the binary-level view. Then publish the fix in your advisory. Siemens' notices above show the expected form: affected versions, fixed version and the CVE list.

AI-assisted analysis: what SoftWSP actually runs

SoftWSP's automated scan unpacks a firmware image, catalogs the software components in the extracted file system, and identifies BusyBox by name and version. On OpenWrt-style images this includes the opkg package record, with the package revision stripped so the upstream version can be matched. It then matches that component version against CVE records, CISA's KEV catalog and FIRST's EPSS scores. This is deterministic code: the code scores, and AI narrates.

AI's part is the written explanation on top of that matching. It summarises which BusyBox CVEs matched, which are KEV-listed or have a high EPSS score, and what the version evidence was, and every sentence cites the component, version and record it relies on. An engineer reviews every finding before the report is delivered. The judgements this guide describes as manual stay with that engineer: which applets are compiled in, which ones untrusted input reaches, and whether a vendor backport already closes a version-matched CVE. Version-based matching flags a backported 1.35.0 build as affected. The review step is where backport evidence becomes a documented "not affected" decision, instead of SoftWSP presenting a guess as a result.

For where BusyBox review 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 BusyBox project's release news and about page, the Debian Security Tracker, Debian LTS advisory DLA-4019-1, Siemens ProductCERT advisories SSA-089022 and SSA-585531, 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 does a single BusyBox binary show up with so many CVEs in a firmware scan?

BusyBox compiles dozens to hundreds of Unix utilities — the ash shell, awk, wget, udhcpc, tar, unzip, telnetd and more — into one multi-call executable, and every symlink such as /bin/sh or /usr/bin/awk points back at that same file. A scanner that identifies the binary as "busybox 1.36.1" therefore inherits every CVE recorded against any applet in that version: CVE-2022-48174 in the ash shell and CVE-2023-42363 to CVE-2023-42366 in awk all land on the same component even though they live in unrelated code. Whether each one matters depends on which applets were compiled in and which of them untrusted input can actually reach.

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

Extract the root filesystem (binwalk or the vendor's own unpacking tool), locate the binary that /bin/sh and most of /bin and /sbin symlink to, and search its strings for the banner "BusyBox v1.xx.x", which BusyBox prints in its own help output and embeds in the executable. On OpenWrt-based images the opkg package database records the busybox package version as well. Treat both as the upstream base version only: distributions and device vendors backport fixes without changing it, as Debian did with 1:1.35.0-4+deb12u1, which its security tracker marks fixed for CVE-2022-48174 although the upstream fix shipped in 1.37.0.

Which BusyBox CVE should a device maker fix first?

Start with the applets that are both compiled in and reachable by untrusted input, then use public exploitation data to order them. CVE-2022-48174 (ash stack overflow, NVD CVSS 3.1 base 9.8) usually comes first because ash is almost always the system shell and web or CGI handlers that shell out can feed it attacker data; its FIRST EPSS score on 2026-11-09 was 0.0316, around the 88th percentile. The four awk CVEs from 2023 are scored 5.5 by NVD, need a crafted awk program, and had EPSS scores near 0.004. None of the five was in CISA's Known Exploited Vulnerabilities catalog as of its 2026-11-09 release.

Is upgrading to the latest BusyBox release enough to fix these CVEs?

Not on its own. busybox.net lists 1.36.1 (19 May 2023) as the last release labelled stable; 1.37.0 (September 2024) and 1.38.0 (May 2026) are labelled unstable. The 1.37.0 change log includes "awk: fix use after free (CVE-2023-42363)", and Debian's tracker links the CVE-2022-48174 fix to the 1.37.0 line, but Debian still lists CVE-2023-42366 as unfixed in its stable releases and patched it only in its unstable 1:1.37.0-8 package. A device maker either moves to 1.37.0 or later and applies the remaining patches, or backports the specific fix commits onto its current version, then rebuilds and re-scans the image.

Does SoftWSP detect which BusyBox applets are enabled in my firmware?

SoftWSP's automated scan identifies BusyBox as a component, with its version, from the unpacked firmware file system, and matches that version against CVE, CISA KEV and FIRST EPSS data. AI then writes a plain-language summary that cites the component, version and record behind every finding, and an engineer reviews it. Deciding which applets are compiled in and reachable, and whether a vendor backport already closes a matched CVE, is part of that engineer review rather than an automatic verdict.

Sources

  1. BusyBox project: News and release announcements (1.36.1 stable, 1.37.0 and 1.38.0 change logs)
  2. BusyBox project: About BusyBox
  3. Debian Security Tracker: CVE-2022-48174 (busybox)
  4. Debian Security Tracker: CVE-2023-42363 (busybox)
  5. Debian Security Tracker: CVE-2023-42366 (busybox)
  6. Debian LTS Advisory DLA-4019-1: busybox security update (19 January 2025)
  7. Siemens ProductCERT SSA-089022: Multiple Vulnerabilities in Third-Party Components in SINEC OS before V3.3
  8. Siemens ProductCERT SSA-585531: Multiple Vulnerabilities in SIDIS Secured SmartPlug before V7.26.0310
  9. NIST NVD: CVE-2022-48174
  10. CISA: Known Exploited Vulnerabilities (KEV) Catalog
Was this guide helpful?

In this cluster

BusyBox vulnerabilities in embedded Linux firmware: identify, prioritise and fix