私は* NIXベースのオペレーティングシステムに初めて触れました。私を混乱させることの1つは、プロセスまたはプログラムが特権タスクを実行しsetuid(0)
てから実行し、通常のuidに戻ることです。
私の質問は、任意のプロセスがルートを持たないようにする* NIXのメカニズムは何ですか?
単純なCプログラムを書くと、どの条件でsetuid(0)
この呼び出しが成功し、どの条件で失敗しますか?
答え1
基本的なアイデアは、プロセスが自分の権限だけを減らすことができるということです。プロセスはどの権限も取得できない場合があります。 1つの例外があります:プロセス実装するsetuid または setgid フラグが設定されたファイルのプログラムは、このフラグが示す権限を受け取ります。
このメカニズムは、プログラムが昇格された権限でランダムコードを実行することを許可しません。昇格された権限で実行できる唯一のコードは、setuid / setgid実行可能ファイルです。
IDが0のrootユーザーは、他のユーザーよりも高い権限を持っています。ユーザー0のプロセスはすべての操作を実行できます。 (グループ0は特別ではありません。)
ほとんどのプロセスは同じ権限で実行され続けます。ユーザーをログインしたりデーモンを起動したりするプログラムは root で起動し、すべての権限を削除し、ユーザーとして必要なプログラムを実行します (たとえば、ユーザーのログインシェル、セッションマネージャー、デーモンなど)。 Setuid(またはsetgid)プログラムはターゲットユーザーとグループとして機能できますが、多くのプログラムは、実行中の操作に応じて呼び出し元の権限と自分の追加権限を切り替えるために今説明するメカニズムを使用します。
すべてプロセスには3つのユーザーIDがあります。:これ本物ユーザーID(RUID)、効果的なユーザーID(EUID)と保存済みユーザーID(SUID)。アイデアは、プロセスが一時的に権限を取得し、必要がなくなったときにそれを放棄し、必要に応じて再び取得できることです。同様のメカニズムがありますグループ、実際のグループID(RGID)、有効グループID(EGID)、保存されたグループID(SGID)、および補助グループがあります。仕組みは次のとおりです。
- ほとんどのプログラムは、全体的に同じ実際のUIDとGIDを保持します。主な例外は、RUIDとRGIDをルートからターゲットユーザーとグループに切り替えるログインプログラム(およびデーモンランチャー)です。
- root権限を必要とするファイルアクセスと操作の場合は、有効なUIDとGIDを確認してください。特権プログラムは、特権操作を実行するかどうかに応じて有効IDを切り替えることがよくあります。
- 保存したIDを使用すると、有効なIDを切り替えることができます。プログラムは、保存されたIDと実際のIDの間で有効IDを切り替えることができます。
一部のタスクを実行するためにroot権限を必要とするプログラムは、EUIDがRUIDに設定されている状態で実行されることがよくありますが、権限が必要なタスクを実行する前にseteuid
EUIDを0に設定するように呼び出し、seteuid
後で再度呼び出してEUIDを再びRUIDに変更しますします。seteuid(0)
当時、EUIDが0でなくても、呼び出しを実行するにはSUIDが0でなければなりません。
同じメカニズムを使用してグループ権限を取得できます。典型的な例は、ローカルユーザーが高いスコアを保存するゲームです。ゲーム実行可能ファイルはsetgidですgames
。ゲームが開始されると、EGIDはに設定されますが、games
ユーザーが通常許可しない操作を実行する危険がないようにRGIDに戻ります。ゲームでトップスコアを保存しようとすると、一時的にEGIDがに変わりますgames
。この方法:
- 高得点ファイルには一般ユーザーにはない権限が必要なので、高得点ファイルにアイテムを追加する唯一の方法は、ゲームをプレイすることです。
- ゲームにセキュリティの脆弱性がある場合に発生する可能性がある最悪の状況は、
games
このグループにユーザー権限を付与して高いスコアを否定することです。 - プログラムがこの関数を呼び出すのを妨げるバグがゲーム内にある場合
setegid
(たとえば、ゲームが予期しないファイルに単にゲームを書き込むバグ)、このバグは高いスコアに対する不正行為を許可しません。ゲームを呼び出さないと書き込み権限がありません。トップスコアファイルを入力してくださいsetegid
。
上で私が書いたことは、基本的な伝統的なUnixシステムを説明することです。一部の最新システムには、既存のUnix権限モデルを補完する追加機能があります。これらの機能は、基本ユーザー/グループライブ/実際のシステムを補完し、時には対話します。これらのアドインについて詳しくは説明しませんが、Linuxセキュリティモデルの3つの機能について説明します。
- 多くのタスクを実行する権限は、次のように行われます。能力ユーザーID 0の代わりに。たとえば、ユーザーIDを変更するには、
CAP_SETUID
ユーザーIDがゼロ以外の機能が必要です。ユーザーID 0で実行されるプログラムは、おなじみのパスから離れない限り、すべての機能を取得します。ユーザーID 0で実行されるプログラムはrootCAP_SETUID
権限を取得できるため、実際にrootとして実行することとCAP_SETUID
同じです。 - Linuxにはいくつかセキュリティフレームワークこれにより、プロセスがユーザーID 0で実行されていても、プロセスが実行できる操作を制限できます。一部のセキュリティフレームワークでは、既存のUnixモデルと機能とは異なり、
execve
実行可能なメタデータのフラグではなく、セキュリティフレームワークの設定がプロセスを失敗させる可能性があります。 - Linuxはユーザー 名前空間。名前空間からルートとして実行されるプロセスは、その名前空間内でのみ権限を持ちます。
答え2
ユーザーIDに加えて、プロセスは有効なユーザーIDに関連付けられます。 setuid ルートプログラムが実行されると、su
有効な uid は 0 に設定されますが、実際の uid は変更されません。名前が示すように、有効なuidは権限検証に使用されるuidであり、実際のuidは「私たちが実際に誰であるか」を伝えます。有効なuidが0のプロセスは、setuid(0)
実際のuidを0に変更する呼び出しに成功する可能性があります。
答え3
setuid(some_uid) が機能するには、次の条件を満たす必要があります。
- 実行可能ファイルのファイルはsome_uid 1が所有する必要があります。
- 実行可能ファイルには setuid 権限が必要です。
次のコマンドを使用して、Setuid権限を付与または削除できますchmod
。
chmod u+s execuables_file_name
chmod u-s execuables_file_name
s
setuid権限が付与されると実行権限が置き換えられるため、ファイル権限を表示するとSetuid権限が表示されます。
> ll execuables_file_name
-rwsrwxr-x 1 root root 0 Sep 30 17:23 execuables_file_name*
何らかの理由で所有者ユーザーが実行権限を持っていない場合は、大文字の S と表示されます。
> ll execuables_file_name
-rwSrwxr-x 1 root root 0 Sep 30 17:23 execuables_file_name*
気づくスクリプトは全く違う獣。
徹底的に権限ガイド。
1. プロセスを開始したユーザー ID に変換すると、 setuid(some_uid) も成功します。