2016-08-25 6 views
1

これは仮説的な質問です。カーネルデータ構造にアクセスし、レジスタ値を読み込み、いくつかのカーネルレベルの関数を実行するアプリケーション(通常はユーザモードで実行する)があるとします。特定のユーザーレベルのアプリケーションをカーネルモードで実行できるようにすることはできますか?

カーネルお​​よび/またはCPUが、このアプリケーション以外のアプリケーションで通常のユーザーレベル/カーネルレベルの分離を維持しながら、このアプリケーションでその機能を実行できるようにする方法はありますか?

+0

非常に疑問です。いったんカーネルスペースに入ると、行く場所やできることには限界がありません。 「しかし、私は行動すると約束していますが、ソフトウェアセキュリティではそれを削減しません。 –

+0

質問の最後の部分を編集しました。 –

+0

rootとして実行する、mmap/dev/kmem:P(おそらく/ dev/kmemを最初の場所に持つためにカスタムの安全でないカーネルを構築する必要がある) – Notlikethat

答えて

0

アプリをkernel space(カーネルメモリ)に入れたり、ring 0 CPUモードで実行するには、カーネルコードから実行する必要があります。通常の動作状態では、前述の特権(少なくともそこには既存のAPIはありません)を持つカーネルからアプリを実行することはできません。これを可能にするカーネルコードを実装することはおそらく可能です。しかし、それは扱いにくく、カーネル空間/ユーザ空間分離の全体概念を混乱させ、高度なユーザ空間APIが使用されてもそれは動作しません。

あなたは自分のアプリリング0権限を与えることについて考えている場合 - カーネルはits own stackがあり、理由kernel-space/user-space memory separationの、あなたはカーネル内部のAPIを実行することはできませんので、それは、いずれかの動作しません。

基本的には、代わりにkernel moduleと書くことで同じことができます。また、ユーザスペースアプリケーションに代わってカーネルコードを実行する場合は、system callsインターフェイスを使用できます。

あなたの質問に答えてください:いいえ、内部カーネルAPIを使用できるように、カーネルモードでユーザースペースアプリを実行することはできません。

+0

詳細なお返事ありがとうございます。私は、ユーザーアプリケーションのコードを指すシステムコールを作成します。このシステムコールが呼び出されると、アプリケーションはリング0で実行されますか? –

+0

システムコールがユーザー空間コードを指すことはできません。すべてのシステムコールは(カーネル内の)syscallテーブルにリストされており、(カーネルスペースにある)いくつかのカーネル関数を指しています。だからあなたのアプリケーションからシステムコールを実行しているときに、対応するシステムコール(カーネルのどこかにある)が呼び出されます。コンテキストはカーネルモード(CPUはリング0で実行される)に[切り替える](https://en.wikipedia.org/wiki/Context_switch#User_and_kernel_mode_switching)され、アプリケーションのPIDは有効になりますが、CPUは実行されますあなたのユーザ空間コードではなく、カーネル空間からあらかじめ定義されたシステムコール。 –

+0

この関連の質問も参照してください:[Linuxアプリケーションでリング0にエスカレートする](http://stackoverflow.com/questions/18298097/escalating-to-ring-0-in-linux-application) Linuxでは、リング0でユーザー空間プロセスを実行することはできません**。リング0を取得する唯一の方法は、カーネル空間からコードを実行することです。例えば、カーネルモジュールを作成し、それをカーネルスペースにロードすることで実現できます。 –

関連する問題