GNU/Linux >> Linux の 問題 >  >> Linux

sudo で find を安全に使用する

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).

これは私にとってはうまくいきました。 (「#」で始まる行はルート、「$」で始まる行は非ルートです) この場合、非ルートユーザーは 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 チェックの性質上、ライブラリ shim 攻撃は機能しないはずです。また、ケーパビリティ ビットも (生の setuid とは異なり) 子プロセスに継承されないため、これもおまけです。

あなたがしたいことは、一時ファイルの作成またはアクセスに関してプライバシー上の懸念を引き起こす可能性があること、およびプログラムが競合状態/特権昇格の試みを開始するための基礎として使用される可能性があることに注意してください (既知のファイル名を作成するプログラムに対して)ただし、正しいセキュリティ チェックは行わないでください)。

また、不十分に作成されたアプリケーションの中には、意味を伝えたりデータを隠したりする方法として、ファイル メタデータやツリー構造に依存している場合があります。これにより、制限された情報が公開されたり、他の方法では知られていない特権ドキュメントが明らかになる可能性があります (あいまいさによるセキュリティですが、残念ながら、これは特にクローズドソース ベンダーが好んで行うことです)。

したがって、注意して慎重に実行し、明らかなことが機能しない場合でも、これに関連するリスクがまだあることを理解してください.

ああ、誰かがこのメカニズムを使用して、コメントで権限昇格の基礎として概念実証攻撃を行っているかどうかを知りたいです!


ロケートはどうですか?

<ブロック引用>

locate は、updatedb(8) によって準備された 1 つまたは複数のデータベースを読み取り、少なくとも 1 つのパターンに一致するファイル名を標準出力に 1 行に 1 つずつ書き込みます。 --regex が指定されていない場合、PATTERN にグロビング文字を含めることができます。 PATTERN にグロビング文字が含まれていない場合、locate はパターンが PATTERN であるかのように動作します。 .

デフォルトでは、locate は、データベースで見つかったファイルがまだ存在するかどうかをチェックしません。 locate は、関連するデータベースの最新の更新後に作成されたファイルを報告できません。

または、slocate を使用することもできます:

<ブロック引用>

Secure Locate は、システム上のファイルを安全にインデックス化し、すばやく検索する方法を提供します。 GNU ロケートと同様にインクリメンタル エンコーディングを使用してデータベースを圧縮し、検索を高速化しますが、アクセス権のないファイルがユーザーに表示されないように、ファイルのアクセス許可と所有権も保存します。

このマニュアルページでは、slocate の GNU バージョンについて説明しています。 slocateシステム ユーザーは、未承認のファイルを表示せずにファイル システム全体を検索できます。


ユーザーに適切な許可を与えます。

デフォルトでは、umask が 022 の場合 、ディレクトリが作成され、誰もがその中のファイルを一覧表示および統計できるようになります。そうでない場合は、ディレクトリのアクセス許可をビットごとに手動で変更するか、古いアクセス許可と 0555 に変更できます。 :

chmod +0555 foo

また、それらのユーザーがそのディレクトリのすべての親に対して実行権限を持っていない場合 (たとえば、別のユーザーのホーム ディレクトリ)、おそらく最初のディレクトリを別の場所に配置する必要があることを意味します。

一部のユーザーのみにそのディレクトリの読み取りと実行を許可する場合は、モードを 0750 に変更できます。 、それらのユーザーをグループに入れ、ディレクトリのグループ所有者をそのグループに変更します:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo

Linux
  1. Sudoを使用したリダイレクトまたはパイピングを含むコマンドを実行するにはどうすればよいですか?

  2. Linux – Linux上のデバイスに関連付けられているドライバー(モジュール)を見つける方法は?

  3. sudo権限で現在のシェルでシェルスクリプトを実行する

  1. プロセスが実行されているフォルダーを見つける方法は?

  2. Linux で /dev/root が表すデバイスを調べますか?

  3. 推奨される使用方法に従って、Web サイトは /var/ または /usr/ に配置する必要がありますか?

  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Bash =〜正規表現とHttps://regex101.com/?

  3. / dev/randomと/dev/ urandomをいつ使用するか?