CPUがユーザーモードの場合、CPUは特権コマンドを実行できず、カーネルスペースメモリにアクセスできません。
そして、CPUがカーネルモードにあるとき、CPUはすべての命令を実行し、すべてのメモリにアクセスできます。
Linuxでは、ユーザーモードプログラムはすべてのメモリにアクセスでき、(使用して)特権コマンドと(使用しているようです)の両方を/dev/mem
実行できるようになりました。IN
OUT
iopl()
したがって、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
たり、読み書きしたりすることはできません。割り込み記述子テーブルを置き換えることもできません。既存のカーネルがあるマシン、少なくともそのカーネルでは)。wrmsr
IA32_LSTAR
syscall
lidt
制御レジスタ(たとえば、攻撃プロセスが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 far
かcall far
設定を実行できますCS:RIP
(ただし、ターゲットセグメントのGDT / LDTエントリは以前の特権レベルに基づいてこれを制限する可能性があるため、ユーザースペースが自分自身を上昇させるためにこれを実行することはできません)。または、カーネルエントリポイントからリング0に切り替えるか、またはint
を使用できます。syscall