
vsftpd 3.0.5 - 高 - リモート - 権限の残存 - cmds_denied が RFC エイリアス (XRMD) を検出しない
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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) における大文字化されたトークンの完全一致である。その後ディスパッチは RFC 775 のエイリアスを同じハンドラに OR する: RMD||XRMD (:263-264)、さらに CWD||XCWD、MKD||XMKD、PASV||P@SW、加えて個別の EPSV / STOU / APPE。RMD を拒否リストに入れた運用者(よくある DELE,RMD のレシピ)でも、XRMD は rmdir を実行できてしまう。
この取りこぼしは、運用者が閉じたと思っていた拒否リストの下での、認証済み FTP の完全性である。未認証でも、root でも、chroot エスケープでも、RCE でもない。
| ID | CVE はまだなし |
| クラス | 権限の取りこぼし (cmds_denied の完全一致トークン) |
| 到達範囲 | リモート (認証済み FTP) |
| CWE | CWE-863 |
| CVSS | High: 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 (ラボ: anonymous ftp) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18720 のみ |
誰が: 運用者が cmds_denied を設定したデーモン上の認証済み FTP ユーザー(anonymous またはローカル)。デフォルトは未設定。man ページが挙げる仮想ユーザーのレシピは guest uid を共有するため、Unix DAC ではそれらを分離できない。セッションはすでに通常の chroot 内でマップされた uid である。cmds_denied は、その動詞を奪うはずだった追加の制御であった。
| メソッド + シンク | 権限 |
|---|---|
cmds_denied=RMD 後の XRMD labdir | handle_rmd -> セッション uid が Unix-rmdir できるディレクトリの str_rmdir。ラボ: RMD labdir 550、XRMD labdir 250、CWD labdir 550 (ディレクトリは消滅)。2 回目の MKD labctrl は RMD で依然 550。 |
| メソッド + シンク | 権限 |
|---|---|
cmds_denied=MKD 後の XMKD dir | handle_mkd -> セッション uid として mkdir |
cmds_denied=CWD 後の XCWD path | handle_cwd -> chdir。その後 download_enable なら RETR |
cmds_denied=STOR 後の STOU / APPE | handle_upload_common の作成 / 追記。write_enable が必要 |
cmds_denied=PASV 後の EPSV / P@SW | handle_pasv が、拒否リストが止めるはずだったデータリスナーを開く |
ラボで実証したのは RMD 後の XRMD のみ。他のエイリアスは同じ str_equal ゲートと同じディスパッチ内の OR を共有する。私はそれらを試していない。
第一級の取りこぼしとしてはなし。cmds_denied は隠蔽ではない。XRMD は名前を列挙しない。
バーには含まれない。ディレクトリの削除は完全性への打撃である。その名前の後続の CWD / RETR は副作用として 550 になる。
cmds_denied (ログイン前はこれを無視する。USER/PASS/QUIT はログイン前テーブルのまま)allow_writeable_chroot はデフォルト off。ラボは /incoming の下にのみ書き込むため、拒否は依然として有効)cmds_allowed のフェイルクローズ: XRMD を含む未記載の動詞は 550 のままwrite_enable=NO は依然として書き込み系 (STOR/MKD/RMD/DELE/RNFR/RNTO/SITE/APPE/STOU) をブロックするSITE 対 site のケースバイパス (ftpcmdio.c str_upper)cmds_denied=CHMOD は決して一致しない。chmod は chmod_enable=NO または cmds_denied=SITE で殺す私は公式 3.0.5 で hide/deny/cmds_denied を探した。ゲートはカンマトークンを 1 回走査し、大文字化された動詞に対して str_equal するだけである。handle_rmd の内部に 2 つ目のチェックはない。RFC 775 は依然として XRMD を RMD として出荷している。よくある助言は cmds_denied=DELE,RMD。その文字列は XRMD を決して名指ししない。
誤った道: SITE 対 site をバイパスとして扱うこと。動詞は大文字化される。cmds_allowed も同様に扱うこと: そのリストはフェイルクローズであるため、記載されていないエイリアスは拒否されたままである。
cd lab
./run.sh
ループバック 127.0.0.1:18720。Compose プロジェクト vsftpd-cmds-denied-alias。公式 3.0.5 tarball は lab/ 内 (SHA-256 は上記)。cmds_denied=RMD、write_enable=YES、anonymous、書き込みは /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)。無報酬。vsftpd のいかなるミラーでも公開 GitHub issue を開かないこと。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]