modprobe
カーネルに新しいコードをロードすることによりセキュリティを「無効にする」のと同じ方法でのみ。
さまざまな理由で、カーネルスレッドではなくユーザー空間で実行される(Xサーバー内のグラフィックドライバーのような)半特権コードを使用する方が理にかなっている場合があります。
kill
ハードウェアをロックしない限り、より簡単に実行できます。
- ファイルシステム内のファイルからコード/データをデマンドページングします。(カーネルメモリはページングできません)
- XサーバーのバグがXサーバーをクラッシュさせるかもしれない独自の仮想アドレス空間を、カーネルを停止することなく提供します。
セキュリティにはあまり役立ちませんが、大きな信頼性とソフトウェアアーキテクチャの利点があります。
グラフィックドライバーをカーネルにベイクすると、別の使用スペースプロセスにデータを取得する代わりに、1人のユーザー->カーネル->ユーザーのように、XクライアントとXサーバー間のコンテキストスイッチを減らすことができますが、Xサーバーは歴史的に大きすぎてバグが多すぎますカーネルで完全にそれらを必要とします。
はい、これらのPRIVSで悪質なコードが可能性があり、それは使用して、したい場合は、カーネルを引き継ぐ/dev/mem
カーネルのコードを変更します。
または、たとえばx86で、IO特権レベルをリング0に設定cli
するiopl
システムコールを行った後、そのコアで割り込みを無効にする命令を実行します。
しかし、x86でさえ、iopl
「 in / out(および文字列バージョンins / outs)」および「cli / sti 」などのいくつかの命令にアクセスできます。「モデル固有のレジスタ」(x86-64 命令のカーネルエントリポイントアドレスを設定する)の使用rdmsr
やwrmsr
読み取り、または割り込み記述子テーブルの置き換えに使用することはできません(完全に取得できます)少なくともそのコアで、既存のカーネルからマシン上で)IA32_LSTAR
syscall
lidt
あなたも(制御レジスタを読み取ることができませんへのオフセットとして攻撃するプロセスが有用見つけるかもしれないトップレベルのページ・ディレクトリの物理アドレス、保持しているCR3のよう/dev/mem
に代わるものとして、自身のページテーブルを変更するためにmmap
、よりのINGのを/dev/mem
。 )
invd
(ライトバックせずにすべてのキャッシュを無効にします!!(ユースケース = RAMを設定する前の初期BIOS))は、IOPLだけでなく、常に完全なCPL 0(現在の特権レベル)を常に必要とする別の楽しいものです。でもwbinvd
非常に遅い(割り込みできない)ため、特権があり、すべてのコアにわたってすべてのキャッシュをフラッシュする必要があります。(プログラムに関連するCPUキャッシュ全体をフラッシュする方法はありますか?およびWBINVD命令の使用法を参照してください)
したがって、コードとしてデータを実行している不良アドレスへのジャンプを引き起こすバグは、ユーザー空間のXサーバーでこれらの命令を誤って実行することはできません。
現在の特権レベル(保護モードおよびロングモード)は、cs
(コードセグメントセレクター)の下位2ビットです。 mov eax, cs
/ and eax, 3
は、どのモードでも特権レベルを読み取ります。
特権レベルを書き込むには、jmp far
またはcall far
を設定しますCS:RIP
(ただし、ターゲットセグメントのGDT / LDTエントリは、古い特権レベルに基づいて制限することができます。これが、ユーザースペースがこれを行って自分自身を昇格させることができない理由です)。それとも、使用しint
たりsyscall
、カーネルのエントリポイントでリング0に切り替えます。
iopl
許可していないすべてのそれはまだわからバギーユーザ空間プログラムが誤って実行されません作製するために有用ですので、特権命令をinvd
実行可能なメモリでポイントが始まることを破損した関数ポインタを通じてジャンプして0F 08
バイト。ユーザー空間プロセスに特権を昇格させることが有用である理由を、セキュリティ以外の理由のいくつかで答えを追加しました。