
ProFTPD 1.3.9d – Hoch – Remote – Absturz – RewriteMap int:utf8trans BSS-Überlauf
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-rewrite-utf8trans
Klasse: Crash Reichweite: Remote
ProFTPD 1.3.9d (f59f248) - ProFTPD (proftpd.org)
contrib mod_rewrite liefert RewriteMap int:utf8trans. Dieses Builtin kopiert ein Client-FTP-Argument (bis zu CommandBufferSize, 512 KiB) in zwei BSS-Puffer mit 1024 Slots ohne Zielbegrenzung. Ein langer ASCII-STOR-Name ist ein ASan global-buffer-overflow WRITE der Größe 8. Das Session-Kind bricht ab. Der Daemon bleibt oben. Klasse Crash. Kein RCE.
| ID | noch keine CVE |
| Klasse | Crash |
| Reichweite | Remote (FTP-Argument an int:utf8trans übergeben) |
| CWE | CWE-120 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, wenn die RewriteRule pre-auth ist. Das Lab verwendete STOR nach Login, daher ist PR:L für diesen Lauf ehrlich (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H). |
| Produkt | ProFTPD |
| Betroffen | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_rewrite |
| Auth | Lab ist authentifiziertes STOR. Eine Pre-Auth-RewriteRule auf USER oder ähnlich wäre PR:N. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
RewriteEngine ist aus, bis es konfiguriert wird. Das dokumentierte Muster ist RewriteRule (.*) ${map:$1}. Sobald eine RewriteRule das Client-Argument durch int:utf8trans leitet, überläuft ein Schlüssel, der länger als 1024 Bytes ist, zwei statische Puffer im Session-Kind.
| Methode | Sink | Privileg |
|---|---|---|
| FTP-Befehl, dessen Argument der utf8trans-Map-Schlüssel ist, Länge > 1024 | rewrite_utf8_to_ucs4 dann utf8_val[i] = ucs4_longs[i] | Verfügbarkeit (lab-bewiesen): Absturz des Session-Kinds. ASan: global-buffer-overflow WRITE of size 8, dann ABORTING. Prefork: ein frischer Login funktionierte weiterhin; der Daemon blieb oben. Ein kurzes STOR von 200 ASCII-Bytes überlebte. Die Integrität benachbarter Rewrite-BSS wird vermutet und ist vom Compiler-Layout abhängig. |
| RIP / Codeausführung | keine behauptet | Geschlossen. Keine Payload. Klasse Crash. Kein RCE. |
.ftpaccess-Plant von RewriteMap | CONF_DYNDIR | Geschlossen. RewriteMap ist in .ftpaccess nicht erlaubt. |
prg: Shell | kein solcher Map-Typ | Geschlossen. FIFO ist Zeilen-I/O. |
Lab-bewiesen vs. vermutet: ASan WRITE der Größe 8, Session-Kind-Abbruch, überlebende Kurzargument-Kontrolle und Login nach Auslösung sind lab-bewiesen. RIP/RCE wird nicht behauptet.
Issue 2173 patchte int:unescape Ein-Byte-OOB auf diesem Pin. Dieser Rest ist int:utf8trans. Anderes Builtin. Anderer Bug.
Ich pinnte proftpd/proftpd Tag v1.3.9d. Die 2026er CVE-Ernte und die öffentlichen GitHub-Issues, die noch in diesem Tarball lagen (2170, 2173, 2175, 2180, 2095, 2256, 2286, 2319, 2330, 2301), waren die Skip-Liste. Standard-Core-FTP mit Beispiel-basic.conf gab mir kein unveröffentlichtes Crit/High. Contrib-Rewrite schon.
rewrite_map_int_utf8trans (contrib/mod_rewrite.c) hat:
static unsigned char utf8_val[PR_TUNABLE_BUFFER_SIZE]; /* 1024 */
static unsigned long ucs4_longs[PR_TUNABLE_BUFFER_SIZE]; /* 1024 */
ucs4strlen = rewrite_utf8_to_ucs4(ucs4_longs, strlen(key), (unsigned char *) key);
rewrite_utf8_to_ucs4 schreibt ein unsigned long pro ASCII-Byte mit ohne Begrenzung. PR_TUNABLE_CMD_BUFFER_SIZE ist 512 KiB. Issue 2173 hat unescape bereits behoben. Diese Map war nicht in diesem Fix.
Irrwege: 2173 als diesen Bug behandeln; RIP behaupten, weil ASan WRITE of size 8 sagte; hoffen, dass .ftpaccess RewriteMap planten könnte. Das erste ist eine andere Funktion. Das zweite ist immer noch Crash. Das dritte ist CONF_DYNDIR.
ASan plus Stock-libcrypt SIGSEGVs bei PASS vor dem Rewrite-Sink. Das Lab lädt einen winzigen crypt(3)-Stub vor, damit Login funktioniert. Dieser Stub ist kein Exploit.
python3 proftpd-rewrite-utf8trans-Abraxas-Labs.py
oder:
cd lab
./run.sh
Loopback 127.0.0.1:18740 plus passiv 18741-18750. Compose-Projekt proftpd-rewrite-utf8trans. Witness PROFTPD-REWRITE-UTF8TRANS-WITNESS. Image ist ein ASan-Build von 1.3.9d mod_rewrite. Kontroll-STOR von 200 ASCII-Bytes gelingt. STOR von 2048 ASCII-Bytes ist ASan global-buffer-overflow WRITE der Größe 8 und das Session-Kind bricht ab. Frischer Login nach dem Auslöser funktioniert weiterhin.
SUCCESS PROFTPD-REWRITE-UTF8TRANS asan=global-buffer-overflow write=yes child-dead=yes PROFTPD-REWRITE-UTF8TRANS-WITNESS
Begrenze die Ziel-Länge von rewrite_utf8_to_ucs4 auf PR_TUNABLE_BUFFER_SIZE-1. Höre auf, über ucs4_longs / utf8_val hinauszuschreiben. Lehne einen Map-Schlüssel, der nicht passt, ab oder kürze ihn.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_rewrite.c rewrite_utf8_to_ucs4 / rewrite_map_int_utf8transint:unescapeGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.