CVE-2020-15049

9.9 CRITICAL

📋 TL;DR

This CVE describes an HTTP request smuggling vulnerability in Squid proxy/cache servers. Attackers can send specially crafted HTTP requests with malformed Content-Length headers to poison the cache or smuggle requests through the proxy. This affects Squid installations acting as HTTP caches or reverse proxies.

💻 Affected Systems

Products:
  • Squid
Versions: Squid before 4.12 and 5.x before 5.0.3
Operating Systems: All operating systems running affected Squid versions
Default Config Vulnerable: ⚠️ Yes
Notes: Only affects Squid configurations using HTTP caching or acting as reverse proxy. Transparent proxy configurations are also vulnerable.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Complete cache poisoning allowing attackers to serve malicious content to legitimate users, credential theft via request smuggling, and potential backend system compromise.

🟠

Likely Case

Cache poisoning leading to users receiving incorrect or malicious content, potential session hijacking, and data leakage.

🟢

If Mitigated

Limited impact if Squid is not exposed to untrusted clients or if strict request validation is implemented.

🌐 Internet-Facing: HIGH
🏢 Internal Only: MEDIUM

🎯 Exploit Status

Public PoC: ⚠️ Yes
Weaponized: LIKELY
Unauthenticated Exploit: ⚠️ Yes
Complexity: LOW

Exploitation requires sending specially crafted HTTP requests. Public proof-of-concept code exists in security advisories.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: Squid 4.12 or 5.0.3 and later

Vendor Advisory: https://github.com/squid-cache/squid/security/advisories/GHSA-qf3v-rc95-96j5

Restart Required: Yes

Instructions:

1. Backup current Squid configuration. 2. Upgrade to Squid 4.12 or 5.0.3+. 3. Apply patches from squid-cache.org if upgrading not possible. 4. Restart Squid service. 5. Verify fix with test requests.

🔧 Temporary Workarounds

Request validation via ACL

all

Block requests with malformed Content-Length headers using Squid ACLs

acl bad_content_length req_header Content-Length -i "^[+\-\s]"
http_access deny bad_content_length

Disable HTTP caching

all

Temporarily disable HTTP caching to prevent cache poisoning

cache deny all

🧯 If You Can't Patch

  • Implement network segmentation to limit Squid exposure to trusted clients only
  • Deploy WAF or reverse proxy in front of Squid to filter malformed requests

🔍 How to Verify

Check if Vulnerable:

Check Squid version and compare against affected versions. Test with crafted HTTP request containing Content-Length: +100 or Content-Length: -100.

Check Version:

squid -v | grep Version

Verify Fix Applied:

After patching, test with same malicious requests - they should be rejected or properly handled. Check that cache poisoning attempts fail.

📡 Detection & Monitoring

Log Indicators:

  • HTTP requests with Content-Length containing +, -, or unusual whitespace characters
  • Cache hits serving unexpected content
  • Multiple requests from single client with varying Content-Length

Network Indicators:

  • HTTP requests with malformed Content-Length headers
  • Unexpected cache responses to normal requests

SIEM Query:

source="squid" AND (Content-Length="+*" OR Content-Length="-*" OR Content-Length="\s*")

🔗 References

📤 Share & Export