web-dev-qa-db-ja.com

setuidをファイルシステム機能に置き換える方法

インスピレーション この質問 ここにフォローアップがあります:

Setuid-binariesが危険であることをご存知の方もいらっしゃるかもしれませんが、一部のエクスプロイトはこれらを使用して権限をrootまでエスカレートします。

現在、setuidを別のより安全な手段に置き換えるという興味深いアイデアがあったようです。

どうやって?

5
Nils

Linuxのファイルシステム機能が追加され、setuidだけで許可されるよりもきめ細かい制御が可能になりました。 setuidを使用すると、ユーザー(通常はroot)への有効な特権の完全なエスカレーションになります。 abilities(7)のマンページには、次の説明があります。

パーミッションチェックを実行する目的で、従来のUnix実装は、特権プロセス(有効なユーザーIDが0、スーパーユーザーまたはルートと呼ばれる)と非特権プロセス(有効なUIDがゼロ以外)の2つのカテゴリのプロセスを区別します。特権プロセスはすべてのカーネルパーミッションチェックをバイパスしますが、非特権プロセスはプロセスの資格情報(通常:有効なUID、有効なGID、および補足グループリスト)に基づいて完全なパーミッションチェックの対象となります。

カーネル2.2以降、Linuxは、従来スーパーユーザーに関連付けられていた特権を、機能と呼ばれる個別の単位に分割します。これらの単位は、個別に有効または無効にできます。機能はスレッドごとの属性です。

アプリケーションがchroot()を呼び出す機能を必要とする場合(通常はrootに対してのみ許可されます)、CAP_SYS_CHROOTはsetuidではなくバイナリに設定できます。これは、setcapコマンドを使用して実行できます。

setcap CAP_SYS_CHROOT /bin/mybin

RPMバージョン4.7. 以降、%capsを使用してパッケージファイルに機能を設定できます。

Fedora 15には リリース目標 これで追跡されたすべてのsetuidバイナリを削除する バグレポート がありました。バグレポートによると、この目標は達成されました。

機能ベースのセキュリティ に関するウィキペディアの記事は、興味のある人なら誰でも読むことができます。

6
jordanm