特権昇格を引き起こす可能性のある Linux カーネル ガベージ コレクターの競合状態

かつて Spectre と Meltdown の脆弱性を特定した Google Project Zero チームの Jann Horn 氏は、Linux カーネル ガベージ コレクターの脆弱性 (CVE-2021-4083) を悪用する手法を公開しました。 この脆弱性は、UNIX ソケット上のファイル記述子をクリーンアップする際の競合状態が原因であり、ローカルの特権のないユーザーがカーネル レベルでコードを実行できる可能性があります。

この問題が興味深いのは、競合状態が発生する時間枠が実際のエクスプロイトを作成するには短すぎると推定されているためです。しかし、この研究の著者は、エクスプロイトの作成者が次のことを行った場合には、最初はそのような懐疑的な脆弱性であっても、実際の攻撃のソースになる可能性があることを示しました。必要なスキルと時間。 Yann Horn は、フィリグリー操作の助けを借りて、close() 関数と fget() 関数を同時に呼び出すときに発生する競合状態を軽減し、完全に悪用可能な use-after-free 脆弱性を軽減し、すでに解放されたデータへのアクセスを実現する方法を示しました。カーネル内部の構造。

競合状態は、close() と fget() を同時に呼び出しながらファイル記述子を閉じるプロセス中に発生します。 close() の呼び出しは、fget() が実行される前に発生する可能性があります。これにより、ガベージ コレクターが混乱します。これは、refcount によれば、ファイル構造は外部参照を持たず、ファイル記述子に接続されたままになるためです。 ガベージ コレクターは、構造体への排他的アクセス権があると考えますが、実際には、短期間ではあるが、ファイル記述子テーブル内の残りのエントリは、解放される構造体を指し続けます。

競合状態に陥る可能性を高めるために、いくつかのトリックが使用され、システム固有の最適化を導入する際に悪用の成功確率を 30% に高めることができました。 たとえば、ファイル記述子を含む構造体へのアクセス時間を数百ナノ秒延長するために、別の CPU コア上のアクティビティをキャッシュに散布することでプロセッサ キャッシュからデータを追い出しました。これにより、構造体をメモリからではなくメモリから取得できるようになりました。高速CPUキャッシュ。

50 番目の重要な機能は、ハードウェア タイマーによって生成された割り込みを使用して、競合状態の時間を延長することでした。 この瞬間は、競合状態が発生したときに割り込みハンドラーが起動され、コードの実行がしばらく中断されるように選択されました。 制御の復帰をさらに遅らせるために、epoll を使用して waitqueue に約 XNUMX のエントリが生成されました。これには、割り込みハンドラーを介した検索が必要でした。

この脆弱性を悪用する手法は、90 日間の非公開期間を経て公開されました。 この問題はカーネル 2.6.32 以降に発生しており、5.16 月初旬に修正されました。 この修正はカーネル 2021 に含まれており、カーネルの LTS ブランチおよびディストリビューションで提供されるカーネル パッケージにも転送されました。 この脆弱性は、MSG_PEEK フラグを処理するときにガベージ コレクターに現れる同様の問題 CVE-0920-XNUMX の分析中に特定されたことは注目に値します。

出所: オープンネット.ru

コメントを追加します