
vsftpd 3.0.5 - Alta - Remoto - Privilegio residuo - cmds_denied non intercetta gli alias RFC (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Classe: Privilegio residuo Portata: Remota
vsftpd 3.0.5 - Chris Evans
Ho fissato il tarball ufficiale, non un mirror GitHub e non un fork della distro. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied è una corrispondenza esatta di token in maiuscolo in process_post_login (postlogin.c:140-184). Il dispatch poi applica in OR gli alias RFC 775 sugli stessi handler: RMD||XRMD (:263-264), anche CWD||XCWD, MKD||XMKD, PASV||P@SW, più EPSV / STOU / APPE separati. Un operatore che mette in denylist RMD (la ricetta comune DELE,RMD) consente comunque a XRMD di eseguire rmdir.
Questo residuo è un problema di integrità FTP autenticata sotto una denylist che l'operatore credeva chiusa. Non è una vulnerabilità non autenticata, non è root, non è un escape dal chroot e non è RCE.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo (token esatto cmds_denied) |
| Portata | Remota (FTP autenticato) |
| 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 |
| Prodotto | vsftpd (Chris Evans) |
| Affetto | vsftpd 3.0.5 tarball ufficiale |
| Auth | FTP USER/PASS (lab: anonymous ftp) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18720 |
Chi: un utente FTP autenticato (anonymous o locale) su un daemon dove l'operatore ha impostato cmds_denied. Il default è non impostato. Le ricette per utenti virtuali citate nella man page condividono un uid guest, quindi il DAC Unix non può separarle. La sessione è già l'uid mappato all'interno del solito chroot. cmds_denied era il controllo aggiuntivo che doveva togliere il verbo.
| Metodo + sink | Privilegio |
|---|---|
XRMD labdir dopo cmds_denied=RMD | handle_rmd -> str_rmdir di una directory che l'uid della sessione può rimuovere con Unix-rmdir. Lab: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (directory sparita). Secondo MKD labctrl ancora 550 su RMD. |
| Metodo + sink | Privilegio |
|---|---|
XMKD dir dopo cmds_denied=MKD | handle_mkd -> mkdir come l'uid della sessione |
XCWD path dopo cmds_denied=CWD | handle_cwd -> chdir. Poi RETR se download_enable |
STOU / APPE dopo cmds_denied=STOR | handle_upload_common create / append. Richiede write_enable |
EPSV / P@SW dopo cmds_denied=PASV | handle_pasv apre un listener dati che la denylist doveva fermare |
Il lab ha dimostrato solo XRMD dopo RMD. Gli altri alias condividono lo stesso gate str_equal e lo stesso OR nel dispatch. Non li ho esercitati.
Nessuna come residuo di prima classe. cmds_denied non è un nascondiglio. XRMD non elenca nomi.
Non rientra nella barra. Rimuovere una directory è un colpo all'integrità. Un successivo CWD / RETR di quel nome restituisce 550 come effetto collaterale.
cmds_denied non autenticato (il pre-login lo ignora; USER/PASS/QUIT restano la tabella pre-login)allow_writeable_chroot default off; il lab scrive solo sotto /incoming quindi il deny regge ancora)cmds_allowed fail-closed: i verbi non elencati, incluso XRMD, restano 550write_enable=NO blocca comunque la famiglia di scrittura (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs site (ftpcmdio.c str_upper)cmds_denied=CHMOD non corrisponde mai; blocca chmod con chmod_enable=NO o cmds_denied=SITEHo cercato hide/deny/cmds_denied sulla 3.0.5 ufficiale. Il gate è una singola scansione di token separati da virgola e str_equal contro il verbo in maiuscolo. Non c'è un secondo controllo dentro handle_rmd. RFC 775 fornisce ancora XRMD come RMD. Il consiglio comune è cmds_denied=DELE,RMD. Quella stringa non nomina mai XRMD.
Falsa pista: trattare SITE vs site come un bypass. I verbi sono in maiuscolo. Trattare cmds_allowed allo stesso modo: quella lista è fail-closed, quindi gli alias non elencati restano negati.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Progetto Compose vsftpd-cmds-denied-alias. Tarball ufficiale 3.0.5 in lab/ (SHA-256 sopra). cmds_denied=RMD, write_enable=YES, anonymous, scrive solo sotto /incoming. Witness VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Ultima riga:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Nega gli alias RFC quando neghi il verbo moderno, oppure fai corrispondere gli alias in cmds_denied (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Preferisci cmds_allowed (allowlist).
L'intake del vendor è [email protected] (vsftpd). Non pagato. Non aprire una issue pubblica su GitHub su nessun mirror di vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]