
ProFTPD 1.3.9d - 高 - リモート - 権限残留 / ファイル書き込み - SFTP copy-file が宛先 WRITE をスキップ
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-sftp-copy-file-write
クラス: 権限の取りこぼし / ファイル書き込み 到達範囲: リモート
ProFTPD 1.3.9d (f59f248) - proftpd.org
contrib の mod_sftp は、SFTPEngine が有効になると copy-file をアドバタイズする (SFTP_FXP_EXT_DEFAULT)。fxp_handle_ext_copy_file は、pr_fsio_stat(dst) が成功した場合に限り、宛先の WRITE と AllowOverwrite を実行する。まだ存在しない宛先はこのチェックをスキップする。その後 pr_fs_copy_file2 が、<Limit WRITE> DenyAll の配下であっても、セッション UID としてファイルを作成する。
FTP STOR と SFTP OPEN-write は依然として xfer_pre_stor を経由し、これは作成前に必ず dir_check で WRITE を確認する。公開されている Issue 2095 はその逆で、SITE COPY がソースの READ をスキップするものだ。今回の取りこぼしは、新しい名前に対する宛先の WRITE である。
| ID | CVE 未採番 |
| クラス | 権限の取りこぼし / ファイル書き込み |
| 到達範囲 | リモート (認証済み SFTP) |
| 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 |
| 製品 | ProFTPD |
| 影響を受けるバージョン | 1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_sftp |
| 認証 | 認証済み SFTP (SFTPEngine on) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
私はタグ v1.3.9d を固定し、fxp_handle_ext_copy_file を読んだ。これは偽の SITE COPY の PRE_CMD をディスパッチする。mod_copy は copy_copy を CMD として登録し、PRE_CMD としては登録しないため、FTP の宛先 WRITE チェックはこの経路では決して実行されない。ソースの READ は常に dir_check される。宛先の WRITE は、宛先が既に存在しない限り、されない。ラボは 127.0.0.1:18710 上のループバック SFTP である。
| 手法 | シンク | 権限 |
|---|---|---|
SFTP EXTENDED copy-file で読み取り可能な src を、まだ存在しない宛先名へ、<Limit WRITE> DenyAll を含む <Directory> 配下でコピー | pr_fs_copy_file2 | 完全性 (ラボで実証): そのファイルをセッション UID として作成する。偵察 (ラボで実証): 宛先の READ が許可されている場合、宛先の SFTP READ がソースのバイト列を返す。 |
| 同じ宛先が既に存在する | dir_check WRITE + AllowOverwrite | クローズ (ラボで実証): copy-file による上書きは permission denied を返す。 |
| 同じ宛先への SFTP OPEN / STOR / SCP アップロード | xfer_pre_stor | クローズ (ラボで実証): OPEN の write/create は SSH_FX_PERMISSION_DENIED (ステータス 3)。 |
| 未認証の copy-file | SFTP 認証 | クローズ。シェルなし。Unix DAC は依然として適用される。 |
ラボで実証 vs 推測: 宛先の作成、witness の宛先 READ、OPEN-write の拒否、既存宛先の上書き拒否はラボで実証済みである。未認証と Unix DAC は、認証/chroot モデルからの推測のままである。
必要条件: contrib mod_sftp がロードされていること、SFTPEngine on。典型的なディストリビューションの SFTP vhost。SFTPExtensions -copyFile で拡張機能をオフにできる。
cd lab
./run.sh
ループバック 127.0.0.1:18710 はコンテナの 2222 にマッピングされる。Compose プロジェクト proftpd-sftp-copy-file-write。イメージタグ proftpd-sftp-copy-file-write:1.3.9d。Witness PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS。最終行:
SUCCESS PROFTPD-SFTP-COPY-FILE-WRITE dest-exists=yes open-write=denied copy-file=ok overwrite-denied=yes PROFTPD-SFTP-COPY-FILE-WRITE-WITNESS
pr_fs_copy_file2 の前に、宛先がまだ存在しない場合でも宛先の WRITE を dir_check する。あるいは拡張機能を無効化する: SFTPExtensions -copyFile。
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_sftp/fxp.c 内の fxp_handle_ext_copy_fileSFTP_FXP_EXT_DEFAULT は copy-file を含む