
Apache Traffic Server 10.2.0 - Élevé - À distance - Écriture de fichier - magick convert non signé écrit en tant que nobody
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-magick-unsigned
Classe : Écriture de fichier Portée : Distante
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Le module expérimental magick exécute ConvertImageCommand d'ImageMagick à partir de ?magick= (argv de conversion en percent+base64) lorsque plugin.config ne contient aucune clé RSA. verified = nullptr == key_. Le README indique que la clé existe pour éviter d'être exploité. Charger magick.so sans argument correspond au comportement par défaut du plugin.
Un CONTROL signé avec une clé publique RSA dans plugin.config renvoie 403, sans fichier témoin. La classe reste Écriture de fichier. Le policy.xml de la distribution désactive souvent les délégués URL/shell. Ne pas surévaluer en RCE.
| ID | pas encore de CVE |
| Classe | Écriture de fichier (argv de conversion non signé) |
| Portée | Distante (HTTP non authentifié ?magick= via magick.so sans clé) |
| CWE | CWE-347, CWE-73 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Produit | Apache Traffic Server |
| Affecté | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) conversion non signée du module expérimental magick |
| Auth | aucune |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18800 uniquement |
J'ai épinglé le tag public 10.2.0 correspondant au commit b1df7334. Le lab est un reverse proxy ats-10.2.0-lab:local compilé depuis les sources sur la boucle locale. La conversion non signée -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS. Fichier témoin de 161 octets appartenant à nobody. CONTROL signé 403.
GET /img.png?magick= non authentifié contre une image d'origine d'un Content-Type compatible, avec magick.so chargé et sans clé RSA.
| Méthode | Point d'impact | Privilège |
|---|---|---|
GET /img.png?magick= non authentifié, conversion non signée -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS | verified = nullptr == key_ (magick.cc:593-609) puis ConvertImageCommand | Intégrité / Fichier (prouvé en lab) : fichier témoin de 161 octets appartenant à nobody. Journaux ImageMagick's syntax. HTTP 200. |
Même requête avec une clé RSA dans plugin.config | EVP_DigestVerify | Fermé (prouvé en lab) : 403 échec de vérification de signature. Aucun fichier témoin. |
| Blob d'origine volumineux | blob_ non borné | Disponibilité (déduit) : pression sur la mémoire du processus. Voisin du plafond de CVE-2026-58186. Pas cette ligne Élevé. |
| Délégués URL / shell d'IM | policy.xml | Fermé dans ce lab : délégués HTTP/HTTPS/URL/MVG/shell absents. Ne pas qualifier de RCE. |
Prouvé en lab vs déduit : écriture de fichier non signée en tant que nobody, 403 signé, journal de syntaxe sont prouvés en lab. Le DoS par blob non borné est déduit. La RCE n'est pas revendiquée.
Nécessite : le module expérimental magick.so sans clé de vérification, plus un policy.xml d'ImageMagick qui autorise encore l'écriture via le chemin de conversion. Non chargé dans le plugin.config par défaut.
| Surface | Lab |
|---|---|
| magick chargé avec une clé publique RSA | CONTROL 403, control-sigfail=yes, aucun fichier |
| magick non chargé | le paramètre magick est inerte |
wasm WASI path_open | NOENT |
| Corps de requête comme entrée IM | le blob de réponse d'origine est l'entrée |
| décodage borné de webp_transform | CVE-2026-58186 fermé ; le blob magick est le voisin qui n'a pas été borné |
Ce n'est pas CVE-2026-58186. Le README de Magick indiquait déjà que la clé existe pour éviter d'être exploitée. Ce qui reste, c'est le chargement du plugin sans cette clé.
python3 ats-magick-unsigned-Abraxas-Labs.py
ou
cd lab
./run.sh
Loopback 127.0.0.1:18800 (CONTROL signé sur un second listener). Projet Compose ats-magick-unsigned. Image ats-10.2.0-lab:local. Témoin ATS-MAGICK-UNSIGNED-WITNESS. Dernière ligne :
SUCCESS ats-magick-unsigned unsigned-http=200 file-write=yes uid=nobody syntax-log=true control-http=403 control-sigfail=yes ATS-MAGICK-UNSIGNED-WITNESS
Échouer en mode fermé lorsque key_ est null. Ne pas exécuter ConvertImageCommand sur le ?magick= du client sans un magickSig vérifié. Traiter une clé manquante comme « plugin mal configuré », et non comme « une conversion non signée est acceptable ». Plafonner blob_ de la même manière que webp_transform a été plafonné.
En attendant, ne pas charger magick.so sans une clé publique RSA de taille production. Le policy.xml de la distribution ne remplace pas la signature.
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/magick/magick.cc verified = nullptr == key_plugins/experimental/magick/README