
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
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 de 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 lecture de la source (source READ). Ce reliquat est une écriture de destination (dest WRITE) sur 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 lu fxp_handle_ext_copy_file. Il dispatche le PRE_CMD d'un faux SITE COPY. mod_copy enregistre copy_copy comme CMD, pas comme PRE_CMD, donc la vérification d'écriture de destination (dest WRITE) de FTP ne s'exécute jamais sur ce chemin. La lecture de la source (source READ) est toujours soumise à dir_check. L'écriture de destination (dest WRITE) ne l'est pas, sauf si la destination existe déjà. Le lab est un SFTP en loopback sur 127.0.0.1:18710.
| Méthode | Sink | 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. Recon (prouvé en lab) : un SFTP READ de la destination renvoie les octets de la source lorsque la lecture de la destination (dest READ) est autorisée. |
| Même destination existant déjà | dir_check WRITE + AllowOverwrite | Fermé (prouvé en lab) : l'écrasement par 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 OPEN renvoie SSH_FX_PERMISSION_DENIED (statut 3). |
| copy-file non authentifié | SFTP auth | Fermé. Pas de shell. Le DAC Unix s'applique toujours. |
Prouvé en lab vs déduit : la création de la destination, la lecture de la destination du témoin, le refus d'écriture OPEN et le refus d'é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.
Nécessite : 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 l'écriture de destination (dest WRITE) même lorsque la destination 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