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.
4 steps from start to impact.
Identify ATS with magick plugin active
?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.- ATS instance is internet-facing
- Experimental
magickplugin is enabled inplugin.config - Plugin routes are reachable (not behind a WAF blocking image-conversion paths)
- 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
Server: ATS returns ~311K hosts. No scanner currently fingerprints the magick plugin specifically. Custom HTTP probing for format-conversion query parameters is required.Inject ImageMagick arguments via query string
-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.- Plugin is in default (unsigned) mode — no URL-signature validation on query strings
- ImageMagick
convertbinary is installed and in the ATS process's PATH
- If the operator has enabled
url_sigoruri_signingon this route, query parameters are validated and tampered strings are rejected with 403 - A restrictive ImageMagick
policy.xmlon the host can block dangerous coders/delegates
-write, -script, msl:, ephemeral:, TEXT:) in query strings would catch this. No default Snort/Suricata signature exists yet.Escalate to RCE via MSL or delegate abuse
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).- 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
- Modern distro ImageMagick packages ship with somewhat restrictive
policy.xmlby default (though many operators loosen it for the plugin to function) - AppArmor/SELinux in enforcing mode may block write to sensitive paths
convert spawning child processes (Ghostscript, shell) or writing outside expected directories. Auditd rules on /tmp file creation by the ATS user.Leverage edge position for lateral movement
- ATS node has network reachability to internal origin servers
- ATS service runs with non-minimal privileges or the host lacks local hardening
- Network segmentation between edge tier and internal tiers limits lateral movement
- mTLS between ATS and origins prevents passive interception of backend traffic
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.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.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.-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.- 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.
The supporting signals.
| In-the-wild exploitation | No 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 availability | No 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 score | Not 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 status | Not listed as of 2026-10-22. |
| CVSS vector interpretation | CVSS: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 ranges | ATS 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 versions | ATS 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 exposure | ZoomEye 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 timeline | CVE reserved 2026-10-16. Advisory published 2026-10-21. Part of a larger October 2026 Apache advisory batch covering multiple ATS CVEs (111804–111816). |
| Credit | Reported by Apache Community, The ASF, and Abraxas Labs per the CVE record. |
Sources.
- CVE-2026-111813 — ThreatInt CVE database (CVSS vectors, timeline, credits)
- Strix.ai CVE-2026-111813 analysis (CVSS 4.0 + 3.1 scores, affected versions)
- HOL.org advisory — full CVE description and remediation
- GitHub Issue #13774 — webp_transform / magick plugin ImageMagick security policy gaps
- ATS experimental plugins directory (confirms magick is experimental)
- Jorian Woltjer — ImageMagick exploitation techniques (−write, MSL, delegates)
- HackerOne #212696 — Imgur RCE via ImageMagick argument injection (prior art)
- Offseq Radar — CVE-2026-111813 threat analysis
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 toplugin.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_sigoruri_signingon 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.
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.
#!/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