
ProFTPD 1.3.9d - Élevé - À distance - Crash - RewriteMap int:utf8trans Débordement BSS
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-rewrite-utf8trans
Classe : Crash Portée : Distante
ProFTPD 1.3.9d (f59f248) - ProFTPD (proftpd.org)
Le contrib mod_rewrite fournit RewriteMap int:utf8trans. Ce builtin copie un argument FTP client (jusqu'à CommandBufferSize, 512 KiB) dans deux buffers BSS de 1024 slots sans limite de destination. Un long nom STOR ASCII provoque un WRITE global-buffer-overflow ASan de taille 8. Le processus enfant de session avorte. Le démon reste actif. Classe Crash. Pas de RCE.
| ID | pas encore de CVE |
| Classe | Crash |
| Portée | Distante (argument FTP transmis à int:utf8trans) |
| CWE | CWE-120 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H si la RewriteRule est pré-auth. Le lab a utilisé STOR après connexion, donc PR:L est honnête pour cette exécution (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H). |
| Produit | ProFTPD |
| Affecté | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_rewrite |
| Auth | le lab est un STOR authentifié. Une RewriteRule pré-auth sur USER ou similaire serait PR:N. |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
RewriteEngine est désactivé tant qu'il n'est pas configuré. Le motif documenté est RewriteRule (.*) ${map:$1}. Une fois qu'une RewriteRule transmet l'argument client via int:utf8trans, une clé de plus de 1024 octets déborde deux buffers statiques dans le processus enfant de session.
| Méthode | Sink | Privilège |
|---|---|---|
| Commande FTP dont l'argument est la clé de map utf8trans, longueur > 1024 | rewrite_utf8_to_ucs4 puis utf8_val[i] = ucs4_longs[i] | Disponibilité (prouvé en lab) : faire planter le processus enfant de session. ASan : global-buffer-overflow WRITE of size 8, puis ABORTING. Prefork : une nouvelle connexion fonctionnait toujours ; le démon restait actif. Un STOR court de 200 octets ASCII a survécu. L'intégrité des BSS rewrite voisines est déduite et dépend de la disposition du compilateur. |
| RIP / exécution de code | aucun revendiqué | Fermé. Pas de payload. Classe Crash. Pas de RCE. |
Plantage de RewriteMap via .ftpaccess | CONF_DYNDIR | Fermé. RewriteMap n'est pas autorisé dans .ftpaccess. |
shell prg: | pas de tel type de map | Fermé. FIFO est de l'I/O ligne. |
Prouvé en lab vs déduit : le WRITE ASan de taille 8, l'abandon du processus enfant de session, le contrôle avec argument court survivant, et la connexion post-déclenchement sont prouvés en lab. RIP/RCE n'est pas revendiqué.
Issue 2173 a corrigé l'OOB d'un octet de int:unescape sur ce pin. Ce résidu est int:utf8trans. Builtin différent. Bug différent.
J'ai épinglé proftpd/proftpd tag v1.3.9d. La récolte de CVE 2026 et les issues GitHub publiques encore présentes dans ce tarball (2170, 2173, 2175, 2180, 2095, 2256, 2286, 2319, 2330, 2301) constituaient la liste à ignorer. Le core FTP par défaut avec l'exemple basic.conf ne m'a pas donné de Crit/High non publié. Le contrib rewrite, si.
rewrite_map_int_utf8trans (contrib/mod_rewrite.c) contient :
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 écrit un unsigned long par octet ASCII sans limite. PR_TUNABLE_CMD_BUFFER_SIZE vaut 512 KiB. L'issue 2173 avait déjà corrigé unescape. Cette map n'était pas dans ce correctif.
Fausses pistes : traiter 2173 comme ce bug ; revendiquer RIP parce qu'ASan disait WRITE of size 8 ; espérer que .ftpaccess puisse planter RewriteMap. La première est une fonction différente. La deuxième reste un Crash. La troisième est CONF_DYNDIR.
ASan plus la libcrypt standard provoquent des SIGSEGV sur PASS avant le sink rewrite. Le lab précharge un petit stub crypt(3) pour que la connexion fonctionne. Ce stub n'est pas un exploit.
python3 proftpd-rewrite-utf8trans-Abraxas-Labs.py
ou :
cd lab
./run.sh
Loopback 127.0.0.1:18740 plus passif 18741-18750. Projet Compose proftpd-rewrite-utf8trans. Témoin PROFTPD-REWRITE-UTF8TRANS-WITNESS. L'image est un build ASan de 1.3.9d mod_rewrite. Le STOR de contrôle de 200 octets ASCII réussit. Le STOR de 2048 octets ASCII provoque un WRITE global-buffer-overflow ASan de taille 8 et le processus enfant de session avorte. Une nouvelle connexion après le déclenchement fonctionne toujours.
SUCCESS PROFTPD-REWRITE-UTF8TRANS asan=global-buffer-overflow write=yes child-dead=yes PROFTPD-REWRITE-UTF8TRANS-WITNESS
Limiter la longueur de destination de rewrite_utf8_to_ucs4 à PR_TUNABLE_BUFFER_SIZE-1. Arrêter d'écrire au-delà de ucs4_longs / utf8_val. Rejeter ou tronquer une clé de map qui ne rentre pas.
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_rewrite.c rewrite_utf8_to_ucs4 / rewrite_map_int_utf8transint:unescapeGNU Affero GPL v3.0. Voir LICENSE. Lab loopback uniquement. Aucune garantie.