ユーザモードプログラムがカーネル空間メモリにアクセスしてIN命令とOUT命令を実行できるようにした場合、CPUモードの目的は無効になりますか?

ユーザモードプログラムがカーネル空間メモリにアクセスしてIN命令とOUT命令を実行できるようにした場合、CPUモードの目的は無効になりますか?

CPUがユーザーモードの場合、CPUは特権コマンドを実行できず、カーネルスペースメモリにアクセスできません。

そして、CPUがカーネルモードにあるとき、CPUはすべての命令を実行し、すべてのメモリにアクセスできます。

Linuxでは、ユーザーモードプログラムはすべてのメモリにアクセスでき、(使用して)特権コマンドと(使用しているようです)の両方を/dev/mem実行できるようになりました。INOUTiopl()

したがって、Linuxのユーザーモードプログラムは、カーネルモードができるほとんどのタスクを実行できます(私が考えるほとんどのタスク)。

ユーザーモードプログラムがこれらすべての機能を持つことを許可すると、CPUモードを持つ目的は無効になりますか?

答え1

したがって、Linuxのユーザーモードプログラムは、カーネルモードができるほとんどのタスクを実行できます(私が考えるほとんどのタスク)。

まあ、すべてのユーザーモードプログラムは可能ではなく、適切な権限を持つプログラムのみが可能です。これはカーネルによって決まります。

/dev/mem一般的なファイルシステムのアクセス権とCAP_SYS_RAWIO機能で保護されています。iopl()また、ioperm()同じ能力によって制限されます。

/dev/memカーネル(CONFIG_DEVMEM)で完全にコンパイルすることもできます。

ユーザーモードプログラムがこれらすべての機能を持つことを許可すると、CPUモードを持つ目的は無効になりますか?

おそらく。これは、特権ユーザースペースプロセスで実行できる操作によって異なります。ユーザースペースプロセスは、/dev/sdaアクセス権(またはそれに対応する権限)がある場合、ハードドライブ全体を損傷する可能性があります。これは、ストレージアクセスを処理するファイルシステムドライバの目的を喪失しても同様です。

iopl()(i386でCPUの特権モードを活用して動作するという事実もあるので、彼らの目的を崩すとは言えません。)

答え2

modprobeカーネルに新しいコードをロードしてセキュリティを「破壊する」のと同じ方法です。

いくつかの理由で、時には、カーネルスレッドではなくユーザースペースで半特権コード(Xサーバー内のグラフィックドライバなど)を実行する方が合理的です。

  • killハードウェアがロックされていない場合は、簡単に実装できます。
  • ファイルシステムのファイルからコード/データのページングを要求するようにします。 (カーネルメモリはページングできません)
  • 独自の仮想アドレス空間を提供します。 Xサーバーにバグがあります。可能カーネルを終了せずにXサーバーをクラッシュさせるだけです。

セキュリティはあまり役に立ちませんが、信頼性とソフトウェアアーキテクチャの面で大きな利点があります。

グラフィックスドライバをカーネルに書き込むと、Xクライアントとサーバー間のコンテキスト遷移が減少します。サーバーは歴史的に大きすぎて、完全にコアに行ってほしいというエラーが多すぎました。


はい、これらの権限を持つマルウェアです。できる必要に応じてカーネルを取得し、/dev/memカーネルコードを変更できます。

または、たとえばx86でシステムコールを実行してIO権限レベルをRing 0に設定し、そのコアで割り込みを無効にするcliコマンドを実行します。iopl

しかし、x86 iopl「のみ」が特定の命令へのアクセスを許可しても:入力/出力(および文字列バージョンの入力/出力)とcli / sti。 「モデル固有のレジスタ」(x86-64命令のカーネルエントリポイントアドレスの設定など)を使用しrdmsrたり、読み書きしたりすることはできません。割り込み記述子テーブルを置き換えることもできません。既存のカーネルがあるマシン、少なくともそのカーネルでは)。wrmsrIA32_LSTARsyscalllidt

制御レジスタ(たとえば、攻撃プロセスがmoreを使用する代わりに、/dev/mem独自のページテーブルを変更するためのオフセットとして役立つ可能性がある最上位ページディレクトリの物理アドレスを保持するCR3)も読み取れません。 )mmap/dev/mem

invd(すべてのキャッシュを無効にするいいえ書き換え! ! (はい= RAM構成前の初期BIOS))はもう1つの興味深い点で、IOPLだけでなく常にCPL 0(現在の特権レベル)が必要です。でもwbinvd非常に遅くて中断できず、フラッシュする必要があるため、特権があります。みんなすべてのコアにわたってキャッシュします。 (望むよりプログラムに関連するCPUキャッシュ全体をフラッシュする方法はありますか?そしてWBINVD命令の使い方)

コードで実行されるデータの不正なアドレスにジャンプするバグのため、ユーザー空間 X サーバーでこれらのコマンドを誤って実行できません。


現在の権限レベル(保護モードと長期モード)cs(コードフラグメントセレクタ)の下位2ビット。mov eax, cs/and eax, 3すべてのモードで読み取り権限レベル。

特権レベルを作成するjmp farcall far設定を実行できますCS:RIP(ただし、ターゲットセグメントのGDT / LDTエントリは以前の特権レベルに基づいてこれを制限する可能性があるため、ユーザースペースが自分自身を上昇させるためにこれを実行することはできません)。または、カーネルエントリポイントからリング0に切り替えるか、またはintを使用できます。syscall

関連情報