研究プロジェクトのために、x86-64 を実行している Linux でカーネル ハッキングを行っています。カーネル ルーチンからユーザー モード コード ページにジャンプし、すぐにカーネル コードに戻る必要があります。つまり、カーネルで実行中にユーザー コードでトランポリンを実行する必要があります。
これがまったく可能かどうか疑問に思っています。可能であれば、これをどのように達成できるかを誰かが教えてもらえますか?
研究プロジェクトのために、x86-64 を実行している Linux でカーネル ハッキングを行っています。カーネル ルーチンからユーザー モード コード ページにジャンプし、すぐにカーネル コードに戻る必要があります。つまり、カーネルで実行中にユーザー コードでトランポリンを実行する必要があります。
これがまったく可能かどうか疑問に思っています。可能であれば、これをどのように達成できるかを誰かが教えてもらえますか?
「簡単に」できる可能性は低いです。
アプリケーションを知らなくても、kernel<->app インターフェースを再考するように提案しなくても、次のようなハックが可能です。コードのアドレスを渡すだけで、トランポリン コードの一部をアプリケーションにカーネル コンポーネントに登録させることができます。 . トランポリン コードは、「実際の」ユーザー モード機能を実行し、別のシステムコールまたは例外を発行してカーネルに戻ります。
これは正確にはユーザーモードのサブルーチンではありませんが、かなり近いものになります。アプリケーションがコールバックを実行するために必要なカーネル関数を呼び出すと、カーネル関数は実際の戻りアドレスを保存し、それを登録済みのトランポリン アドレスに変更して、ユーザーモード。トランポリンが関数を呼び出し、それに続くシステムコール/例外がカーネルに戻り、そこで行っていたことを続行できます。
とにかくセキュリティについて心配する必要はありませんが、そうする場合は、「トランポリンからの戻り」システムコールが、まだ開いているトランポリンハックが進行中のプロセスからのみ受け入れられるようにする必要があります。
また、シグナルがどのように機能するかを見ることもできます。それらは、カーネルにアプリケーションを中断させ、アプリケーションにシグナルハンドラーを呼び出させることに関するものです。シグナルのような実装は、アプリケーションがアクティブなシステムコールを実行していなくても機能します (ただし、シグナル ハンドラーのすべての制限もあります)。
実際、信号を使用することもできますか? 繰り返しますが、シグナルがカーネルでどのように機能するかを見て、ユーザーコードにシグナルを送るだけです。アプリケーションに適切なシグナル ハンドラーをインストールし、シグナル ハンドラーが "ユーザー空間トランポリンから戻る" syscall を呼び出すようにします。
いずれにせよ、それは少し...ハックに聞こえます。カーネル関連の作業を行ったことがなければ、デバイス ノード、ソケット、または同様のメカニズムを介してアプリケーションとやり取りする方が、おそらくはるかに優れた方法であると思います...または、syscall に "to do" の結果アイテムをアプリケーションは、siome ユーザー空間コードを呼び出し、別の syscall で報告するように指示します。