による man 7 capabilities
CAP_DAC_READ_SEARCH
* Bypass file read permission checks and directory read and execute permission checks;
* Invoke open_by_handle_at(2).
これでうまくいきました。( '#'で始まる行はrootで、 '$'で始まる行は非rootです)この場合、非rootユーザーがwheel
グループに属しています。
# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root
find: ‘/root’: Permission denied
$ sudofind /root
/root /root
/root/Testbed
...
...
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec 4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =
機能が付与するものを考えると、それはまさにあなたが望むものに適合します。私はfind
ファイル内のバイトを読み取ることができる機能があるかどうかを徹底的にチェックしていませんがLD_PRELOAD
、Linuxのsetuidチェックの性質上、ライブラリシム攻撃などの明らかなものは機能せず、機能ビットが取得されません(生のsetuidとは異なり)いずれかの子プロセスによって継承されるので、これもまたボーナスです。
あなたがしたいことは一時的なファイルの作成やアクセスに関してプライバシーの問題を引き起こす可能性があることを覚えておいてください、そしてプログラムは競合状態/特権エスカレーションの試み(既知のファイル名を作成するプログラムに対して)の基礎として使用できますただし、正しいセキュリティチェックは行わないでください)。
また、一部の不適切に記述されたアプリケーションは、意味を伝えたりデータを非表示にしたりする方法として、ファイルメタデータまたはツリー構造に依存している場合があります。これにより、制限された情報がリリースされたり、他の方法では知られていない特権ドキュメントが公開されたりすることがあります(あいにく、セキュリティは不明ですが、これは特にクローズドソースベンダーが行いたいことです)。
したがって、注意を払い、それを行う場合は注意してください。明らかなことがうまくいかなくても、これに伴うリスクがあることを理解してください。
ああ、私は誰かがこのメカニズムをコメントの特権昇格の基礎として使用する概念実証攻撃を持っているかどうかを確認するのに興味があります!