
Reproduziert nicht authentifizierten ZendTo-ClamAV-RCE und Root-Rechteausweitung in einer autorisierten Laborumgebung, mit festgepinntem Docker-Ziel, Fail-Closed-Verifizierung, Nonce-gebundener Ausgabe und Bereinigung.
Dieses Verzeichnis ist ein eigenständiges Reproduktionsbündel für autorisierte Labore der kontolosen ZendTo-zu-ClamAV-Code-Ausführungskette sowie ihrer separaten Smarty-/Root-Cron-Fortführung mit Standardprofil. Es enthält:
Der initiale PoC führt einen vom Aufrufer gewählten Befehl als das Standard-Dienstkonto clamav aus. Die optionale Variante erweitert diesen kontolosen Einstiegspunkt zu einem vom Aufrufer gewählten Befehl als root. Beide verwenden standardmäßig id, lehnen den wörtlichen Pfad /root/flag ab und liefern nonce-gebundene Ausgaben über HTTPS.
Die verwundbaren Gruppen-, Verzeichnis-, Smarty- und Root-Cron-Beziehungen entsprechen den Debian-Paket-/Installationsstandardwerten von ZendTo. Die Erreichbarkeit von root ist dennoch umgebungsabhängig: Diese exakte positive Testumgebung verwendet ein ext4-gestütztes /var/zendto-Volume, funktionierendes PHP-CLI-FFI/POSIX/exec und einen uneingeschränkten clamd-Prozess. Das Erzwingen von AppArmor/SELinux oder inkompatible Dateisystem-Semantik kann die Fortführung auf einer ansonsten unveränderten Installation blockieren.
Verwenden Sie dies nur auf der enthaltenen Wegwerf-Testumgebung oder einem anderen System, das Sie ausdrücklich testen dürfen.
Das maßgebliche exakte Ziel ist ein lokales, absichtlich nicht versioniertes Artefakt unter:
image/zendto-installer-systemd-debian12.tar.zst
Git ignoriert Docker-Image-Archive. Legen Sie vor der exakten Regression eine autorisierte lokale Kopie an diesem Pfad ab; scripts/setup.sh erwartet die aufgezeichnete SHA-256-Prüfsumme und Image-ID. source-recipe/README.md dokumentiert, wie das aus dem Installer abgeleitete Image erstellt und erfasst wurde. Ein neuer Build aus Live-Paketquellen ist für Topologietests nützlich, wird aber nicht als byte-identisch mit dem gepinnten Ziel angenommen.
Das Setup und der Container-Entrypoint lehnen jede Abweichung vom folgenden Profil ab:
| Komponente | Exakt getesteter Wert |
|---|---|
| Docker-Image-ID | sha256:de6d2f06ca04943362a9bdec5026e808448953728f31bd926343a4ed2ca2ef7c |
| ZendTo | 6.15-8 |
| ClamAV/libclamav-Paket | 1.4.3+dfsg-1~deb12u2 |
| libclamav | libclamav.so.12.0.3, SHA-256 55e3cd94…027c |
| libclamav-Build-ID | e6427ab62146ee3001fe463d12e797e9d25bf81a |
| glibc | 2.36-9+deb12u14, SHA-256 6b4a4535…421 |
| main-Datenbank | v63, SHA-256 0b2182d2…365 |
| daily-Datenbank | v28082, SHA-256 cddbcccf…906 |
| bytecode-Datenbank | v339, SHA-256 6d4aa01f…ffb |
| clamd | MaxThreads 12, IdleTimeout 30, Restart=no |
| Lebenszyklus | aktivierter clamav-daemon.socket, systemd-PID 1 |
| Web-Laufzeit | Apache 2.4.68, PHP 8.2.32 |
| MAC-Haltung | uneingeschränkte privilegierte Docker-Testumgebung |
| Root-Brücke | Standard-clamav in www-data; /var/zendto root:www-data 0775 |
| Root-Konsument | Standard-Root-Cleanup-Cron, stündlich zur Minute 25 |
| Smarty-Cache | deterministisch kompiliertes Smarty 4.5.4 zendto.conf |
| Austausch-Dateisystem | ext4-gestütztes benanntes /var/zendto-Volume |
Die vollständigen Werte stehen in PROFILE.json.
Das ist stärker als nur die ClamAV-Paketversion zu pinnen. Die Allokator-Konstruktion hängt ebenfalls von glibc, dem CVD-gesteuerten Parser-Verkehr, den Worker-Einstellungen und der exakten Ziellibrary ab. FreshClam ist im erfassten Image deaktiviert, und der Start schlägt fehl, wenn daily.cvd abgewichen ist oder eine daily.cld aufgetaucht ist.
Der derzeit langlaufende Forschungscontainer im übergeordneten Workspace ist nicht die saubere Testumgebung: Spätere Tests haben dessen Formular für externe Absender deaktiviert und seine daily-Datenbank aktualisiert. Diese Änderungen sind hier bewusst ausgeschlossen. Dieses Bündel verwendet die saubere Baseline, gegen die die native Ausführung demonstriert wurde.
/sys/fs/cgroupzstd, Python 3 mit venv, ein C-Compiler, file und GNU readelfDas Ziel teilt sich den Host-Kernel und die ASLR-Implementierung. Kernabhängiges Mapping-Verhalten bleibt daher eine Portabilitätsvariable.
Es sollte jeweils nur eine systemd-Testumgebung den Host-cgroup-Namespace teilen. Stoppen Sie auf dem ursprünglichen Forschungsrechner die ältere Testumgebung, ohne sie zu löschen:
docker stop zendto-installer-systemd-native
Sie kann später mit docker start zendto-installer-systemd-native wiederhergestellt werden.
Aus diesem Verzeichnis:
./scripts/verify-bundle.sh
./scripts/setup.sh
Das Setup-Skript:
.venv mit den gepinnten Python-Abhängigkeiten des PoC;/var/zendto-Volume und startet systemd; undrenameat2(RENAME_EXCHANGE), die als clamav ausgeführt wird.Die Standard-Endpunkte sind nur auf Loopback erreichbar:
http://127.0.0.1:18084/
https://127.0.0.1:18447/
Das Zertifikat ist selbstsigniert. Der PoC verwendet für jede HTTP-Anfrage bewusst verify=False. Vor dem Setup können andere Loopback-Ports gewählt werden:
export ZENDTO_HTTP_PORT=19084
export ZENDTO_HTTPS_PORT=19447
./scripts/setup.sh
Verwenden Sie für spätere Compose-/Helfer-Befehle dieselben Umgebungsvariablen.
Überprüfen Sie das Ziel jederzeit:
./scripts/verify-target.sh
docker compose ps
Die saubere Installer-Baseline enthält:
allowExternalUploads = TRUE
confirmExternalEmails = TRUE
captcha = google
Seine CAPTCHA- und Mail-Werte sind Installer-Platzhalter, sodass das unveränderte Archiv die öffentliche Verifikations-E-Mail nicht tatsächlich zustellen kann. Das native Regressionstesten hat nur diesen abgeschlossenen Anwendungsschritt durch eine äquivalente AuthData-Zeile für externe Absender repräsentiert. Der Zielcode, die Pakete, der Scanner, die Berechtigungen und der Exploit-Pfad wurden nicht gepatcht.
Erstellen Sie diese eine Labor-Zeile und eine Token-Datei mit Modus 0600 mit:
./scripts/mint-lab-auth.py [email protected]
Der Token-Wert wird nicht ausgegeben und unter folgendem Pfad gespeichert:
.lab/upload-auth-token.txt
Dieser lokale Helfer ist keine Behauptung, dass eine Bereitstellung mit deaktiviertem externen Upload aus der Ferne ausgenutzt werden kann. Wenn das öffentliche Formular für externe Absender deaktiviert ist, stoppt der PoC korrekt vor ClamAV, selbst wenn eine Token-Datei bereitgestellt wird.