← Back to Feed CACHED · 2026-10-21 22:11:58 · CACHE_KEY CVE-2026-111813
CVE-2026-111813 · CWE-88 · Disclosed 2026-10-21

Apache Traffic Server experimental magick plugin unauthenticated argument injection via unvalidated query strings

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

A rarely-used experimental darkroom in the CDN basement left its door unlocked and its power tools running

CVE-2026-111813 is an argument injection flaw (CWE-88) in the experimental magick plugin bundled with Apache Traffic Server (ATS). The plugin lives in plugins/experimental/magick/ and is designed to perform on-the-fly image format conversion (JPEG/PNG ↔ WebP) by shelling out to ImageMagick's convert binary. In its default *unsigned* configuration, the plugin passes client-supplied HTTP query-string parameters directly into the convert command line without any sanitization or allowlisting. An unauthenticated remote attacker can therefore inject arbitrary ImageMagick arguments — including -write, msl:, TEXT:, and delegate-triggering pseudo-protocols — to achieve file read, arbitrary file write, and ultimately remote code execution running as the ATS process user. Affected versions span ATS 8.0.1–8.1.11, 9.0.0–9.2.15, 10.0.0–10.1.4, and 10.2.0. Fixes land in 9.2.16, 10.1.5, and 10.2.1.

Apache scored this a perfect CVSS 10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H), and for the narrow population running this plugin, that score is honest — pre-auth, zero-click, scope-changed RCE on an edge device is as bad as it gets. But the vendor score treats the plugin as universally active. In reality, magick is an experimental plugin that must be manually added to plugin.config; it is not compiled into default builds of ATS, not loaded by default, and not documented as production-ready. ZoomEye counts ~311K internet-facing ATS instances, but the fraction actually loading the experimental magick plugin is conservatively <5%, likely <2%. The vendor's CVSS is the rating for a specific, rare configuration — not for the ATS fleet at large. noisgate downgrades the fleet-wide risk to HIGH 7.5 while emphasizing that any deployment confirmed to run this plugin should treat it as an emergency.

"Experimental opt-in plugin caps real-world exposure; lethal when active, dormant everywhere else."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify ATS with magick plugin active

The attacker fingerprints an internet-facing ATS instance (Server header leaks version) and probes for the magick plugin's URL routing. Because the plugin typically maps to image-conversion endpoints (e.g., ?format=webp&quality=80), the attacker sends innocuous conversion requests and observes response headers and content-type behavior to confirm the plugin is loaded. Shodan/ZoomEye dorks for ATS are well-known.
Conditions required:
  • ATS instance is internet-facing
  • Experimental magick plugin is enabled in plugin.config
  • Plugin routes are reachable (not behind a WAF blocking image-conversion paths)
Where this breaks in practice:
  • The magick plugin is experimental and must be manually opted in — most ATS deployments do not load it
  • Plugin routes may be mapped to internal-only vhosts, not the public edge
Detection/coverage: Shodan query Server: ATS returns ~311K hosts. No scanner currently fingerprints the magick plugin specifically. Custom HTTP probing for format-conversion query parameters is required.
STEP 02

Inject ImageMagick arguments via query string

The attacker crafts a URL whose query parameters include ImageMagick CLI flags such as -write /tmp/proof.txt or -caption @/etc/passwd. Because the plugin concatenates query-string key-value pairs into the convert argument vector without sanitization, these flags are interpreted by ImageMagick as legitimate arguments. The attacker confirms file read via TEXT:/etc/passwd (contents rendered into a returned image) or file write via -write.
Conditions required:
  • Plugin is in default (unsigned) mode — no URL-signature validation on query strings
  • ImageMagick convert binary is installed and in the ATS process's PATH
Where this breaks in practice:
  • If the operator has enabled url_sig or uri_signing on this route, query parameters are validated and tampered strings are rejected with 403
  • A restrictive ImageMagick policy.xml on the host can block dangerous coders/delegates
Detection/coverage: WAF rules looking for ImageMagick flags (-write, -script, msl:, ephemeral:, TEXT:) in query strings would catch this. No default Snort/Suricata signature exists yet.
STEP 03

Escalate to RCE via MSL or delegate abuse

With argument control confirmed, the attacker pivots to full code execution. The two proven paths are: (a) MSL injection — inject msl:/tmp/payload.msl where the payload XML uses <read> and <write> to place a webshell or cron job; or (b) delegate command injection — craft an input that triggers a delegate (e.g., Ghostscript for EPS/PS) where the delegate command string in delegates.xml expands attacker-controlled %M into a shell metacharacter. Both are well-documented in ImageTragick-era research (CVE-2016-3714 and successors).
Conditions required:
  • ImageMagick delegates (Ghostscript, etc.) are installed or MSL coder is not disabled in policy.xml
  • Attacker can upload or reference a secondary file (for MSL), OR the delegate path is directly reachable
Where this breaks in practice:
  • Modern distro ImageMagick packages ship with somewhat restrictive policy.xml by default (though many operators loosen it for the plugin to function)
  • AppArmor/SELinux in enforcing mode may block write to sensitive paths
Detection/coverage: EDR/HIDS alerting on convert spawning child processes (Ghostscript, shell) or writing outside expected directories. Auditd rules on /tmp file creation by the ATS user.
STEP 04

Leverage edge position for lateral movement

With code execution as the ATS service user on an edge/CDN node, the attacker is positioned in front of the origin fleet. They can intercept proxied traffic (credentials, session tokens, API keys in transit), pivot into the internal network via ATS's backend connections, or exfiltrate cached content. On ATS nodes with elevated privileges (common in container-less deployments binding to port 80/443), the attacker may already be root or one local-priv-esc away.
Conditions required:
  • ATS node has network reachability to internal origin servers
  • ATS service runs with non-minimal privileges or the host lacks local hardening
Where this breaks in practice:
  • Network segmentation between edge tier and internal tiers limits lateral movement
  • mTLS between ATS and origins prevents passive interception of backend traffic
Detection/coverage: NetFlow/connection anomaly detection for unusual outbound connections from CDN edge nodes. SIEM correlation of new processes on ATS hosts.
03 · Compensating Control

1
HIGH 7.5→IGNORE 0.0
SEVERITY REDUCED
Disable the magick plugin immediately — Comment out or remove the magick.so line from plugin.config and reload ATS (traffic_ctl config reload). This completely eliminates the attack surface. If the plugin is not in your config, you are not vulnerable — confirm and document. Per noisgate mitigation SLA for HIGH, deploy within 30 days; however, given how easy disabling is (a one-line config change), do it today.
2
HIGH 7.5→LOW 2.5
SEVERITY REDUCED
Enable URL signing on magick plugin routes — If the plugin is business-critical and cannot be disabled, configure url_sig or uri_signing on all routes handled by the magick plugin. This adds HMAC-based query-string validation, rejecting any request with tampered or unsigned parameters (HTTP 403). The advisory specifically notes the flaw is in the *unsigned* configuration. Deploy within 30 days per noisgate mitigation SLA for HIGH.
3
HIGH 7.5→MEDIUM 5.0
SEVERITY REDUCED
Deploy restrictive ImageMagick policy.xml — Place a minimal policy.xml that disables all coders except JPEG, PNG, and WebP; blocks all delegates (especially Ghostscript); disables MSL, MVG, SVG, EPS, PS, PDF coders; and sets strict resource limits. Use SetMagickSecurityPolicy() or drop the file in ImageMagick's config directory. This degrades the argument injection from RCE to a nuisance (format conversion errors). Deploy within 30 days.
4
HIGH 7.5→MEDIUM 5.5
SEVERITY REDUCED
WAF rule to block ImageMagick flags in query strings — Add a WAF rule (ModSecurity, Cloudflare, AWS WAF) that blocks requests containing -write, +write, -script, msl:, ephemeral:, TEXT:, -caption, and delegates in query parameters destined for ATS image-conversion endpoints. This is a defense-in-depth layer, not a primary control — attackers may find encoding bypasses. Deploy within 30 days.
5
HIGH 7.5→IGNORE 0.0
SEVERITY REDUCED
Upgrade ATS to 9.2.16, 10.1.5, or 10.2.1 — The definitive fix. Patched versions sanitize query-string parameters before passing them to ImageMagick. Per noisgate remediation SLA for HIGH, apply within 180 days. If the magick plugin is actively used in production, prioritize this over compensating controls.
What doesn't work
  • Upgrading ImageMagick alone — the argument injection is in ATS's magick plugin code, not in ImageMagick itself. A newer ImageMagick version still executes the injected arguments faithfully.
  • Rate limiting — a single HTTP request is sufficient to achieve RCE. Rate limits do not help.
  • TLS/mTLS on the frontend — the attack payload travels in the query string of a normal HTTPS request. Encryption does not inspect or sanitize URL parameters.
  • Network-level IP allowlisting on ATS — ATS is a public-facing CDN/proxy; restricting source IPs defeats its purpose and is impractical for most deployments.
04 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNo evidence. Not listed in CISA KEV. No GreyNoise tags or Shadowserver scan reports as of 2026-10-22. Disclosed only yesterday (2026-10-21).
Proof-of-concept availabilityNo public PoC found. Checked pocindex.io (no entry), GitHub (no repos named CVE-2026-111813), and ExploitDB. However, the exploit is trivial to construct — ImageMagick argument injection is a solved problem (see HackerOne #212696 on Imgur, Synacktiv's ImageTragick research, Jorian Woltjer's IM exploitation guide). Expect weaponized PoC within days.
EPSS scoreNot yet scored — CVE was published 2026-10-21, EPSS model has not ingested it. Expect a moderate-to-high EPSS once scored, given the pre-auth remote vector, though the experimental-plugin constraint may dampen it.
CISA KEV statusNot listed as of 2026-10-22.
CVSS vector interpretationCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H — perfect 10.0. Scope: Changed is accurate (IM process is distinct from ATS). The score assumes the plugin is active, which is an opt-in configuration.
Affected version rangesATS 8.0.1–8.1.11, 9.0.0–9.2.15, 10.0.0–10.1.4, 10.2.0. Version 8.0.0 is *not* affected (plugin was introduced in 8.0.1).
Fixed versionsATS 9.2.16, 10.1.5, 10.2.1. No distro backports observed yet for Debian/RHEL/Amazon Linux (advisory ALAS2023-2026-1478 covers ImageMagick, not ATS).
Internet exposureZoomEye measured ~311,469 ATS instances (2026-10-03). Communication services (52.8%) and IT (44.4%) dominate. Fraction running the experimental magick plugin is unknown but estimated <5% based on its experimental status and niche use case.
Disclosure timelineCVE reserved 2026-10-16. Advisory published 2026-10-21. Part of a larger October 2026 Apache advisory batch covering multiple ATS CVEs (111804–111816).
CreditReported by Apache Community, The ASF, and Abraxas Labs per the CVE record.

Sources.

  1. CVE-2026-111813 — ThreatInt CVE database (CVSS vectors, timeline, credits)
  2. Strix.ai CVE-2026-111813 analysis (CVSS 4.0 + 3.1 scores, affected versions)
  3. HOL.org advisory — full CVE description and remediation
  4. GitHub Issue #13774 — webp_transform / magick plugin ImageMagick security policy gaps
  5. ATS experimental plugins directory (confirms magick is experimental)
  6. Jorian Woltjer — ImageMagick exploitation techniques (−write, MSL, delegates)
  7. HackerOne #212696 — Imgur RCE via ImageMagick argument injection (prior art)
  8. Offseq Radar — CVE-2026-111813 threat analysis
05 · The Call

Final Verdict
↓ DOWNGRADED to HIGH (7.5/10)

Why this verdict

  • Experimental, opt-in plugin: The magick plugin lives in plugins/experimental/, is not compiled or loaded by default, and must be manually added to plugin.config. This single prerequisite eliminates the vast majority of the ~311K internet-facing ATS fleet from the vulnerable population. Conservatively <5% of ATS deployments load this plugin. This is the dominant downward pressure, moving the baseline from 10.0 toward the 7–8 range.
  • No exploitation or PoC yet: As of 24 hours post-disclosure, there is no public PoC, no KEV listing, no GreyNoise scanning activity, and no EPSS score. The exploit is trivial to develop for anyone familiar with ImageMagick argument injection, so this friction is *temporary* — likely days, not weeks — but it currently reduces urgency.
  • Role multiplier: ATS is canonically a network edge appliance (CDN, reverse proxy, caching tier). On the subset of deployments where the magick plugin IS active, the blast radius is severe: the attacker lands pre-auth code execution on an edge node that sits in front of origin servers, can intercept proxied traffic, and can pivot internally. This means the floor for the verdict is HIGH — the edge-infrastructure role prevents downgrading further despite the limited install-base exposure. For the specific deployments running the plugin, the risk is effectively CRITICAL.
  • ImageMagick argument injection is a solved exploitation class: The technique has been public since ImageTragick (2016). Multiple documented paths from argument control to RCE exist (-write + BMP polyglot, msl: scripting, delegate command injection via Ghostscript). An attacker does not need a novel exploit — just the advisory title is enough to build a working chain. This prevents further downgrade.
  • Unsigned default configuration means no secondary gate: The advisory specifies the flaw exists in the *default (unsigned)* configuration. Operators who failed to layer url_sig or uri_signing on the magick plugin's routes have zero query-string validation. There is no secondary authentication or authorization step between the attacker and the ImageMagick command line.

Why not higher?

CRITICAL would be appropriate if the magick plugin were loaded by default or if a significant fraction (≥10%) of ATS deployments ran it. The plugin is experimental, opt-in, and serves a niche image-optimization use case. With <5% of the fleet plausibly affected, the population-level risk does not justify CRITICAL for fleet-wide prioritization. If active exploitation or a public PoC emerges, this should be immediately re-evaluated upward.

Why not lower?

MEDIUM is inappropriate because: (1) ATS is edge infrastructure — any RCE on an edge node has domain/fleet-scale blast radius via traffic interception and origin pivoting; (2) the attack is pre-auth, zero-click, and low-complexity for any deployment that does load the plugin; (3) ImageMagick argument injection is a mature, well-understood attack class with multiple reliable paths to code execution. The floor imposed by the edge-infrastructure role holds the verdict at HIGH.

06 · Verification

Crowdsourced verification payload.

Run this script on each ATS host (the machine running traffic_server). Requires read access to the ATS config directory (typically /etc/trafficserver/ or /opt/ts/etc/trafficserver/). Invoke as: sudo bash check_cve_2026_111813.sh — sudo is needed only if plugin.config is root-owned.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check_cve_2026_111813.sh — detect exposure to CVE-2026-111813
# Apache Traffic Server experimental magick plugin argument injection
# Output: VULNERABLE / PATCHED / UNKNOWN
set -euo pipefail

RESULT="UNKNOWN"

# --- Locate traffic_server binary ---
TS_BIN=$(command -v traffic_server 2>/dev/null || find /opt/ts /usr/local /usr -name traffic_server -type f 2>/dev/null | head -1)
if [[ -z "$TS_BIN" ]]; then
  echo "[!] traffic_server binary not found — ATS may not be installed."
  echo "UNKNOWN"
  exit 2
fi

# --- Get version ---
VERSION=$($TS_BIN --version 2>/dev/null | grep -oP '(?<=Traffic Server -- )[0-9]+\.[0-9]+\.[0-9]+' || echo "")
if [[ -z "$VERSION" ]]; then
  VERSION=$($TS_BIN -V 2>/dev/null | grep -oP '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || echo "")
fi
echo "[*] Detected ATS version: ${VERSION:-unknown}"

# --- Locate plugin.config ---
CONFDIR=$(traffic_layout info 2>/dev/null | grep -oP '(?<=SYSCONFDIR: ).*' || echo "")
if [[ -z "$CONFDIR" ]]; then
  for d in /etc/trafficserver /opt/ts/etc/trafficserver /usr/local/etc/trafficserver; do
    [[ -f "$d/plugin.config" ]] && CONFDIR="$d" && break
  done
fi
PLUGIN_CONF="${CONFDIR}/plugin.config"

if [[ ! -f "$PLUGIN_CONF" ]]; then
  echo "[!] plugin.config not found. Cannot determine if magick plugin is loaded."
  echo "UNKNOWN"
  exit 2
fi

# --- Check if magick plugin is loaded ---
MAGICK_LOADED=$(grep -E '^[^#]*magick\.so' "$PLUGIN_CONF" || true)
if [[ -z "$MAGICK_LOADED" ]]; then
  echo "[+] magick plugin is NOT loaded in plugin.config."
  echo "[+] This host is NOT affected by CVE-2026-111813."
  echo "PATCHED"
  exit 0
fi
echo "[!] magick plugin IS loaded: $MAGICK_LOADED"

# --- Version comparison ---
version_gte() {
  printf '%s\n%s' "$2" "$1" | sort -V -C
}

if [[ -n "$VERSION" ]]; then
  MAJOR=$(echo "$VERSION" | cut -d. -f1)
  case "$MAJOR" in
    8)
      if version_gte "$VERSION" "8.0.1" && ! version_gte "$VERSION" "8.2.0"; then
        echo "[!] ATS 8.x series (8.0.1-8.1.11) — no fix available for 8.x branch."
        RESULT="VULNERABLE"
      fi
      ;;
    9)
      if version_gte "$VERSION" "9.2.16"; then
        echo "[+] ATS $VERSION >= 9.2.16 — patched."
        RESULT="PATCHED"
      elif version_gte "$VERSION" "9.0.0"; then
        echo "[!] ATS $VERSION is in affected range 9.0.0-9.2.15."
        RESULT="VULNERABLE"
      fi
      ;;
    10)
      if version_gte "$VERSION" "10.2.1"; then
        echo "[+] ATS $VERSION >= 10.2.1 — patched."
        RESULT="PATCHED"
      elif version_gte "$VERSION" "10.1.5" && ! version_gte "$VERSION" "10.2.0"; then
        echo "[+] ATS $VERSION >= 10.1.5 (10.1.x branch) — patched."
        RESULT="PATCHED"
      elif version_gte "$VERSION" "10.0.0"; then
        echo "[!] ATS $VERSION is in affected range 10.0.0-10.1.4 or 10.2.0."
        RESULT="VULNERABLE"
      fi
      ;;
    *)
      echo "[?] Unexpected major version $MAJOR — cannot determine status."
      RESULT="UNKNOWN"
      ;;
  esac
else
  echo "[!] Could not determine ATS version."
  RESULT="UNKNOWN"
fi

if [[ "$RESULT" == "VULNERABLE" ]]; then
  echo ""
  echo "=== VULNERABLE ==="
  echo "The magick plugin is loaded AND the ATS version is in the affected range."
  echo "Immediate action: comment out magick.so in $PLUGIN_CONF and run: traffic_ctl config reload"
  exit 1
fi

echo "$RESULT"
[[ "$RESULT" == "PATCHED" ]] && exit 0
exit 2