
グーグルのセキュリティ研究プログラムがLinuxのパケットフィルタリングツール nftablesの脆弱性「CVE-2024-26809」を悪用したPoCを公開しました。2024年の脆弱性ですがPoC公開によりサイバー攻撃へ悪用される可能性がありますので対象者は引き続き対応する事をお勧めします。
目次
nftablesとは?
nftablesは、これまで使用されてきたiptables・ip6tables・arptables・ebtablesを置き換えることを目的としたパケットフィルタリングフレームワークです。
カーネルモジュール、ユーザースペースフロントエンド「nft」、通信ライブラリ「libnl」などで構成され、ネットワークパケットの制御を担います。
nftablesでは、table、set、chain、ruleといった構成要素を使ってパケットを柔軟に制御します。
脆弱性の原因
問題は、nft_pipapo_destroy関数において発生します。この関数は、セット(Set)が「ダーティ」(dirty:変更された)状態である場合、マッチ(match)およびクローン(clone)内の要素を破棄します。
しかし、ある要素が同時にmatchとcloneの両方に存在してしまうケースがあり、これにより同じメモリ領域が二重解放(ダブルフリー)され、深刻な脆弱性を引き起こします。
原因のコード
static void nft_pipapo_destroy(const struct nft_ctx *ctx,
const struct nft_set *set)
{
struct nft_pipapo *priv = nft_set_priv(set);
struct nft_pipapo_match *m;
int cpu;
m = rcu_dereference_protected(priv->match, true);
if (m) {
...
nft_set_pipapo_match_destroy(ctx, set, m);
...
}
if (priv->clone) {
m = priv->clone;
if (priv->dirty)
nft_set_pipapo_match_destroy(ctx, set, m);
...
脆弱性のトリガー方法
以下の手順で比較的容易に脆弱性を引き起こすことができます。
-
pipapoセットAを作成
-
セットAに要素Bを作成
-
セットAに要素Cを作成(これによりセットAがdirty状態になる)
-
セットAを削除(nft_pipapo_destroyが呼ばれ、要素Bが2回破棄される)
※3と4のコマンドはまとめて送信する必要があります。
CVE-2024-26809におけるエクスプロイトの一般的な流れ
CVE-2024-26809は、Linuxのnftablesモジュールに存在するダブルフリー脆弱性です。この脆弱性を悪用することで、攻撃者はカーネルメモリ操作を通じて、最終的にroot権限を奪取することが可能となります。以下は、攻撃の一般的な流れを技術的背景とともに解説します。
特別に設計されたnftablesセットを作成
攻撃者はまず、脆弱なpipapo型のセットを作成します。このセット内に複数の要素を投入し、内部状態を「ダーティ」(更新された状態)に変更します。
セット削除による脆弱性のトリガ
次に、更新状態となったセットを削除します。
これにより、同じメモリ領域が複数回解放されるダブルフリーが発生し、カーネルヒープ内に不整合が生まれます。
メモリ操作(Heap Spray)による影響範囲の制御
攻撃者はヒープ上の解放済み領域に新たなオブジェクトを配置(Heap Spray)し、解放されたメモリ領域を制御可能なデータで上書きします。
この操作により、カーネル内の関数ポインタや構造体ポインタの不正な改ざんが可能になります。
メモリリークによるカーネルアドレス情報の取得
ヒープ領域に配置された不正なオブジェクトを読み出すことで、カーネル内部のアドレス情報(カーネルポインタ)をリークします。
このステップは、カーネルアドレス空間のレイアウトを把握するために不可欠です。
任意コード実行(ROPチェーンの構築)
リーク情報をもとに、リターンオリエンテッドプログラミング(ROP)と呼ばれる技術を使い、攻撃用の命令列(ROPチェーン)を構築します。
これにより、カーネルモードで任意のコードを実行できるようになります。
権限昇格とシステム支配
最終的に、カーネル内で権限昇格コード(たとえば現在のプロセスの権限をrootに変更する処理)が実行され、攻撃者は完全な管理者権限(root)を取得します。
これにより、システム全体の操作や、さらなる不正活動(バックドア設置、データ搾取など)が可能となります。
まとめ
「CVE-2024-26809」は、Linuxカーネルを対象とした深刻なメモリ破壊型脆弱性です。PoCコードを参考にすると、比較的容易にトリガ・エクスプロイトが可能であり、悪用されればカーネルレベルでの完全な制御(root権限取得)が可能です。
現行システムでnftablesを使用している場合、直ちに脆弱性対応版へのアップデートまたは、当該機能を無効化する緊急対策を行うことが推奨されます。
参照
https://github.com/google/security-research/blob/master/pocs/linux/kernelctf/CVE-2024-26809_lts_cos/docs/exploit.md