
ProFTPD 1.3.9d - Élevé - À distance - Reste de privilège / Écriture de fichier - La copie de fichier SFTP ignore l'écriture de destination
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
Write-up : https://abraxaslabs.tech/research/proftpd-sftp-copy-file-write
Classe : Reliquat de privilège / Écriture de fichier Portée : Distante
ProFTPD 1.3.9d (f59f248) - proftpd.org
Le contrib mod_sftp annonce copy-file dès que SFTPEngine est activé (SFTP_FXP_EXT_DEFAULT). fxp_handle_ext_copy_file exécute l'écriture sur la destination (dest WRITE) plus AllowOverwrite uniquement si pr_fsio_stat(dst) réussit. Une destination qui n'existe pas encore contourne cette vérification. pr_fs_copy_file2 crée alors le fichier avec l'UID de la session, y compris sous <Limit WRITE> DenyAll.
FTP STOR et SFTP OPEN-write passent toujours par xfer_pre_stor, qui effectue systématiquement un dir_check WRITE avant la création. L'Issue 2095 publique est l'inverse : SITE COPY sautait la vérification READ sur la source. Ce reliquat concerne l'écriture sur la destination (dest WRITE) pour un nouveau nom.
| ID | pas encore de CVE |
| Classe | Reliquat de privilège / Écriture de fichier |
| Portée | Distante (SFTP authentifié) |
| CWE | CWE-863 |
| CVSS | Élevé : 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Produit | ProFTPD |
| Affecté | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| Auth | SFTP authentifié (SFTPEngine on) |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
J'ai épinglé le tag v1.3.9d et analysé fxp_handle_ext_copy_file. Il dispatche le PRE_CMD d'un faux SITE COPY. mod_copy enregistre copy_copy comme CMD, et non comme PRE_CMD, donc la vérification WRITE sur la destination propre à FTP ne s'exécute jamais sur ce chemin. Le READ sur la source passe toujours par dir_check. Le WRITE sur la destination, non, sauf si la destination existe déjà. Le lab est un SFTP en boucle locale sur 127.0.0.1:18710.
| Méthode | Point d'aboutissement | Privilège |
|---|---|---|
SFTP EXTENDED copy-file d'une source lisible vers un nom de destination qui n'existe pas encore, sous <Directory> avec <Limit WRITE> DenyAll | pr_fs_copy_file2 | Intégrité (prouvé en lab) : créer ce fichier avec l'UID de la session. Reconnaissance (prouvé en lab) : un READ SFTP de la destination renvoie les octets de la source lorsque le READ sur la destination est autorisé. |
| Même destination déjà existante | dir_check WRITE + AllowOverwrite | Fermé (prouvé en lab) : l'écrasement via copy-file renvoie permission denied. |
| SFTP OPEN / STOR / SCP upload de la même destination | xfer_pre_stor | Fermé (prouvé en lab) : l'écriture/création via OPEN renvoie SSH_FX_PERMISSION_DENIED (statut 3). |
| copy-file non authentifié | Auth SFTP | Fermé. Pas de shell. Le DAC Unix s'applique toujours. |
Prouvé en lab vs déduit : la création de la destination, le READ de la destination du témoin, le refus de l'écriture via OPEN et le refus de l'écrasement d'une destination existante sont prouvés en lab. Le non-authentifié et le DAC Unix restent déduits du modèle auth/chroot.
Prérequis : contrib mod_sftp chargé, SFTPEngine on. Vhost SFTP typique d'une distribution. SFTPExtensions -copyFile désactive l'extension.
cd lab
./run.sh
Loopback 127.0.0.1:18710 mappe le conteneur 2222. Projet Compose proftpd-sftp-copy-file-write. Tag d'image proftpd-sftp-copy-file-write:1.3.9d. Témoin PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS. Dernière ligne :
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
dir_check dest WRITE même lorsque la dest n'existe pas encore, avant pr_fs_copy_file2. Ou désactiver l'extension : SFTPExtensions -copyFile.
f59f248e26bdfa514443e42bf72a145641df635d)fxp_handle_ext_copy_file dans contrib/mod_sftp/fxp.cSFTP_FXP_EXT_DEFAULT inclut copy-file