
ProFTPD 1.3.9d - Alta - Remota - Privilegio residual / Escritura de archivos - La copia de archivos por SFTP omite el permiso WRITE en el destino
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
Clase: Privilegio residual / Escritura de archivos Alcance: Remoto
ProFTPD 1.3.9d (f59f248) - proftpd.org
El contrib mod_sftp anuncia copy-file una vez que SFTPEngine está activado (SFTP_FXP_EXT_DEFAULT). fxp_handle_ext_copy_file ejecuta la ESCRITURA de destino más AllowOverwrite solo si pr_fsio_stat(dst) tiene éxito. Un destino que aún no existe omite esa comprobación. pr_fs_copy_file2 entonces crea el archivo con el UID de la sesión, incluso bajo <Limit WRITE> DenyAll.
FTP STOR y SFTP OPEN-write todavía pasan por xfer_pre_stor, que siempre hace dir_check de WRITE antes de crear. El Issue 2095 público es el inverso: SITE COPY omitía la LECTURA del origen. Este residual es la ESCRITURA de destino sobre un nombre nuevo.
| ID | sin CVE todavía |
| Clase | Privilegio residual / Escritura de archivos |
| Alcance | Remoto (SFTP autenticado) |
| CWE | CWE-863 |
| CVSS | Alto: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Producto | ProFTPD |
| Afectado | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| Auth | SFTP autenticado (SFTPEngine on) |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Fijé el tag v1.3.9d y leí fxp_handle_ext_copy_file. Este despacha el PRE_CMD de un SITE COPY falso. mod_copy registra copy_copy como CMD, no como PRE_CMD, por lo que la comprobación de ESCRITURA de destino de FTP nunca se ejecuta en esta ruta. La LECTURA del origen siempre pasa por dir_check. La ESCRITURA del destino no, a menos que el destino ya exista. El lab es SFTP en loopback sobre 127.0.0.1:18710.
| Método | Sink | Privilegio |
|---|---|---|
SFTP EXTENDED copy-file de un src legible a un nombre de destino que aún no existe, bajo <Directory> con <Limit WRITE> DenyAll | pr_fs_copy_file2 | Integridad (probado en lab): crear ese archivo con el UID de la sesión. Recon (probado en lab): la LECTURA SFTP del destino devuelve los bytes del origen cuando la LECTURA del destino está permitida. |
| El mismo destino ya existe | dir_check WRITE + AllowOverwrite | Cerrado (probado en lab): la sobrescritura con copy-file devuelve permiso denegado. |
| SFTP OPEN / STOR / SCP upload del mismo destino | xfer_pre_stor | Cerrado (probado en lab): la escritura/creación con OPEN es SSH_FX_PERMISSION_DENIED (estado 3). |
| copy-file sin autenticar | Auth SFTP | Cerrado. Sin shell. El DAC de Unix sigue aplicándose. |
Probado en lab vs inferido: la creación del destino, la LECTURA del testigo en el destino, la denegación de escritura con OPEN y la denegación de sobrescritura de un destino existente están probadas en lab. Lo no autenticado y el DAC de Unix siguen siendo inferidos del modelo de auth/chroot.
Requiere: contrib mod_sftp cargado, SFTPEngine on. Vhost SFTP típico de distro. SFTPExtensions -copyFile desactiva la extensión.
cd lab
./run.sh
Loopback 127.0.0.1:18710 mapea el contenedor 2222. Proyecto compose proftpd-sftp-copy-file-write. Tag de imagen proftpd-sftp-copy-file-write:1.3.9d. Testigo PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS. Última línea:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
Hacer dir_check de la ESCRITURA del destino incluso cuando el destino aún no existe, antes de pr_fs_copy_file2. O desactivar la extensión: SFTPExtensions -copyFile.
f59f248e26bdfa514443e42bf72a145641df635d)fxp_handle_ext_copy_file en contrib/mod_sftp/fxp.cSFTP_FXP_EXT_DEFAULT incluye copy-file