Linux Kernel の脆弱性 CVE-2023-2598 が FIX:PoC エクスプロイトも登場

PoC Code for Linux Kernel Privilege Escalation Flaw (CVE-2023-2598) Published

2023/11/18 SecurityOnline — Linux カーネル 6.3-rc1 に存在する、深刻度の高い脆弱性 CVE-2023-2598 (CVSS:7.8) の詳細と PoC エクスプロイトを、Cybersecurity の研究者 Yordan が公開した。

ホワイト・ハット・ハッカーの Tobias Holl により発見された、このカーネルの脆弱性は、io_uring のバッファ登録コードにおける物理メモリへの境界外アクセスに起因する。特別に細工されたリクエストを送信することで、この脆弱性の悪用した認証済みの攻撃者は、特権を昇格させることが可能だ。このメモリを操作の能力により、昇格した特権を獲得した攻撃者は、任意のコード実行が可能性であり、結果としてシステムを危険にさらすことになる。

io_uring について言うなら、アプリケーションがシステム・コールを非同期で実行するための、Linux 用の API となる。したがって、通常のシステム・コールを使用するよりも、パフォーマンスが大幅に向上する。ブロッキングしているシステム・コールを待つ必要がなくなり、その実装方法によっては、実行する必要のあるシステム・コールの数を減らすことも可能だ。

Yordanは「脆弱性の根本的な原因は、バッファが登録される際の誤った最適化にある」と記事で述べている。

Yordan は、「IORING_REGISTER_BUFFERS オペコードを渡すことで、1つの io_uring_register システム・コールを通して、複数のバッファが登録される。それにより、io_sqe_buffers_register が呼び出され、そのリターン・コールとして io_sqe_buffer_register が呼び出され、それぞれのバッファが登録される。ここが脆弱性の発生場所である」と付け加えた。

バグの再現手順は以下のとおりである:

  1. memfd を作成する。
  2. そのファイル記述子で単一ページを fallocate する。
  3. MAP_FIXED を使用して、このページを連続した場所に繰り返しマッピングする。
  4. IORING_REGISTER_BUFFERS を使用して、そのページで埋めた領域全体を固定バッファとして登録する。
  5. IORING_OP_WRITE_FIXED を使って、バッファを他のファイルに書き込む (OOB 読み込み)。また、IORING_OP_READ_FIXED を使って、バッファにデータを読み込む (OOB 書き込み)。

さらに Yordan は、脆弱性 CVE-2023-2598 の影響を示す、PoC エクスプロイトもリリースしている。

この、Linux カーネルの脆弱性は、公開直後にリリースされたカーネル・バージョン 6.4-rc1 で速やかに対処されている。しかし、システム管理者は、悪用のリスクを軽減するために、インストールした Linux が最新バージョンにアップデートされていることを確認する必要がある。