システム コールのスタブ ルーチンは、trap 命令によってカーネル モードに切り替わります。ユーザー プロセスがトラップ命令を単独で使用してカーネル モードに切り替え、切り替え後に悪意のあるコードを実行するのを防ぐにはどうすればよいですか?
1 に答える
トラップ命令は、CPU モードをユーザーからカーネルに切り替えるだけではありません。実際には次のことを行います。
モードを切り替え、CPU 命令ポインターをカーネル内の指定された割り込みハンドラーにジャンプさせるため、技術的には、trap 命令を呼び出すと、コードが実行されることはありません。
例として x86 + FreeBSD を見てみましょう:
すべてのオペレーティング システムには、基本的に割り込みハンドラーのリストである割り込みベクターと呼ばれるものがあります。IO が発生した場合、割り込みハンドラー 0x、CPU をカーネル モードにトラップする場合は、何が起こってもかまいません。 、割り込みハンドラ 0x80 を呼び出す必要があります。どのように呼ばれますか?
int 0x80
これが完了すると、CPU はハンドラー #80 (大まかに言えば) を実行し、次に何をすべきかを決定するために特定のレジスターを読み取ります (通常、カーネルに実行させたいサービスのタイプを設定し、レジスター内のパラメーター)。
したがって、ここで、カーネルモードに切り替える唯一の方法は、int
命令を使用することです(わずかに異なる方法で切り替える命令もありますが、概念は保持されます)、CPUが適切な割り込みにジャンプするように特定の割り込みを指定する必要がありますコードと、カーネルの一部であるそのコードは、本来の仕事を行い、モードをユーザーモードに戻した後にコードに戻ります。番号なしで呼び出すことができますがint
、それはモードをカーネルに転送するだけではなく、デフォルトで割り込みハンドラ 0 を呼び出します。
他のオペレーティング システム/CPU では異なる命令が使用されますが、一般的にメカニズムは同じです。