
vsftpd 3.0.5 - Alta - Remoto - Privilégio remanescente - cmds_denied ignora aliases RFC (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Classe: Privilégio remanescente Alcance: Remoto
vsftpd 3.0.5 - Chris Evans
Fixeio tarball oficial, não um espelho do GitHub e não um fork de distro. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied é uma correspondência exata de token em maiúsculas em process_post_login (postlogin.c:140-184). O despacho então faz OR de aliases RFC 775 nos mesmos handlers: RMD||XRMD (:263-264), também CWD||XCWD, MKD||XMKD, PASV||P@SW, além de EPSV / STOU / APPE separados. Um operador que coloca RMD na denylist (a receita comum DELE,RMD) ainda permite que XRMD faça rmdir.
Este remanescente é integridade de FTP autenticado sob uma denylist que o operador pensava estar fechada. Não é não autenticado, não é root, não é escape de chroot e não é RCE.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente (cmds_denied token exato) |
| Alcance | Remoto (FTP 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 | vsftpd (Chris Evans) |
| Afetado | vsftpd 3.0.5 tarball oficial |
| Autenticação | FTP USER/PASS (lab: anonymous ftp) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18720 |
Quem: um usuário FTP autenticado (anônimo ou local) em um daemon onde o operador definiu cmds_denied. O padrão é não definido. Receitas de usuário virtual que a man page nomeia compartilham um uid de convidado, então o DAC do Unix não pode separá-las. A sessão já é o uid mapeado dentro do chroot usual. cmds_denied era o controle extra que deveria remover o verbo.
| Método + sink | Privilégio |
|---|---|
XRMD labdir após cmds_denied=RMD | handle_rmd -> str_rmdir de um diretório que o uid da sessão pode remover com rmdir do Unix. Lab: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (diretório removido). Segundo MKD labctrl ainda 550 em RMD. |
| Método + sink | Privilégio |
|---|---|
XMKD dir após cmds_denied=MKD | handle_mkd -> mkdir como o uid da sessão |
XCWD path após cmds_denied=CWD | handle_cwd -> chdir. Depois RETR se download_enable |
STOU / APPE após cmds_denied=STOR | handle_upload_common cria / anexa. Requer write_enable |
EPSV / P@SW após cmds_denied=PASV | handle_pasv abre um listener de dados que a denylist deveria impedir |
O lab comprovou apenas XRMD após RMD. Os outros aliases compartilham o mesmo gate str_equal e o mesmo OR no despacho. Não os exercitei.
Nenhum como remanescente de primeira classe. cmds_denied não é um esconderijo. XRMD não lista nomes.
Não está no bar. Remover um diretório é um impacto de integridade. Um CWD / RETR posterior desse nome retorna 550 como efeito colateral.
cmds_denied não autenticado (pré-login o ignora; USER/PASS/QUIT permanecem na tabela de pré-login)allow_writeable_chroot padrão desligado; o lab escreve apenas sob /incoming então o deny ainda se mantém)cmds_allowed fail-closed: verbos não listados, incluindo XRMD, permanecem 550write_enable=NO ainda bloqueia a família de escrita (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs site (ftpcmdio.c str_upper)cmds_denied=CHMOD nunca corresponde; mate o chmod com chmod_enable=NO ou cmds_denied=SITECacei hide/deny/cmds_denied no 3.0.5 oficial. O gate é uma única varredura de tokens separados por vírgula e str_equal contra o verbo em maiúsculas. Não há segunda verificação dentro de handle_rmd. O RFC 775 ainda entrega XRMD como RMD. O conselho comum é cmds_denied=DELE,RMD. Essa string nunca nomeia XRMD.
Caminho errado: tratar SITE vs site como um bypass. Os verbos são convertidos para maiúsculas. Tratar cmds_allowed da mesma forma: essa lista é fail-closed, então aliases que não estão listados permanecem negados.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Projeto Compose vsftpd-cmds-denied-alias. Tarball oficial 3.0.5 em lab/ (SHA-256 acima). cmds_denied=RMD, write_enable=YES, anônimo, escreve apenas sob /incoming. Testemunha VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Última linha:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Negue os aliases RFC ao negar o verbo moderno, ou faça correspondência de aliases em cmds_denied (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Prefira cmds_allowed (allowlist).
O intake do fornecedor é [email protected] (vsftpd). Não remunerado. Não abra uma issue pública no GitHub em nenhum espelho do vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]