
ProFTPD 1.3.9d - 高 - リモート - 権限残留 / ファイル書き込み - SITE COPY の宛先がシンボリックリンクを追跡
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · proftpd-site-copy-dest-follow
クラス: 権限の取りこぼし / ファイル書き込み 到達範囲: リモート
ProFTPD 1.3.9d (f59f248) - proftpd.org
contrib の mod_copy の SITE COPY は、dest を dir_canonical_vpath(未解決)で Limit チェックする。その後 pr_fs_copy_file2 が dest を O_NOFOLLOW なしで open するため、dest のシンボリックリンクが辿られる。FTP STOR は解決済みパス(dir_realpath / dir_best_path)で Limit チェックする。SITE COPY の dest はそうではない。
認証済み FTP ユーザーが、dest のシンボリックリンクを対象ファイルに向けて SITE COPY を発行することで、WRITE 拒否されたファイルを上書きする。 被害者への直接 STOR および SITE COPY は 550 のまま。リンクに対する STOR / SITE RMDIR / RMD も 550 のまま。DELE はリンクノードのみを削除する。シェルはなし。Unix DAC は依然として適用される。
これは公開されている Issue 2095(SITE COPY の source READ スキップ)の逆である。公開されている Issue 2256(RNTO EXDEV シンボリックリンク追従)とは別物である。この取りこぼしは EXDEV だけでなく、すべてのコピーにおける SITE COPY の dest である。
| ID | CVE 未割当 |
| クラス | 権限の取りこぼし / ファイル書き込み |
| 到達範囲 | リモート(認証済み FTP) |
| CWE | CWE-59, 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 タグ v1.3.9d (f59f248e26bdfa514443e42bf72a145641df635d) contrib mod_copy |
| 認証 | 認証済み FTP(mod_copy ロード済み、CopyEngine デフォルト有効)。SITE SYMLINK の設置には、リンクが既に存在しない限り contrib mod_site_misc も必要 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
誰が: 認証済み FTP ユーザー。mod_copy ロード済み。WRITE 許可ディレクトリ内の dest シンボリックリンク(SITE SYMLINK、または既存のリンク)。SITE SYMLINK の src は dir_check_canon G_READ を使用するため、被害者ファイルへのリンクを設置するにはそのファイルへの READ が必要。この分離は READ 許可、WRITE 拒否である。セッション UID は依然としてターゲットを Unix で書き込める必要がある。
| 手法 | シンク | 権限 |
|---|---|---|
| WRITE 許可ディレクトリ内の SITE SYMLINK(または既存リンク)で、そのターゲットが UID で Unix 書き込み可能な WRITE 拒否ファイル; そのリンクを src とする読み取り可能な SITE COPY | pr_fsio_open の dest が追従 | 完全性(ラボ実証済み): Limit 拒否されたファイルをセッション UID として切り詰め/上書き。ラボ: /secret/victim が ORIGINAL から SITE COPY /readable/src.txt /upload/link 後の witness に変化。/secret/victim への直接 SITE COPY は 550 のまま。 |
| 同じリンクに対する SITE RMDIR | dir_check_canon -> dir_best_path | クローズ済み(ラボ実証済み): 550 RMDIR /upload/link: Operation not permitted。被害者は無傷。 |
| 同じリンクに対するコア RMD | dir_best_path + WRITE | クローズ済み(ラボ実証済み): 550 Permission denied。被害者は無傷。 |
| dest リンクへの STOR | dir_best_path + WRITE | クローズ済み(ラボ実証済み): STOR /upload/link -> 550。被害者は無傷。 |
| dest リンクへの DELE | リンクノードの unlink | 被害者に対してクローズ済み(ラボ実証済み): DELE はリンクのみを削除; 被害者は依然として witness を保持。 |
ホスト /etc への DefaultRoot ジェイル | chroot | クローズ済み。Unix DAC は依然として適用される。未認証なし。シェルなし。 |
ラボ実証済み vs 推測: 未解決 dest シンボリックリンク経由の上書き、拒否された STOR/RMDIR/RMD、およびリンクのみの DELE はラボ実証済み。未認証および Unix DAC は認証/chroot モデルからの推測のまま。
私は proftpd/proftpd v1.3.9d (f59f248) を固定した。サンプル basic.conf を使用したデフォルトのコア FTP には未公開の Crit/High はなかった。次に contrib の mod_copy に取り組んだ。
copy_copy(contrib/mod_copy.c)は dest を dir_canonical_vpath で構築し、その未解決文字列に対して dir_check(..., G_WRITE, to) を実行する。pr_fs_copy_file2(src/fsio.c)は stat/open が dest シンボリックリンクを辿るとコメントし、その後 pr_fsio_open(dst, O_WRONLY|O_CREAT|O_NONBLOCK) を O_NOFOLLOW なしで実行する。
公開 Issue 2095 は SITE COPY の source READ スキップである。その正確なバグはスキップする。公開 Issue 2256 は RNTO EXDEV 追従である。この取りこぼしはすべてのコピーにおける SITE COPY の dest である。
SITE RMDIR の再帰追従は親のドロップであった: SITE RMDIR は dir_check_canon / dir_best_path を使用し、これらは Limit の前にシンボリックリンクを解決する。ラボで SITE RMDIR およびコア RMD が dest リンクに対して拒否されたままであることを確認した。
既に記録済みの誤った道: STOR がそうであるからといって dest の Limit を解決済みとして扱うこと; Issue 2256 をこの取りこぼしと同一視すること; SITE RMDIR が被害者を辿ると主張すること。見せかけ: リバースシェル。オラクルは、/upload/link 経由の SITE COPY 後に /secret/victim が witness を保持し、リンクへの STOR が依然として 550 であることである。
python3 proftpd-site-copy-dest-follow-Abraxas-Labs.py
または:
cd lab
./run.sh
ループバック FTP 127.0.0.1:18720、パッシブ 18721-18730。Compose プロジェクト proftpd-site-copy-dest-follow。Witness PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS。最終行:
SUCCESS PROFTPD-SITE-COPY-DEST-FOLLOW victim-has-witness=yes stor-secret=denied stor-link=denied site-rmdir-walk=no rmd-walk=no dele-victim=intact PROFTPD-SITE-COPY-DEST-FOLLOW-WITNESS
解決済みの dest を Limit チェックする(dir_realpath / dir_best_path)、または dest を O_NOFOLLOW で開く。STOR は既に解決済みパスを Limit チェックしている。
ベンダーへの報告は [email protected]。proftpd/proftpd に公開 GitHub issue を立てないこと。
f59f248e26bdfa514443e42bf72a145641df635d)contrib/mod_copy.c copy_copysrc/fsio.c pr_fs_copy_file2<Limit READ>GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。