
Apache Traffic Server 10.2.0 - Alta - Remoto - Scrittura di file - magick convert senza firma scrive come nobody
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-magick-unsigned
Classe: Scrittura file Portata: Remota
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
La magick sperimentale esegue ConvertImageCommand di ImageMagick da ?magick= (argv di convert in percent+base64) quando plugin.config non contiene alcuna chiave RSA. verified = nullptr == key_. Il README afferma che la chiave esiste per evitare di essere sfruttati. Caricare magick.so senza argomenti è il comportamento predefinito del plugin.
Un CONTROL firmato con una chiave pubblica RSA su plugin.config restituisce 403, nessun file testimone. La classe resta Scrittura file. Il policy.xml della distribuzione spesso disabilita i delegate URL/shell. Non gonfiare a RCE.
| ID | nessuna CVE al momento |
| Classe | Scrittura file (argv di convert non firmato) |
| Portata | Remota (?magick= HTTP non autenticato tramite magick.so senza chiave) |
| CWE | CWE-347, CWE-73 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Prodotto | Apache Traffic Server |
| Affetto | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) magick sperimentale convert non firmato |
| Auth | nessuna |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18800 |
Ho fissato il tag pubblico 10.2.0 peel b1df7334. Il lab è un reverse proxy ats-10.2.0-lab:local compilato dai sorgenti su loopback. Convert non firmato -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS. File testimone di 161 byte con proprietario nobody. CONTROL firmato 403.
GET /img.png?magick= non autenticato contro un'immagine di origine con un Content-Type compatibile, con magick.so caricato e nessuna chiave RSA.
| Metodo | Sink | Privilegio |
|---|---|---|
GET /img.png?magick= non autenticato convert non firmato -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS | verified = nullptr == key_ (magick.cc:593-609) poi ConvertImageCommand | Integrità / File (dimostrato in lab): file testimone di 161 byte con proprietario nobody. Log ImageMagick's syntax. HTTP 200. |
Stessa query con chiave RSA su plugin.config | EVP_DigestVerify | Chiuso (dimostrato in lab): 403 verifica della firma fallita. Nessun file testimone. |
| Blob di origine enorme | blob_ senza limiti | Disponibilità (inferito): pressione sulla memoria del processo. Simile al limite di CVE-2026-58186. Non questa riga Alto. |
| Delegate URL / shell di IM | policy.xml | Chiuso in questo lab: delegate HTTP/HTTPS/URL/MVG/shell nessuno. Non chiamarlo RCE. |
Dimostrato in lab vs inferito: scrittura file non firmata come nobody, 403 firmato, log di sintassi sono da lab. Il DoS da blob senza limiti è inferito. RCE non è rivendicato.
Richiede: magick.so sperimentale senza chiave di verifica, più un policy.xml di ImageMagick che consenta ancora la scrittura del percorso di convert. Non caricato nel plugin.config predefinito.
| Superficie | Lab |
|---|---|
| magick caricato con una chiave pubblica RSA | CONTROL 403, control-sigfail=yes, nessun file |
| magick non caricato | la query magick è inerte |
wasm WASI path_open | NOENT |
| Corpo della richiesta come input di IM | il blob della risposta di origine è l'input |
| decodifica vincolata di webp_transform | CVE-2026-58186 chiusa; il blob di magick è il simile che non era vincolato |
Non è CVE-2026-58186. Il README di Magick diceva già che la chiave esiste per evitare di essere sfruttata. Ciò che rimane è il caricamento del plugin senza quella chiave.
python3 ats-magick-unsigned-Abraxas-Labs.py
o
cd lab
./run.sh
Loopback 127.0.0.1:18800 (CONTROL firmato su un secondo listener). Progetto Compose ats-magick-unsigned. Immagine ats-10.2.0-lab:local. Witness ATS-MAGICK-UNSIGNED-WITNESS. Ultima riga:
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
Fallire in modo sicuro quando key_ è null. Non eseguire ConvertImageCommand sul client ?magick= senza un magickSig verificato. Trattare una chiave mancante come "plugin misconfigurato", non come "conversione non firmata va bene". Limitare blob_ allo stesso modo in cui è stato limitato webp_transform.
Fino ad allora, non caricare magick.so senza una chiave pubblica RSA di dimensioni di produzione. Il policy.xml della distribuzione non sostituisce la firma.
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/magick/magick.cc verified = nullptr == key_plugins/experimental/magick/README