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

Firmware vulnerabilities & fixes

Embedded web server vulnerabilities in firmware: lighttpd, GoAhead, Boa and uhttpd

Last updated:

Embedded web server vulnerabilities in router, camera and PLC firmware cluster in four code paths — CGI handling, HTTP request parsing, authentication and path handling — and two of them were in CISA's KEV catalog as of version 2026.11.10: GoAhead's CVE-2017-17562 and the Realtek SDK web server flaw CVE-2021-35395. The servers involved are few: lighttpd, Embedthis GoAhead, Boa, OpenWrt's uhttpd and ACME's mini_httpd. Find the server and version in the image, check which features are compiled in and reachable, then upgrade, patch or remove what the product does not use.

Key takeaways

  • Five small servers account for most of what a firmware scan turns up on Linux-based devices.
  • Work from evidence that the build left behind, from the most exact to the least.
  • Four classes cover most published CVEs.
  • Because they arrive inside chip-vendor SDKs, and the device maker's web interface is built on top of them.

Which web servers ship in router, camera and PLC firmware?

Five small servers account for most of what a firmware scan turns up on Linux-based devices. They differ less in their bugs than in who maintains them and how a fix reaches a device.

Server Licence Maintenance status (2026-11-13) Where it usually comes from
lighttpd 1.4.x Revised BSD Maintained; 1.4.85 released 2026-07-08 Buildroot, Yocto or OpenWrt package; BMC and NAS firmware
Embedthis GoAhead GPL-2.0, commercial or evaluation licence Maintained for security fixes; 6.1.1 is the current release Compiled into the device maker's or chip vendor's own web program
Boa GPL-2.0 Unmaintained; last release 0.94.13, last development snapshot 0.94.14rc21 (February 2005) Chip-vendor SDKs, often modified
uhttpd ISC Maintained in OpenWrt's git tree; no numbered releases Default web server for LuCI on OpenWrt and OpenWrt-derived SDKs
mini_httpd BSD-style Single-author ACME Labs project; its home page lists changes through version 1.31 Small appliances that need CGI and basic authentication

The lighttpd project page describes it as "a secure, fast, compliant, and very flexible web server" released "under the Open Source revised BSD license". The GoAhead README calls it "the most popular little embedded web server," says it "is used in millions of devices worldwide," and states that it "is actively supported and receives security updates as required, but will not have new features added." The Boa home page was last updated on 23 February 2005, and its own text calls Boa "the favorite web server in the embedded crowd." OpenWrt's uHTTPd documentation notes that on current releases "the uHTTPd webserver is both already installed and activated," with support for CGI, PHP, Perl and embedded Lua.

How do you find which web server and version a firmware image ships?

Work from evidence that the build left behind, from the most exact to the least. A practical sequence:

  1. Unpack the imageExtract the SquashFS, UBIFS, JFFS2 or ext4 root file system. If parts will not unpack, our firmware entropy analysis guide covers telling encryption from compression.
  2. Read the package databaseOn OpenWrt-based firmware, the opkg package database lists uhttpd or lighttpd with a version, plus each installed lighttpd module as its own package. A Debian or Yocto-based image has the same record in dpkg or rpm. This is the most exact source, because it names the package that was built, not a string that might have been edited.
  3. Search the binaries for version stringslighttpd builds its version string as lighttpd/1.4.xx and prints it in its startup log line. Boa sets its Server header from a compile-time define that reads Boa/0.94.14rc21 in the last upstream snapshot. mini_httpd 1.30 embeds mini_httpd/1.30 26Oct2018. A vendor can override any of these defines, so a missing or odd string is not proof of absence.
  4. Look for GoAhead inside other programsGoAhead is designed to be embedded, so a router's management program is often a vendor binary with GoAhead linked into it. Current GoAhead sends GoAhead-http as its Server header and sets the CGI variable SERVER_SOFTWARE to GoAhead/ plus its version; search every executable and shared library for those strings and for GoAhead function names such as websOpen.
  5. Treat uhttpd versions as datesuhttpd has no numbered releases. The OpenWrt package Makefile pins a source date and a git commit (on 2026-11-13 the main branch pinned 2026-11-05), and the opkg version is built from that date. Map the date to the uhttpd git history to see which fixes are in.
  6. Read the start-up and configuration filesThe init script shows which server actually starts, as which user and on which ports. For lighttpd, note server.modules (mod_cgi, mod_alias, mod_extforward and others), and check whether the server tag hides the version. For uhttpd, /etc/config/uhttpd shows listen_http, listen_https, the CGI prefix and the Lua handler. For GoAhead, the route and authentication files show which URLs need a login.
  7. List the CGI programs and form handlersRecord everything under the CGI directory and every handler the web program registers. On many devices these, not the server, hold the injection and overflow bugs.

The output is one record per server: product, upstream version, patch evidence, compiled-in modules, enabled features and listening interfaces. Our Yocto and Buildroot SBOM guide shows how to capture the same facts at build time, where they are exact, and our firmware SBOM guide covers recovering them from a finished image.

Which vulnerability classes recur in embedded web servers?

Four classes cover most published CVEs. The table lists representative records with exploitation data as of CISA KEV catalog version 2026.11.10 and FIRST EPSS scores dated 2026-11-12.

CVE / advisory Server Class Fixed upstream in NVD Primary CVSS 3.x In KEV EPSS
CVE-2017-17562 GoAhead CGI environment injection 3.6.5 8.1 Yes (2021-12-10) 0.971
CVE-2021-42342 GoAhead CGI environment via upload filter 5.1.5 9.8 No 0.595
GHSA-w3p3-6x8p-vrjr GoAhead CGI HTTP_PROXY injection (httpoxy) 6.1.1 GitHub rating High No —
CVE-2021-35395 Realtek SDK boa and webs Overflows in SDK form handlers SDK and device updates 9.8 Yes (2021-11-03) 0.981
CVE-2019-19945 uhttpd Request parsing (negative Content-Length) OpenWrt 18.06.6, 19.07.0 7.5 No 0.016
CVE-2019-11072 lighttpd URL normalisation integer overflow 1.4.54 9.8 (v3.0) No 0.738
CVE-2018-25103 lighttpd Request parsing use-after-free 1.4.51 none published; secondary 5.3 No 0.007
GHSA-qj3g-66fp-rhhr GoAhead 6.1.0 Authentication bypass 6.1.1 GitHub rating Critical No —
CVE-2018-19052 lighttpd Path traversal in mod_alias 1.4.50 7.5 No 0.137
CVE-2018-18778 mini_httpd Arbitrary file read 1.30 6.5 (v3.0) No 0.708
CVE-2009-4496 Boa Log escape-sequence injection no fixed release CVSS v2 only (5.0) No 0.124

CGI handling

CGI is where an HTTP request turns into a process on the device, so it is where the worst server bugs land. CVE-2017-17562 is the reference case: the NVD record explains that GoAhead before 3.6.5 initialised "the environment of forked CGI scripts using untrusted HTTP request parameters," which, with the glibc dynamic linker, allows remote code execution through variables such as LD_PRELOAD. CVE-2021-42342 reopened the same path in GoAhead 4.x and 5.x before 5.1.5 through the file upload filter. In October and November 2026 Embedthis published further CGI advisories on GitHub: an ISINDEX query that injects command-line options into the CGI program, httpoxy HTTP_PROXY injection with a "non-functional environment blacklist," and two Windows-only CGI command and argument injections. lighttpd's 1.4.83 release lists "security: reject req header CGI conflicts" among its changes. Our command injection in embedded firmware guide covers the CGI programs themselves.

Request parsing

Embedded servers parse HTTP by hand, and length fields are the weak spot. OpenWrt advisory 2020-01-13-1 describes how uhttpd accepted a POST with "both Transfer-Encoding: chunked and a large Content-Length which exceeds 2^31 and is interpreted as a signed negative number," moving an internal buffer pointer to an invalid address; the fix shipped in OpenWrt 18.06.6 and 19.07.0. GoAhead 6.1.1 closed four request-smuggling advisories of the same family, and its release notes describe the result as "strict RFC 9112 request framing," with Content-Length combined with Transfer-Encoding rejected. lighttpd's 1.4.80 brought "stricter HTTP request/response header, trailer, and chunked validation/parsing" and detection of the HTTP/2 MadeYouReset attack (CVE-2025-8671), and 1.4.81 followed four days later with a single change: "security: fix to reject disallowed trailers."

Authentication bypass

Small servers implement their own login, sessions and password storage, and a single wrong comparison opens every protected page. GoAhead's advisory GHSA-qj3g-66fp-rhhr, fixed in 6.1.1, states that in 6.1.0 HTTP Basic and form authentication "accept any password for any user whose stored password is in the Blowfish (BF1:) salted-hash format," because the bcrypt result was "computed correctly and then immediately discarded." The same release fixed a session fixation flaw and a Digest nonce that disclosed the server secret. On devices, the more common bypass is in the route table or the vendor's handler, such as a page that checks the session in JavaScript only; our authentication bypass in embedded firmware guide covers those patterns.

Path traversal

Mapping a URL to a file is simple to write and easy to get wrong. CVE-2018-19052 allowed ../ traversal one directory above a lighttpd mod_alias target when the alias lacked a trailing slash but the target path had one, fixed in 1.4.50. The mini_httpd change history records for version 1.30: "Fix security bug that let remote users read arbitrary files," assigned CVE-2018-18778. Both depend on configuration and server version; our path traversal in embedded firmware guide covers the fix in vendor code.

Why do abandoned servers such as Boa stay in shipped devices?

Because they arrive inside chip-vendor SDKs, and the device maker's web interface is built on top of them. Microsoft Threat Intelligence's November 2022 report on vulnerable SDK components states that "despite being discontinued in 2005, the Boa web server continues to be implemented by different vendors across a variety of IoT devices and popular software development kits (SDKs)," and that its data "identified over 1 million internet-exposed Boa server components around the world over the span of a week." The same report adds that "while patches for the RealTek SDK vulnerabilities are available, some vendors may not have included them in their device firmware updates, and the updates do not include patches for Boa vulnerabilities."

Three forces keep Boa in place:

  • The SDK owns the web stack. The SDK's setup pages, form handlers and CGI programs are written against Boa's internals. NVD's description of CVE-2021-35395 shows the pattern: the Realtek Jungle SDK ships "one based on Go-Ahead named webs and another based on Boa named boa," and the overflows sit in SDK handlers such as formRebootCheck.
  • Many "Boa" CVEs are vendor CVEs. The NVD record for CVE-2017-9833 (/cgi-bin/wapopen on a camera) notes that multiple third parties call it a system-integrator issue "because Boa does not include any wapopen program," and the record for CVE-2021-33558 notes reports that it is "a site-specific issue." A newer Boa release would not fix them, and there is none.
  • Nobody upstream publishes fixes. CVE-2009-4496, the log escape-sequence flaw Microsoft cites, has no fixed upstream release. Every fix is a local patch the device maker writes and keeps.

So a device maker with Boa in an image owns it like first-party code: patch it, test it, and plan its replacement with a maintained server.

Where does each project publish security fixes?

Watch the right channel per server, because none of them uses the same one.

Server Fix channel What to watch
lighttpd Release notes on www.lighttpd.net; per-release change list Lines marked "security:" in each release; the older advisory and patch directory stops at a 2014 advisory
GoAhead GitHub Security Advisories and GitHub releases GHSA entries with a patched version; fixes only in the current release
uhttpd OpenWrt security advisories and the OpenWrt git tree Advisory pages per CVE; commits in the uhttpd tree and package Makefile bumps
mini_httpd ACME Labs home page change list "New in version" entries that name a CVE
Boa None Chip-vendor SDK release notes and the device maker's own patches

Two points need attention. First, GoAhead's security policy says "Security fixes are delivered in the current release only; earlier releases receive no backports," so a device on GoAhead 2.5, 3.x or 4.x carries every later fix as its own work. Second, lighttpd fixes can be silent. Binarly's BRLY-2024-002 advisory found lighttpd 1.4.45 in the BMC firmware of Intel's M70KLP series with an out-of-bounds read that lighttpd had fixed in 1.4.51 in 2018 without a CVE; the CVE, CVE-2018-25103, was assigned in June 2024, and Intel's PSIRT replied that the product was end of life. A version match is the only way to catch such a gap, so record exact versions.

How should a device maker triage and patch embedded web server CVEs?

Rank by reachability first, then by exploitation data, and use the CVSS base score only to break ties.

Check reachability. Does the server listen on WAN, or only on a management VLAN? OpenWrt's documentation warns that "by default, uHTTPd is bind to 0.0.0.0 which also includes the WAN port of your router." Is CGI enabled, and which programs are behind it? Is the vulnerable module, such as lighttpd mod_extforward for CVE-2022-22707, loaded at all?

Check exploitation data. A KEV listing moves a CVE to the top regardless of anything else; CVE-2017-17562 and CVE-2021-35395 are both listed, with EPSS scores above 0.97. Our KEV and EPSS prioritisation guide shows how the two combine.

Upgrade or patch. Move lighttpd to the latest 1.4.x release, GoAhead to 6.1.1 and uhttpd to a current OpenWrt package. For Boa, port the fix into your tree, and treat replacing it with a maintained server as part of the product's support plan. Check vendor backports before calling a version-matched CVE open; a distribution package or SDK may carry a patch without changing the version string.

Reduce what is exposed. GoAhead's own deployment notes list CGI, JavaScript templates, uploads and Digest authentication as "on by default," with build settings to remove each, and warn that the auto-login and legacy settings "must never be on in a shipped build." Bind every server to LAN or management interfaces, drop root after binding the port, remove sample CGI programs and test accounts, and hide version strings in the Server header.

Publish the decision. Use a VEX statement to mark CVEs that do not apply, for example a lighttpd mod_extforward CVE where the module is not loaded; our CSAF and VEX for device makers guide shows the format. Regenerate the SBOM, then confirm the new version shipped; our firmware diffing and patch analysis guide covers binary-level checks. The same method applies to other shared components: see our guides on BusyBox vulnerabilities, OpenSSL in embedded firmware and dnsmasq vulnerabilities.

AI-assisted analysis: what SoftWSP actually runs

SoftWSP's automated scan unpacks a firmware image, catalogs the components recorded in package databases such as opkg and dpkg, and matches each component's version against CVE records, CISA's KEV catalog and FIRST's EPSS scores. On an OpenWrt-based image, that is how lighttpd, its modules and uhttpd appear in the findings. 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 web server CVEs matched, which are KEV-listed or have a high EPSS score, and what the version evidence was, citing the component, version and record behind each sentence. An engineer reviews every finding before the report is delivered. The work this guide describes as manual stays with that engineer: finding GoAhead or Boa compiled into a vendor binary, which leaves no package record; mapping a uhttpd source date to fixes; checking which modules, CGI programs and listeners are active; and recording backports and "not affected" decisions.

For where web server 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 lighttpd release notes and its advisory directory, the Embedthis GoAhead README, security policy, release notes and GitHub advisories, the Boa home page and source snapshot, the ACME Labs mini_httpd page, OpenWrt's uHTTPd documentation, advisory 2020-01-13-1, uhttpd git history and package Makefile, Binarly BRLY-2024-002, Microsoft Threat Intelligence's November 2022 report, NVD, CISA's KEV catalog (version 2026.11.10) and FIRST EPSS data dated 2026-11-12, all read directly on 2026-11-13.

Put this guide to work

Frequently asked questions

Which embedded web server CVEs are known to be exploited?

Two web-server entries stand out in CISA's Known Exploited Vulnerabilities catalog (version 2026.11.10). CVE-2017-17562, added on 2021-12-10, lets an attacker execute code on Embedthis GoAhead before 3.6.5 when CGI is enabled and the CGI program is dynamically linked. CVE-2021-35395, added on 2021-11-03, covers buffer overflows in the management web server of the Realtek Jungle SDK, which ships one variant built on GoAhead (webs) and one built on Boa (boa). Both have FIRST EPSS scores above 0.97 as of 2026-11-12. No lighttpd, uhttpd or mini_httpd CVE was in the catalog in that release.

How do I tell which web server a firmware image runs?

Unpack the root file system and look in three places. First, the package database: OpenWrt-based images record uhttpd or lighttpd in the opkg status file, with a version. Second, the binaries: lighttpd embeds "lighttpd/1.4.xx", Boa embeds a Server header such as "Boa/0.94.14rc21", and mini_httpd embeds "mini_httpd/1.30 26Oct2018". Third, the init scripts and configuration, which show which binary actually starts and with which modules or CGI directories. GoAhead is a library that vendors compile into their own program, so search all executables for its strings rather than for a file named goahead.

Why do devices still ship Boa if it was abandoned in 2005?

Because it arrives inside chip-vendor SDKs, not as a choice each device maker makes. Microsoft Threat Intelligence reported in November 2022 that Boa, "discontinued in 2005," is still implemented across IoT devices and popular SDKs, and counted over 1 million internet-exposed Boa server components in one week. The SDK's own management pages, form handlers and CGI programs are built against Boa, so replacing it means porting that code. Many Boa CVEs are also in that SDK or vendor code rather than in Boa itself, which is why the upstream release from 2005 never fixes them.

Does upgrading GoAhead to 6.1.1 fix all its known vulnerabilities?

It fixes the 14 GitHub security advisories Embedthis published on 12 October and 8 November 2026, which all list 6.1.1 as the patched version, and the older CVEs fixed in earlier releases. GoAhead's security policy states that fixes are delivered in the current release only, with no backports to earlier releases, so a device on 2.5, 3.x or 4.x has to move to the current line or carry its own patches. Upgrading does not fix the device maker's own CGI programs, form handlers or route table, which is where many device-level GoAhead findings sit.

Does SoftWSP detect embedded web servers in my firmware?

SoftWSP's automated scan unpacks the image, catalogs components recorded in package databases such as opkg and dpkg, and matches their versions against CVE records, CISA's KEV catalog and FIRST EPSS scores. A lighttpd or uhttpd package on an OpenWrt-based image is found that way. A GoAhead or Boa server compiled into a vendor's own binary leaves no package record, and identifying it from strings, along with checking which modules, CGI paths and listeners are active, is part of the engineer review that every report goes through.

Sources

  1. lighttpd: 1.4.83 release notes (14 June 2026, security fixes)
  2. lighttpd: 1.4.80 release notes (13 August 2025, HTTP/2 MadeYouReset CVE-2025-8671)
  3. lighttpd: 1.4.81 release notes (17 August 2025, reject disallowed trailers)
  4. lighttpd: security advisory and patch directory (2007 to 2014)
  5. Binarly BRLY-2024-002: OOB read in lighttpd 1.4.45 used in Intel M70KLP series firmware (CVE-2018-25103)
  6. Embedthis GoAhead: repository README (status and EU Cyber Resilience Act notes)
  7. Embedthis GoAhead: security advisories (GitHub Security Advisories)
  8. Embedthis GoAhead: security policy (supported versions)
  9. Embedthis GoAhead: v6.1.1 release notes
  10. Boa Webserver home page (Larry Doolittle and Jon Nelson)
  11. Microsoft Threat Intelligence: Vulnerable SDK components lead to supply chain risks in IoT and OT environments (22 November 2022)
  12. OpenWrt: uHTTPd web server configuration
  13. OpenWrt Security Advisory 2020-01-13-1: uhttpd invalid data access via HTTP POST request (CVE-2019-19945)
  14. OpenWrt: uhttpd source repository (git.openwrt.org)
  15. OpenWrt: uhttpd package Makefile
  16. ACME Labs: mini_httpd home page and change history
  17. NIST NVD: CVE-2017-17562 (Embedthis GoAhead CGI environment)
  18. NIST NVD: CVE-2021-35395 (Realtek Jungle SDK web server)
  19. NIST NVD: CVE-2017-9833 (Boa /cgi-bin/wapopen, disputed)
  20. CISA: Known Exploited Vulnerabilities (KEV) Catalog
Was this guide helpful?

In this cluster

Embedded web server vulnerabilities in firmware: lighttpd, GoAhead, Boa and uhttpd