-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 /
-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 userにc/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
を実行しないでください!
攻撃の可能性があります。送信者のこれから始めます:
sender:/path/to/sourcedir
└── foo@ -> /etc/
Rsyncを1回実行して、これを取得します。
receiver:/path/to/targetdir
└── foo@ -> /etc/
これを送信者に変更してください:
sender:/path/to/sourcedir
└── foo/
└── passwd
Rsyncが再び実行されると、/ etc/passwdがレシーバーで上書きされます。
バインドマウントは、rsyncが常にそれらを介して書き込みを行うが、それらを作成しないため、この攻撃を防止します。