
ProFTPD 1.3.9d - Alta - Remoto - Resíduo de privilégio / Escrita de arquivo - SFTP copy-file ignora WRITE no destino
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
Classe: Privilégio remanescente / Escrita de arquivo Alcance: Remoto
ProFTPD 1.3.9d (f59f248) - proftpd.org
O contrib mod_sftp anuncia copy-file assim que SFTPEngine está ativado (SFTP_FXP_EXT_DEFAULT). fxp_handle_ext_copy_file executa a escrita no destino mais AllowOverwrite somente se pr_fsio_stat(dst) for bem-sucedido. Um destino que ainda não existe pula essa verificação. pr_fs_copy_file2 então cria o arquivo com o UID da sessão, inclusive sob <Limit WRITE> DenyAll.
FTP STOR e SFTP OPEN-write ainda passam por xfer_pre_stor, que sempre faz dir_check de WRITE antes de criar. A Issue 2095 pública é o inverso: SITE COPY pulava a leitura da origem. Este remanescente é a escrita no destino com um novo nome.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente / Escrita de arquivo |
| 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 |
| Produto | ProFTPD |
| Afetado | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| Autenticação | SFTP autenticado (SFTPEngine on) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Fiz o pin da tag v1.3.9d e li fxp_handle_ext_copy_file. Ele despacha o PRE_CMD de um SITE COPY falso. O mod_copy registra copy_copy como CMD, não como PRE_CMD, então a verificação de escrita no destino do FTP nunca é executada nesse caminho. A leitura da origem sempre passa por dir_check. A escrita no destino não, a menos que o destino já exista. O lab é SFTP em loopback em 127.0.0.1:18710.
| Método | Sink | Privilégio |
|---|---|---|
SFTP EXTENDED copy-file de uma origem legível para um nome de destino que ainda não existe, sob <Directory> com <Limit WRITE> DenyAll | pr_fs_copy_file2 | Integridade (comprovado em lab): criar esse arquivo com o UID da sessão. Recon (comprovado em lab): SFTP READ do destino retorna os bytes da origem quando a leitura do destino é permitida. |
| Mesmo destino já existente | dir_check WRITE + AllowOverwrite | Fechado (comprovado em lab): a sobrescrita via copy-file retorna permissão negada. |
| SFTP OPEN / STOR / upload SCP do mesmo destino | xfer_pre_stor | Fechado (comprovado em lab): a escrita/criação via OPEN retorna SSH_FX_PERMISSION_DENIED (status 3). |
| copy-file não autenticado | Autenticação SFTP | Fechado. Sem shell. O DAC do Unix ainda se aplica. |
Comprovado em lab vs inferido: a criação do destino, a leitura do destino da testemunha, a negação de escrita via OPEN e a negação de sobrescrita de destino existente são comprovados em lab. Não autenticado e DAC do Unix permanecem inferidos a partir do modelo de autenticação/chroot.
Requer: contrib mod_sftp carregado, SFTPEngine on. Vhost SFTP típico de distro. SFTPExtensions -copyFile desativa a extensão.
cd lab
./run.sh
Loopback 127.0.0.1:18710 mapeia o container 2222. Projeto Compose proftpd-sftp-copy-file-write. Tag da imagem proftpd-sftp-copy-file-write:1.3.9d. Testemunha PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS. Última linha:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
Fazer dir_check de WRITE no destino mesmo quando o destino ainda não existe, antes de pr_fs_copy_file2. Ou desativar a extensão: SFTPExtensions -copyFile.
f59f248e26bdfa514443e42bf72a145641df635d)fxp_handle_ext_copy_file em contrib/mod_sftp/fxp.cSFTP_FXP_EXT_DEFAULT inclui copy-file