
vsftpd 3.0.5 - Hoch - Remote - Privilege leftover - cmds_denied verpasst RFC-Aliase (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Write-up: https://abraxaslabs.tech/research/vsftpd-cmds-denied-alias
Klasse: Privilegien-Rest Reichweite: Remote
vsftpd 3.0.5 - Chris Evans
Ich habe das offizielle Tarball gepinnt, nicht einen GitHub-Mirror und nicht einen Distro-Fork. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied ist ein exakter, in Großbuchstaben umgewandelter Token-Abgleich in process_post_login (postlogin.c:140-184). Der Dispatch verknüpft dann per OR RFC-775-Aliase mit denselben Handlern: RMD||XRMD (:263-264), ebenso CWD||XCWD, MKD||XMKD, PASV||P@SW, plus separate EPSV / STOU / APPE. Ein Betreiber, der RMD auf die Denylist setzt (das gängige DELE,RMD-Rezept), erlaubt XRMD weiterhin das rmdir.
Dieser Rest ist eine Integritätslücke bei authentifiziertem FTP unter einer Denylist, die der Betreiber für geschlossen hielt. Es ist kein Unauth, kein Root, kein Chroot-Ausbruch und kein RCE.
| ID | noch keine CVE |
| Klasse | Privilegien-Rest (cmds_denied exakter Token) |
| Reichweite | Remote (authentifiziertes FTP) |
| CWE | CWE-863 |
| CVSS | Hoch: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Produkt | vsftpd (Chris Evans) |
| Betroffen | vsftpd 3.0.5 offizielles Tarball |
| Auth | FTP USER/PASS (Lab: anonym ftp) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18720 |
Wer: ein authentifizierter FTP-Benutzer (anonym oder lokal) auf einem Daemon, bei dem der Betreiber cmds_denied gesetzt hat. Standardmäßig ist es nicht gesetzt. Virtual-User-Rezepte, die die Manpage nennt, teilen sich eine Gast-UID, sodass Unix-DAC sie nicht trennen kann. Die Sitzung ist bereits die zugeordnete UID innerhalb des üblichen Chroots. cmds_denied war die zusätzliche Kontrolle, die das Verb eigentlich wegnehmen sollte.
| Methode + Senke | Privileg |
|---|---|
XRMD labdir nach cmds_denied=RMD | handle_rmd -> str_rmdir eines Verzeichnisses, das die Sitzungs-UID per Unix-rmdir entfernen kann. Lab: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (Verzeichnis weg). Zweites MKD labctrl weiterhin 550 bei RMD. |
| Methode + Senke | Privileg |
|---|---|
XMKD dir nach cmds_denied=MKD | handle_mkd -> mkdir als die Sitzungs-UID |
XCWD path nach cmds_denied=CWD | handle_cwd -> chdir. Dann RETR, falls download_enable |
STOU / APPE nach cmds_denied=STOR | handle_upload_common create / append. Benötigt write_enable |
EPSV / P@SW nach cmds_denied=PASV | handle_pasv öffnet einen Daten-Listener, den die Denylist verhindern sollte |
Das Lab hat nur XRMD nach RMD nachgewiesen. Die anderen Aliase teilen dasselbe str_equal-Gate und dasselbe OR im Dispatch. Ich habe sie nicht ausgeführt.
Keines als eigenständiger Rest. cmds_denied ist kein Verstecken. XRMD listet keine Namen.
Nicht in der Bewertung. Das Entfernen eines Verzeichnisses ist ein Integritätstreffer. Ein späteres CWD / RETR dieses Namens liefert als Nebeneffekt 550.
cmds_denied (Pre-Login ignoriert es; USER/PASS/QUIT bleiben die Pre-Login-Tabelle)allow_writeable_chroot standardmäßig aus; das Lab schreibt nur unter /incoming, sodass die Verweigerung weiterhin greift)cmds_allowed fail-closed: nicht gelistete Verben, einschließlich XRMD, bleiben 550write_enable=NO blockiert weiterhin die Schreibfamilie (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs. site-Case-Bypass (ftpcmdio.c str_upper)cmds_denied=CHMOD trifft nie zu; chmod mit chmod_enable=NO oder cmds_denied=SITE unterbindenIch habe hide/deny/cmds_denied auf dem offiziellen 3.0.5 untersucht. Die Prüfung ist ein einzelner Durchlauf über Komma-Token und str_equal gegen das in Großbuchstaben umgewandelte Verb. Es gibt keine zweite Prüfung innerhalb von handle_rmd. RFC 775 liefert XRMD weiterhin als RMD aus. Der übliche Rat lautet cmds_denied=DELE,RMD. Dieser String benennt XRMD nie.
Fehlversuch: SITE vs. site als Bypass zu behandeln. Verben werden in Großbuchstaben umgewandelt. cmds_allowed genauso zu behandeln: Diese Liste ist fail-closed, sodass nicht gelistete Aliase weiterhin verweigert werden.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Compose-Projekt vsftpd-cmds-denied-alias. Offizielles 3.0.5-Tarball in lab/ (SHA-256 oben). cmds_denied=RMD, write_enable=YES, anonym, Schreibzugriff nur unter /incoming. Witness VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Letzte Zeile:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Lehnen Sie die RFC-Aliase ab, wenn Sie das moderne Verb ablehnen, oder gleichen Sie Aliase in cmds_denied ab (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Bevorzugen Sie cmds_allowed (Allowlist).
Die Meldestelle des Herstellers ist [email protected] (vsftpd). Unbezahlt. Öffnen Sie kein öffentliches GitHub-Issue in einem vsftpd-Mirror.
Abraxas Labs – abraxaslabs.tech – github.com/abraxas – @abraxas_null – [email protected]