web-dev-qa-db-ja.com

オペレーティングシステムは、非特権プロセスが特権命令を実行するのをどのように防止しますか?

Unixでは、

ゲストユーザーで、次のことを行った場合:

chmod 777 /

それは失敗するでしょう。

しかし、これはハードウェアレベルで内部的にどのように発生しますか?

これまでのところ、これが起こると思います:

  • OSはその命令を実行しようとします。
  • 権限に関する情報は、おそらくセカンダリメモリのどこかにあります。したがって、書き込み命令を発行します。
  • 2より前は、ユーザーがこれを行う特権があるかどうかを確認します。そうでない場合は、エラーメッセージが表示されます。

これはどのように起こるのですか、それともそのような状況が発生したときに割り込みが発生しますか?非特権命令に対応するメインメモリのISRテーブルにルーチンがありますか?

8
learner

chmodファイルシステム操作であり、特権命令ではありません。 ファイルシステムのアクセス許可はハードウェアレベルでは処理されません。ソフトウェア(具体的にはOS)は、システムコールを呼び出すプロセスがファイルシステムオブジェクトで操作を実行するための十分な権限がなく、システムコールが権限エラーで返されます。

実際、あなたは2つの異なる質問をしています。

  1. オペレーティングシステムは、非特権プロセスが特権命令を実行するのをどのように防止しますか?
  2. 特権のないプロセスが_chmod 777 /_を呼び出せないのはなぜですか?

2の答え:

chmodは、libcから関数を内部的に呼び出します(便利なことにchmod()とも呼ばれます)。この関数は、呼び出し元が操作に対して十分な特権を持っているかどうかをチェックします。持っていない場合は、エラーEPERMを返します。

1の答えはもっと興味深いです:

正確なメカニズムはOSとハードウェアプラットフォームによって異なりますが、基本的には次のようになります。最新のプロセッサにはすべてセキュリティ機能が組み込まれています。これにより、OSはプロセッサに「このプログラムを実行しますが、これらの特権命令を実行させないでください」と伝えることができます。したがって、プロセッサ自体が許可された命令に制限を適用します。プログラムが特権命令を実行しようとすると、プロセッサは制御をOSに戻します。これにより、通常、誤動作しているプログラムが終了します。詳細については、例えばを参照してください。 https://en.wikipedia.org/wiki/Ring_%28computer_security%29

5
sleske