
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) における大文字化されたトークンの完全一致である。その後ディスパッチは 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 (ディレクトリは消えた)。続く 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 はデフォルトでオフ。ラボでは /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。lab/ 内の公式 3.0.5 tarball(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)です。無報酬です。vsftpd のいかなるミラー上でも公開 GitHub issue を開かないでください。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]