
Apache Traffic Server 10.2.0 – Hoch – Remote – Dateischreiben – unsigniertes magick convert schreibt als nobody
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-magick-unsigned
Klasse: Dateischreiben Reichweite: Remote
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Das experimentelle magick führt ImageMagick ConvertImageCommand aus ?magick= (prozent+base64-kodierte convert-argv) aus, wenn plugin.config keinen RSA-Schlüssel enthält. verified = nullptr == key_. Die README gibt an, dass der Schlüssel existiert, um eine Ausnutzung zu vermeiden. Das Laden von magick.so ohne Argumente ist der Plugin-Standard.
Signiertes CONTROL mit einem RSA-Public-Key in plugin.config ergibt 403, keine Witness-Datei. Die Klasse bleibt Dateischreiben. Die policy.xml der Distribution deaktiviert häufig URL-/Shell-Delegates. Nicht zu RCE hochstufen.
| ID | noch keine CVE |
| Klasse | Dateischreiben (unsignierte convert-argv) |
| Reichweite | Remote (unauthentifiziertes HTTP ?magick= über magick.so ohne Schlüssel) |
| CWE | CWE-347, CWE-73 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| Produkt | Apache Traffic Server |
| Betroffen | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) experimentelles magick mit unsigniertem convert |
| Auth | keine |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18800 |
Ich habe den öffentlichen Tag 10.2.0 auf den Commit b1df7334 festgelegt. Das Lab ist ein aus dem Quellcode gebauter ats-10.2.0-lab:local-Reverse-Proxy auf Loopback. Unsigned convert -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS. Witness-Datei 161 Bytes, Eigentümer nobody. Signiertes CONTROL 403.
Unauth GET /img.png?magick= gegen ein Origin-Bild mit kompatiblem Content-Type, mit geladenem magick.so und ohne RSA-Schlüssel.
| Methode | Sink | Berechtigung |
|---|---|---|
Unauth GET /img.png?magick= unsigniertes convert -write png:/tmp/oracle/ATS-MAGICK-UNSIGNED-WITNESS | verified = nullptr == key_ (magick.cc:593-609), dann ConvertImageCommand | Integrität / Datei (im Lab nachgewiesen): 161-Byte-Witness-Datei, Eigentümer nobody. Logs ImageMagick's syntax. HTTP 200. |
Dieselbe Abfrage mit RSA-Schlüssel in plugin.config | EVP_DigestVerify | Geschlossen (im Lab nachgewiesen): 403 Signaturprüfung fehlgeschlagen. Keine Witness-Datei. |
| Riesiger Origin-Blob | unbegrenztes blob_ | Verfügbarkeit (abgeleitet): Speicherdruck des Prozesses. Pendant zur Begrenzung von CVE-2026-58186. Nicht diese Hoch-Zeile. |
| IM-URL-/Shell-Delegates | policy.xml | In diesem Lab geschlossen: HTTP/HTTPS/URL/MVG/Shell-Delegates keine. Nicht als RCE bezeichnen. |
Im Lab nachgewiesen vs. abgeleitet: unsigniertes Dateischreiben als nobody, signiert 403, Syntax-Log sind Lab. Unbegrenzter Blob-DoS ist abgeleitet. RCE wird nicht behauptet.
Voraussetzungen: experimentelles magick.so ohne Verifikationsschlüssel, plus ImageMagick policy.xml, die den Schreibpfad von convert weiterhin erlaubt. In der Standard-plugin.config nicht geladen.
| Angriffsfläche | Lab |
|---|---|
| magick geladen mit einem RSA-Public-Key | CONTROL 403, control-sigfail=yes, keine Datei |
| magick nicht geladen | Abfrage magick ist wirkungslos |
wasm WASI path_open | NOENT |
| Request-Body als IM-Eingabe | Origin-Response-Blob ist die Eingabe |
| webp_transform begrenzte Dekodierung | CVE-2026-58186 geschlossen; magick-Blob ist das Pendant, das nicht begrenzt wurde |
Nicht CVE-2026-58186. Die Magick-README besagte bereits, dass der Schlüssel existiert, um eine Ausnutzung zu vermeiden. Das Übriggebliebene ist das Laden des Plugins ohne diesen Schlüssel.
python3 ats-magick-unsigned-Abraxas-Labs.py
oder
cd lab
./run.sh
Loopback 127.0.0.1:18800 (signiertes CONTROL auf einem zweiten Listener). Compose-Projekt ats-magick-unsigned. Image ats-10.2.0-lab:local. Witness ATS-MAGICK-UNSIGNED-WITNESS. Letzte Zeile:
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
Fail closed, wenn key_ null ist. Führe ConvertImageCommand nicht auf Client-?magick= ohne verifizierte magickSig aus. Behandle einen fehlenden Schlüssel als „Plugin fehlkonfiguriert“, nicht als „unsignierte Konvertierung ist in Ordnung“. Begrenze blob_ so, wie webp_transform begrenzt wurde.
Bis dahin lade magick.so nicht ohne einen RSA-Public-Key in Produktionsgröße. Die policy.xml der Distribution ist kein Ersatz für die Signatur.
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/magick/magick.cc verified = nullptr == key_plugins/experimental/magick/README