
vsftpd 3.0.5 — высокий уровень — удалённо — остаточная привилегия — cmds_denied пропускает псевдонимы RFC (XRMD)
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vsftpd-cmds-denied-alias
Разбор: https://abraxaslabs.tech/research/vsftpd-cmds-denied-alias
Класс: Остаточные привилегии Доступ: Удалённый
vsftpd 3.0.5 - Chris Evans
Я зафиксировал официальный tarball, а не зеркало на GitHub и не форк из дистрибутива. SHA-256 26b602ae454b0ba6d99ef44a09b6b9e0dfa7f67228106736df1f278c70bc91d3. vsftpver.h VSF_VERSION "3.0.5".
cmds_denied — это точное совпадение токена в верхнем регистре в process_post_login (postlogin.c:140-184). Затем диспетчеризация объединяет через OR псевдонимы RFC 775 на те же обработчики: RMD||XRMD (:263-264), а также CWD||XCWD, MKD||XMKD, PASV||P@SW, плюс отдельные EPSV / STOU / APPE. Оператор, который вносит RMD в денилист (распространённый рецепт DELE,RMD), всё равно разрешает rmdir через XRMD.
Эта остаточная привилегия — нарушение целостности аутентифицированного FTP в рамках денилиста, который оператор считал закрытым. Это не unauth, не root, не побег из chroot и не RCE.
| ID | CVE пока нет |
| Класс | Остаточные привилегии (cmds_denied точный токен) |
| Доступ | Удалённый (аутентифицированный FTP) |
| CWE | CWE-863 |
| CVSS | Высокий: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| Продукт | vsftpd (Chris Evans) |
| Затронуто | vsftpd 3.0.5 официальный tarball |
| Аутентификация | FTP USER/PASS (лаборатория: анонимный ftp) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18720 |
Кто: аутентифицированный FTP-пользователь (анонимный или локальный) на демоне, где оператор задал cmds_denied. По умолчанию не задано. Рецепты для виртуальных пользователей, упомянутые в man-странице, используют общий guest uid, поэтому Unix DAC не может их разделить. Сессия уже работает под сопоставленным uid внутри обычного chroot. cmds_denied был дополнительным контролем, который должен был отнять команду.
| Метод + приёмник | Привилегия |
|---|---|
XRMD labdir после cmds_denied=RMD | handle_rmd -> str_rmdir каталога, который uid сессии может удалить через Unix-rmdir. Лаборатория: RMD labdir 550, XRMD labdir 250, CWD labdir 550 (каталог удалён). Последующий MKD labctrl по-прежнему 550 на RMD. |
| Метод + приёмник | Привилегия |
|---|---|
XMKD dir после cmds_denied=MKD | handle_mkd -> mkdir от имени uid сессии |
XCWD path после cmds_denied=CWD | handle_cwd -> chdir. Затем RETR, если включён download_enable |
STOU / APPE после cmds_denied=STOR | handle_upload_common создание / дозапись. Требуется write_enable |
EPSV / P@SW после cmds_denied=PASV | handle_pasv открывает слушатель данных, который денилист должен был остановить |
В лаборатории доказан только XRMD после RMD. Остальные псевдонимы используют ту же проверку str_equal и тот же OR в диспетчеризации. Я их не проверял.
Отсутствует как полноценная остаточная привилегия. cmds_denied — это не скрытие. XRMD не выводит имена.
Не входит в рамки. Удаление каталога — это удар по целостности. Последующий CWD / RETR этого имени возвращает 550 как побочный эффект.
cmds_denied (до входа игнорируется; USER/PASS/QUIT остаются в таблице до входа)allow_writeable_chroot по умолчанию выключен; лаборатория пишет только в /incoming, поэтому запрет сохраняется)cmds_allowed с отказом по умолчанию: не перечисленные команды, включая XRMD, остаются 550write_enable=NO по-прежнему блокирует семейство записи (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU)SITE vs site (ftpcmdio.c str_upper)cmds_denied=CHMOD никогда не совпадает; отключите chmod через chmod_enable=NO или cmds_denied=SITEЯ искал hide/deny/cmds_denied в официальной версии 3.0.5. Проверка — это один проход по токенам, разделённым запятыми, и str_equal против команды в верхнем регистре. Внутри handle_rmd второй проверки нет. RFC 775 по-прежнему поставляет XRMD как RMD. Распространённый совет — cmds_denied=DELE,RMD. Эта строка никогда не называет XRMD.
Неверный путь: считать SITE vs site обходом. Команды приводятся к верхнему регистру. То же самое с cmds_allowed: этот список работает с отказом по умолчанию, поэтому псевдонимы, которые не перечислены, остаются запрещёнными.
cd lab
./run.sh
Loopback 127.0.0.1:18720. Проект Compose vsftpd-cmds-denied-alias. Официальный tarball 3.0.5 в lab/ (SHA-256 выше). cmds_denied=RMD, write_enable=YES, анонимный доступ, запись только в /incoming. Свидетель VSFTPD-CMDS-DENIED-ALIAS-WITNESS. Последняя строка:
SUCCESS vsftpd-cmds-denied-alias rmd=550 xrmd=250 dir-gone=yes VSFTPD-CMDS-DENIED-ALIAS-WITNESS
Запретите псевдонимы RFC при запрете современного глагола или сопоставьте псевдонимы в cmds_denied (XCWD / XMKD / XRMD / XPWD / XCUP / P@SW / EPSV / STOU / APPE). Предпочтите cmds_allowed (список разрешённых).
Приём сообщений об уязвимостях: [email protected] (vsftpd). Неоплачиваемо. Не открывайте публичный issue на GitHub в любом зеркале vsftpd.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]