Project Zero は Linux の脆弱性を悪用する方法を開発しました

Linux

Linux カーネルでの null 参照の悪用

Google Project Zeroチームの研究者たちが、 NULLポインタの逆参照によって引き起こされるLinuxカーネルの脆弱性を悪用する方法を開発したことが最近発表された。

これまで、NULLポインタの逆参照に関連するカーネルの問題は、特権昇格や自身のコードの実行につながる攻撃にそのような問題を転用することは非現実的であると考えられていたため、十分な注目を集めてこなかった(特権のないプロセスをアドレス空間の下位領域にマッピングすることは禁止されている)。

一般的に、このようなエラーが発生するとカーネルによってoops警告が生成され、その後、システムを停止することなく問題のあるタスクが完了し、状態が復元されます。

この新しい攻撃方法は、「oops」状態の処理に基づいています。これにより、参照カウンタ(refcount)の値が増加し、結果としてカウンタがオーバーフローして、refcountに関連付けられたメモリが解放される可能性があります。

この場合、悪用は use-after-free 攻撃に典型的な操作に縮小されます (オブジェクトの参照カウントがゼロになり、メモリが解放される状況が発生しますが、実際には解放されたメモリを指している作業リンクがあります)。

現在、Linuxカーネルがプロセスコンテキスト内からヌル参照解除をトリガーすると、カーネルパニックとは異なる「 oops」エラーが発生します。パニックは、カーネルが実行を安全に継続する方法がないと判断し、すべての実行を停止しなければならない場合に発生します。しかし、「oops」エラー発生時には、カーネルはすべての実行を停止するのではなく、可能な限り回復を試み、実行を継続します。

ここでは、制御された方法で「oops」状態を生成する方法として、NULL ポインターの逆参照が使用されます。 問題は、232 ビットの refcount オーバーフローに達するまでに約 32 回の「oops」ステータス コールが必要なことです。

実務的な観点から言えば、提案された脆弱性を利用した攻撃を実行するには、約8日間、継続的にインプレースでない状態(OOP状態)を生成する必要がある。攻撃が成功すれば、カーネルレベルでコードを実行できるようになる。

エクスプロイトで使用された NULL ポインター逆参照は XNUMX 月に修正されましたが、同様の問題は珍しくなく、以前は脆弱性ではなくバグとして扱われていたため、開発者は Linux カーネルに一般的な保護を追加して、"oops" の生成を操作する攻撃を防ぎます。 ."

 タスクの場合、これは既存のカーネル スタックを破棄し、do_exit を呼び出す make_task_dead に直接移動することを意味します。 カーネルは、「クラッシュ」ログと、エラーが発生したときのカーネルの状態を示すカーネル トレースも dmesg に投稿します。 メモリの破損が明らかに発生している場合、これは奇妙な選択のように思えるかもしれません。 ただし、その意図は、実行中のシステムはダウンしているシステムよりもデバッグがはるかに簡単であるという哲学の下で、カーネルのバグを検出してログに記録しやすくすることです。

特に、カーネル 6.2 では、「oops」の最大回数を制限する変更が加えられています。デフォルトでは 10 回の oops に制限されています (必要に応じて oops_limit パラメータを使用して変更できます)。制限に達すると、カーネルは「panic」状態に移行し、その後再起動します。これにより、参照カウントをゼロにリセットするために必要な回数の反復処理は実行されなくなります。

また、制限は、以前にリリースされたが、まだサポートされているカーネル ブランチ、および一般的なディストリビューションのカーネル パッケージに転送される予定です。

最後に、これについてさらに詳しく知りたい場合は、以下のリンクから詳細をご覧いただけます。


Googleで優先ソースとして追加する