一般に、確実に知ることは不可能です - 一見完全に安全に見えるプログラムでさえ、任意のアクションに使用できることを意味する脆弱性を持っている可能性があります - しかし、チェックすべきいくつかの点があります:
プログラムは次のいずれかを行いますか?
- 任意のファイルまたはデバイスの内容を明らかにする
- 任意のファイルをコピー、移動、書き込み、または削除する
- 任意の環境変数 (他の特権プロセスによって取得される) を設定または変更するか、特定の環境変数に任意の変更を加える
- IOCTL を呼び出すか、任意のデバイスとやり取りします。
- 任意のファイルの所有権または権限を変更する
- 任意のファイル システムをマウントするか、既存のファイル システムのマウント オプションを変更する
- システムまたは任意のプロセス (デバッガなど) のメモリへの直接アクセスを許可します。
- 任意のプログラムの起動を許可する
これらのいずれかを実行するプログラムはありません 権限の低いユーザー sudo
に付与しても安全 へのアクセス。これにより、たとえば、出力ファイルを指定できるプログラム (通常は -o
を介して) が除外されます。 または -f
パラメータ)、その内容を明らかにする任意の方法で入力ファイルを処理し (入力形式が間違っているという十分に有益なエラー メッセージを介しても)、大部分のスクリプト ランタイム (シェルを含む) を処理します。
任意を置き換える場合 限定の小切手で または特定の 、その後、問題を 1 ステップ (または数ステップ) キックダウンしました:プログラムが実行できることのいずれかを行います そのような恣意的な出来事は、おそらく複数のレベルの間接化を通じてですか?たとえば、プログラムでユーザーが一意の環境変数を設定できるようにすると、特権プログラムが予想とは異なるファイルを読み取ることになり、その別のファイルにより、システムはユーザーが選択したイメージ ファイルを次のようにマウントできるようになります。 setuid
のファイルシステム 少し尊重するなら、信頼できないユーザーがそのプログラムを実行することを許可してはなりません.
ただし、プログラムがこれらすべてのチェックに合格したからといって、そのプログラムが実際に安全であるとは限りません。たとえば、特定のネットワーク アクション (制限されたポートでリッスンする、未加工のパケットを送信するなど) を実行する場合、ネットワーク (または同じマシン) 上に別のプログラムが存在する可能性があるため、すべてのプロセスがそのようなことを実行できると仮定すると、安全ではない可能性があります。物事は信頼できるユーザーによって所有されています - 結局のところ、これらのアクションにはルートが必要です - そしてあなたはその仮定を破りました。さらに、上記の箇条書きのリストは、私が数分で思いついたものです。私が含めなかった特権エスカレーションへの手段がいくつかあることはほぼ確実です。
最後に、すべてのセキュリティに関する質問と同様に、脅威モデルによって異なります。
- 攻撃者 (信頼されていないユーザー) は、物理的にアクセスできるマシンに対してローカルですか、それともリモートですか?特に支援なしでマシンを (再) 起動できるようにする必要がある場合、物理的なアクセス権を持つ断固たる攻撃者が root を取得するのを防ぐことは非常に困難です。そのため、どのようなリスクを受け入れるかを検討してください。
- マシンはユーザー間で共有されていますか?次に、サービス妨害 (過剰なリソースを消費したり、マシンを使用不能にすることによる) など、追加のクロスユーザー攻撃を検討する必要があります。
- 否認防止 (誰が何かを行ったかを証明する機能) が必要ですか?次に、
sudo
を介して実行されたアクションを結び付けることができることを確認する必要があります それらを行ったユーザーに。 - root 以外のユーザーでも通常は実行できること (たとえば、ゲームやクリプトマイナーなどのプログラムであっても、自分のユーザー コンテキストで任意のプログラムを実行したり、TCP クライアントを開いたりするなど) をユーザーが実行できないようにする必要がありますか?任意のホストおよびポートへの接続)?次に、この制限を強制する手段をさらに検討し、ユーザーが制限を回避する方法につながる可能性のあるプログラムを sudo として実行しないようにする必要があります。
ここでは真に包括的な答えを出すことはできません。それはあまりにも多くのものに依存しています。しかし、私はこう言います:非常に難しい 信頼できないユーザーが root として重要なプログラム (そのように安全に実行するように明示的に設計されていないプログラム) を実行できることを考えると、予期しないことを実行できないようにするためです。そのようなプログラムの 1 つが、防止することが重要であると思われるものを許可しない場合でも、攻撃者の目的を達成するために、複数のそのようなプログラムを連鎖させることができる可能性があります。
基本的に停止の問題に要約されます。コードを監査したり、バイナリをリバース エンジニアリングしたりできますが、任意のコマンドを実行できる「機能」がなくても、バイナリまたは sudo 自体に脆弱性が存在し、有効なユーザーの root としての任意のコマンドの実行。