passwd
のようなSUIDプログラムがsetuid()
関数呼び出しを使用しているのだろうか。なぜroot権限を削除するのですか?
これはどのような種類の攻撃に対して役立ちますか?バッファオーバーフロー?
最初に、passwdが使用し、setuid()
システムコール(passwdが使用しない)とは異なるsetuidビットについて説明します。この点に関して、質問にはおそらく混乱があります。
これは、バッファオーバーフローに対する保護ではなく、vunerableであるか、基本的に、攻撃者が特権プロセスを悪意のある意図しない目的で使用できるようにするものです。これは、setuidビットが「特権の削除」の反対であるためです。 it bestows root権限ですが、processのみであり、実際のユーザーではありません。これにはpasswd
が含まれます。
この形式のsetuidには、実行可能ファイルに設定されたファイルシステムsetuidビットが必要です。 passwd
には、_/etc/passwd
_の読み取りと書き込みの権限が必要なため、これがあります。ただし、passwdには、/ etc/passwdの読み取りと書き込み以外の(そしてそれを適切に行う以外の)ことを悪意のある人に行わせる可能性のある既知のセキュリティ脆弱性(たとえば、潜在的なオーバーフローエクスプロイト)がないことを願っています。ルートとして実行されるため、could何かを実行します-ただし、特定の1つのことだけを実行するように設計されており、他のことを実行するように設計されていますshould(繰り返しますが、うまくいけば)不可能です。
したがって、その意味でsetuidを使用することは、何に対しても保護されませんが、潜在的な脆弱性は非常に重要なWRT setuid実行可能ファイルであるため、脆弱性に関連して説明されることがよくあります。
ただし、setuidビットは実際のuidではなく euid を設定するため、実際にはseteuid()
システムコールおよびnotsetuid()
。
特権の削除に関する「setuid」の反対の形式があります。これには、実際のsetuid()
システムコールが含まれ、setuidビットは必要ありません。これは、rootとして実行されているプロセス(rootまたはSudoが開始したため)がそのuidを特権の少ないユーザーに変更する場合です。サーバーとデーモンは、起動時にroot権限が必要な場合(たとえば、特権ポートを開くため)にこれを行うことがよくありますが、その後は必要ありません。そうすれば、サーバーがその後ジャックされた場合、サーバーにはスーパーユーザー権限がありません。 setuid(0)
を呼び出してroot権限を取り戻すことはできません(ただし、set *e* uidを使用することはできます)。
それは単に予防策です。誤ってコーディングされた場合、どのアプリも、考えられるあらゆるエクスプロイトに対して脆弱になる可能性があります。起こりうる損害を減らす秘訣は、必要最小限の特権でアクションを実行することです。不要なときにrootとして実行することをやめることは、優れたスタートです。