SUIDプログラムでsetuid()を使用する目的

SUIDプログラムでsetuid()を使用する目的

passwdこのようなSUIDプログラムを呼び出す関数がどの機能を使用しているかを知りたいですsetuid()。ルート権限を放棄するのはなぜですか?

これはどのような攻撃から保護するのに役立ちますか?バッファオーバーフロー?

ベストアンサー1

まず、passwdが使用するsetuidビットについて説明します。これはsetuid()システムコールとは異なります(passwdは使用しません)。この点で、この問題について少し混乱がある可能性があります。

バッファオーバーフローに対する保護ではありません。脆弱このタイプの攻撃、または基本的に攻撃者が意図しない邪悪な目的のために特権プロセスを使用できるようにするすべての攻撃。これは setuid ビットが「権利放棄」と反対であるためです。置くルート権限はありますが、プロセス実際のユーザーではなく含まれますpasswd

passwdこの形式のsetuidは読み取りおよび書き込み権限を必要とするため、実行可能ファイルにファイルシステムのsetuidビットを設定する必要があります/etc/passwd。しかし、私たちは、passwdに不道徳な人が/ etc / passwdを読み書きする以外に他のタスクを実行することを可能にする既知のセキュリティ脆弱性(潜在的なオーバーフローの脆弱性など)がないことを願っています。ルートとして実行されるのでできる何でもしてください。ただし、特定のタスクを1つだけ実行し、他のタスクを実行するように設計されている場合は除外されます。しなければならない(再び、希望)は不可能です。

だからこの意味で setuid を使用しても何も防止されません。しかし、潜在的な脆弱性はWRT setuid実行可能ファイルにとって非常に重要であるため、脆弱性に関して頻繁に議論されています。

しかし: setuid ビットがセットされました。UID実際のuidの代わりに、実際にはseteuid()システムコールに似ています。いいえ setuid()

権限を削除する「setuid」の逆形式があります。これには実際のsetuid()システムコールが含まれ、setuid ビットは不要です。これは、rootとして実行されているプロセス(rootまたはsudoが起動したため)のuidが権限の低いユーザーに変更されたことを意味します。通常、サーバーとデーモンが起動するとき(たとえば、特権ポートを開く)、ルート権限が必要ですが、それ以降はそうでない場合に実行されます。これにより、サーバーが後でハイジャックされると、スーパーユーザー権限がなくなります。 root権限を呼び出すか再取得することはできませんsetuid(0)。しかし、set*を使うことはできます。金利*UID)。

おすすめ記事