私はコンピュータセキュリティ試験の勉強をしていますが、次のサンプル問題を理解するのに苦労しています。
x86 のリング 0 で実行することと、Linux で UID 0 として実行することの違いを説明してください。それぞれが有効になっていて、もう一方が無効になるものの例を挙げてください。'
私の現在の理解では、x86 のリング 0 は最も特権のある OS レベルであり、カーネル コードはリング 0 で実行されます。UID 0 は、基本的に何でも実行できる Linux スーパーユーザーです。これらの概念に関する現在の理解では、この質問にどう答えたらよいかわかりません。
注意してください、これは宿題の質問ではなく、採点の対象にもなりません。これは単なる学習教材です。
答え1
あなたの理解は正しいです。「リング 0」は、プロセッサのカーネル モードを表す x86 用語です。「リング 0 で実行」は「カーネル コード」を意味します。
セキュリティの観点から言えば、プロセス (任意の UID 下) で実行できるすべての操作はカーネルでも実行できます。ファイルを開くなど、カーネル コードから実行するには非常に不便な操作もありますが、実行は可能です。
逆に、通常の状況では、UID 0 でコードを実行できる場合は、カーネル モジュールをロードすることでカーネル コードを実行できます。したがって、一般的な構成では、UID 0 とカーネル レベルの間にセキュリティ バリアはありません。ただし、プロセスで実行されるコードは、プロセッサのユーザー モードの制限によって制限されます。周辺機器 (ディスク、ネットワークなどを含む) へのアクセスはすべて、システム コールを経由する必要があります。マシンを、すべての権限を持たない UID 0 を持つように構成することは可能です。たとえば、次のようになります。
- カーネルモジュールの読み込みを無効にします。
- 使うセキュリティフレームワークのようなカーネルプロセスから権限を剥奪する: UID 0 が必ずしもそれらよりも優先されるわけではありません。たとえば、適切な SELinux ポリシーを使用すれば、UID 0 で実質的に権限のないゲスト アカウントを作成できます。
- UID 0のユーザー名前空間名前空間の作成者の権限のみを持ちます。