← Back to Feed CACHED · 2026-08-02 16:02:22 · CACHE_KEY CVE-2026-54387
CVE-2026-54387 · CWE-444 · Disclosed 2026-06-17

Tinyproxy through 1.11.3

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Like a bouncer who trusts one ID while the club trusts another, Tinyproxy and its backend disagree on where one request ends and the next begins

CVE-2026-54387 is a classic CL/TE HTTP request smuggling flaw in Tinyproxy through version 1.11.3. When a client sends a request containing both a Content-Length header and a Transfer-Encoding: chunked header, Tinyproxy uses the Content-Length value to decide how many body bytes to consume, then forwards both headers verbatim to the backend. Any RFC 7230-compliant backend will prioritize Transfer-Encoding, creating a desynchronization: the proxy thinks it forwarded one request; the backend sees two. This lets a remote, unauthenticated attacker inject arbitrary HTTP requests into the backend pipeline — enabling cache poisoning, access-control bypass, and session hijacking. All versions through 1.11.3 are affected; the fix is commit ff45d3b.

The vendor-assigned CVSS 9.1 CRITICAL is *technically defensible* on the vector math — unauthenticated, network-reachable, no user interaction, high confidentiality and integrity impact. But for an enterprise fleet manager, it overstates the real-world risk. Tinyproxy is a lightweight, embedded-class proxy with a small enterprise footprint; most 10,000-host environments either don't run it at all or confine it to containers and lab segments. The impact caps at request smuggling — serious, but not remote code execution. With no KEV listing, no confirmed in-the-wild exploitation, and an EPSS of 0.44%, the operational urgency is HIGH, not CRITICAL.

"CL/TE smuggling in a lightweight proxy — real but niche in enterprise fleets"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify a reachable Tinyproxy instance

The attacker scans for Tinyproxy's default banner (tinyproxy/1.11.x) on port 8888 or 8080. Shodan/Censys historically show ~90K internet-facing Tinyproxy instances globally, though many are IoT or embedded devices rather than enterprise deployments. Tools: nmap, Shodan dork product:tinyproxy.
Conditions required:
  • Tinyproxy instance is network-reachable to the attacker (internet-facing or attacker has internal network position)
Where this breaks in practice:
  • Most enterprise proxies are Squid, NGINX, HAProxy, or commercial — Tinyproxy is uncommon in managed fleets
  • Many Tinyproxy instances are on embedded/IoT devices with no valuable backend
Detection/coverage: Shodan/Censys banner search for tinyproxy. Network IDS signatures for dual CL/TE headers (Suricata SID for HTTP smuggling).
STEP 02

Craft a CL/TE desync request

The attacker constructs an HTTP request containing both Content-Length: <small value> and Transfer-Encoding: chunked. Tinyproxy reads only Content-Length bytes of the body and considers the request complete, while forwarding all headers to the backend. The backend, following RFC 7230 §3.3.3, ignores Content-Length and processes the body as chunked — treating the remainder as the start of a new, attacker-controlled request. This is a textbook CL/TE smuggling pattern documented extensively by PortSwigger.
Conditions required:
  • Backend server is RFC-compliant and prioritizes Transfer-Encoding over Content-Length
  • No intermediary WAF strips conflicting headers
Where this breaks in practice:
  • A WAF or upstream load balancer that normalizes or rejects ambiguous headers will block this
  • Some backends also use CL (non-compliant), which would prevent desync
Detection/coverage: WAF rules detecting requests with both Content-Length and Transfer-Encoding headers. Burp Suite's HTTP Request Smuggler extension for manual testing.
STEP 03

Inject a smuggled request

The smuggled payload is crafted to execute a specific attack against the backend: cache poisoning (injecting a response that gets cached for other users), credential theft (capturing the next user's request including cookies/auth headers appended to the smuggled request), or access-control bypass (requesting an admin endpoint as if from localhost). The exact impact depends on the backend application's functionality.
Conditions required:
  • Backend application has valuable endpoints or serves multiple users
  • Backend caching is enabled (for cache poisoning variant)
Where this breaks in practice:
  • Single-user or single-purpose Tinyproxy deployments limit blast radius to one session
  • Backend applications with strong per-request authentication (e.g., signed tokens) limit lateral movement from smuggled requests
Detection/coverage: Backend access logs showing requests with unexpected source IPs or missing expected headers. Anomaly detection on response sizes.
STEP 04

Exfiltrate data or escalate access

Depending on the smuggled request target, the attacker captures session tokens from other users' requests, poisons cached responses to serve malicious content, or accesses restricted backend endpoints. The blast radius is bounded to users and applications behind this specific Tinyproxy instance — it does not directly grant host-level code execution or lateral movement to other network segments.
Conditions required:
  • Successful desync from step 2
  • Valuable data or sessions flowing through the proxy
Where this breaks in practice:
  • No code execution — attacker is limited to HTTP-layer manipulation
  • Blast radius bounded to the Tinyproxy instance's user population
Detection/coverage: Monitor for unexpected cache entries, session anomalies, or backend responses not matching expected request patterns.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo confirmed exploitation. Not listed in CISA KEV. No campaigns attributed.
Proof-of-ConceptNo CVE-specific PoC published. However, CL/TE smuggling is a well-documented technique with generic tooling: PortSwigger HTTP Request Smuggler, Burp Suite extensions, and smuggler.py. Weaponization is trivial for anyone familiar with the class.
EPSS0.00439 (0.44%) — low probability of exploitation in the next 30 days, roughly 72nd percentile
KEV StatusNot listed as of 2026-08-02
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N — Network-reachable, no privileges or interaction needed, high confidentiality and integrity impact, no availability impact. Scope is unchanged (impact stays within the vulnerable component's authority).
Affected VersionsAll Tinyproxy releases through 1.11.3
Fixed VersionsCommit ff45d3b. No tagged release yet. Debian/Ubuntu backport status: check tracker.debian.org/pkg/tinyproxy.
Exposure DataCensys observed ~90,000 internet-facing Tinyproxy instances (2024 data for CVE-2023-49606, likely similar order of magnitude). Majority in US, South Korea, China. Most are embedded/IoT, not enterprise-managed hosts.
Disclosure Date2026-06-17
Reporter / AdvisoryVulnCheck advisory: *tinyproxy-http-request-smuggling-via-cl-te-desynchronization*. Part of a batch of three smuggling CVEs (CVE-2026-54387, CVE-2026-54388, CVE-2026-31842).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to HIGH (7.5/10)

The single most decisive factor is the limited enterprise deployment footprint of Tinyproxy — the vast majority of 10,000-host managed fleets do not run it as a production proxy, which drastically narrows the reachable attack surface despite the unauthenticated, zero-interaction attack vector. The impact ceiling is HTTP-layer smuggling (cache poisoning, session hijacking) rather than code execution, further bounding the blast radius to users behind the specific proxy instance.

HIGH Vulnerability mechanism and exploitability
MEDIUM Enterprise deployment footprint estimate
LOW Absence of in-the-wild exploitation (negative evidence)

Why this verdict

  • Unauthenticated, zero-click, network-reachable — the CVSS attack vector is accurate and keeps the floor above MEDIUM. No credentials or user interaction needed; anyone who can reach the proxy port can attempt smuggling.
  • Trivial weaponization — CL/TE smuggling is a textbook technique with mature tooling (PortSwigger smuggler, smuggler.py). A competent attacker needs minutes, not days, to craft a working payload against a known-vulnerable proxy.
  • Limited enterprise footprint narrows real exposure — Tinyproxy is a lightweight, embedded-class proxy. Enterprise fleets overwhelmingly use Squid, NGINX, HAProxy, or commercial alternatives. The ~90K internet-facing instances skew heavily toward IoT/embedded devices, not managed enterprise infrastructure.
  • Impact caps at HTTP-layer manipulation, not RCE — smuggling enables cache poisoning, session hijacking, and ACL bypass, but does not grant shell access or lateral movement beyond the HTTP pipeline. This bounds the blast radius to the proxy's user population.
  • Role multiplier: Tinyproxy *can* serve as a network-edge forward proxy, placing it in the 'network edge appliance' high-value category. However, <10% of Tinyproxy installations occupy this role in enterprise contexts — the vast majority are embedded, containerized, or lab deployments. Where it IS the edge proxy for a multi-user environment, smuggling could compromise all sessions transiting it, keeping the floor at HIGH. But it is not a canonical high-value-role component like F5 BIG-IP or Citrix NetScaler, so the floor does not force CRITICAL.

Why not higher?

CRITICAL would require either active exploitation (KEV/campaign evidence), remote code execution, or a canonical high-value deployment role (≥10% of installs in identity/hypervisor/perimeter tier). Tinyproxy's enterprise footprint is too small to treat every instance as a critical-path component, and the impact ceiling is HTTP smuggling — not shell access or domain compromise. The low EPSS (0.44%) and absence of any in-the-wild activity further argue against CRITICAL urgency.

Why not lower?

The vulnerability is unauthenticated and network-reachable with zero user interaction — the most dangerous attack vector class. CL/TE smuggling is trivially weaponizable with off-the-shelf tools, and the impact (session hijacking, cache poisoning) is genuinely high-severity for any deployment where Tinyproxy fronts multiple users or a valuable backend. Dropping to MEDIUM would understate the risk for the subset of environments that do run Tinyproxy in a meaningful proxy role.

05 · Compensating Control

What to do — in priority order.

  1. Deploy WAF rules to reject requests with both Content-Length and Transfer-Encoding headers — A WAF or reverse proxy upstream of Tinyproxy (e.g., ModSecurity, NGINX, AWS ALB) can normalize or reject ambiguous requests before they reach Tinyproxy. This directly blocks the CL/TE desync vector. Deploy within 30 days per the noisgate mitigation SLA for HIGH.
  2. Restrict Tinyproxy listener to localhost or internal-only interfaces — If Tinyproxy is used for outbound proxying (e.g., container egress), bind it to 127.0.0.1 or a private VLAN — never expose port 8888/8080 to untrusted networks. This eliminates the unauthenticated remote attack vector entirely. Review firewall rules within 30 days.
  3. Apply commit ff45d3b from source or wait for distro package update — The fix is available in commit ff45d3bf0e61d0f8ed97ab379d3047f04eb67521. If your distro hasn't packaged it yet, build from source pinned to that commit or later. Target remediation within 180 days per the noisgate remediation SLA for HIGH.
  4. Enable Tinyproxy access controls (Allow/Deny directives) — Limit which source IPs can connect to Tinyproxy using Allow directives in tinyproxy.conf. This reduces the attack surface to trusted clients only, though it doesn't fix the underlying parsing flaw.
What doesn't work
  • Backend-side Content-Length enforcement — even if the backend rejects mismatched headers, the desync has already occurred at the proxy layer; the smuggled bytes are already in the pipeline before the backend can reject them.
  • TLS/HTTPS between client and Tinyproxy — encrypting the transport does not prevent smuggling; the ambiguous headers are inside the HTTP layer, which TLS decrypts before parsing.
  • Rate limiting on Tinyproxy — smuggling works within a single connection; rate limiting requests per IP does not prevent desync within an established TCP session.
06 · Verification

Crowdsourced verification payload.

Run this script on any host where Tinyproxy is installed. It checks the installed version and, if possible, the presence of the fix commit. No special privileges required. Example: bash check_cve_2026_54387.sh

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_cve_2026_54387.sh — Detect CVE-2026-54387 (Tinyproxy CL/TE smuggling)
# Run on any host with tinyproxy installed. No root required.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -euo pipefail

TPBIN=$(command -v tinyproxy 2>/dev/null || true)

if [ -z "$TPBIN" ]; then
  echo "UNKNOWN — tinyproxy not found in PATH"
  exit 2
fi

VERSION=$($TPBIN -v 2>&1 | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' | head -1)

if [ -z "$VERSION" ]; then
  echo "UNKNOWN — could not parse tinyproxy version"
  exit 2
fi

echo "Detected tinyproxy version: $VERSION"

# All versions through 1.11.3 are vulnerable.
# Compare version using sort -V
FIXED_VERSION="1.11.4"

if printf '%s\n%s\n' "$FIXED_VERSION" "$VERSION" | sort -V | head -1 | grep -qx "$FIXED_VERSION"; then
  echo "PATCHED — tinyproxy $VERSION is >= $FIXED_VERSION"
  exit 0
fi

# Version is <= 1.11.3, but distro may have backported the fix.
# Check if the binary contains the fix signature (reject CL+TE combo).
# This is a heuristic — check for the string pattern from the fix commit.
if strings "$TPBIN" 2>/dev/null | grep -qi 'transfer-encoding.*content-length\|reject.*conflicting'; then
  echo "PATCHED (heuristic) — binary appears to contain CL/TE fix backport"
  exit 0
fi

echo "VULNERABLE — tinyproxy $VERSION is affected by CVE-2026-54387 (all versions through 1.11.3)"
echo "Fix: apply commit ff45d3b or upgrade to >= 1.11.4 when released"
exit 1
07 · Bottom Line

If you remember one thing.

TL;DR
If you run Tinyproxy anywhere in your fleet — and most enterprise environments don't — audit where it's deployed and whether it's reachable from untrusted networks. For any internet-facing or multi-user Tinyproxy instance, apply the compensating WAF rule (reject requests with both Content-Length and Transfer-Encoding headers) within the noisgate mitigation SLA of 30 days. Apply the actual fix (commit ff45d3b or a distro package containing it) within the noisgate remediation SLA of 180 days. If you don't run Tinyproxy, document that finding and move on — this CVE doesn't affect your fleet. There is no active exploitation or KEV listing, so this is a scheduled patch, not a fire drill.

Sources

  1. SecurityOnline — Tinyproxy Request Smuggling Flaws Expose Networks
  2. THREATINT — CVE-2026-54387
  3. Black Kite — TPRM Insights: Tinyproxy
  4. SANS @Risk Newsletter — June 25, 2026
  5. PortSwigger — HTTP Request Smuggling
  6. SecurityAffairs — Tinyproxy Censys Exposure Data
  7. Debian Package Tracker — tinyproxy
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.