
Linux Kernel における OOB 読み取り・書き込みの脆弱性の解説と Local Privilege Escalation の Proof-of-Concept です。
この脆弱性の解説は ブログ の write-up でご覧いただけます。また、nf_tables の紹介記事は こちら にあります。
このリポジトリで提供されるエクスプロイトは、脆弱性のあるカーネルバージョンでそのまま実行できるとは期待しないでください。 カーネルビルドごとに多くのオフセットが異なり、もちろん ROP ガジェットも異なります。
カーネルビルド間の違いにより、脆弱性の悪用方法自体を変更しなければならない場合もあります。例として、David Bouman (@pqlqpql) による別の解説が こちら にあり、彼は UDP パケット を使って脆弱性を悪用しています(UDP パケットが処理されるときにスタックを狙う)。しかし、私のカーネルビルドではスタックレイアウトが大きく異なるため、同じ方法は使えませんでした。代わりに、TCP ACK パケットが処理されるときにスタックを狙う方法を使用しました。
お手元でテストしたい場合は、私の解説を読んで、オフセットの特定方法や使用すべきフックなどを調べることをお勧めします。
解説で対象としたカーネルをビルドした正確なカーネルバージョンは 5.12.0、コミット 9f4ad9e425a1d3b6a34617b8ea226d56a119a717 です。
エクスプロイトをビルドするには、ライブラリ libmnl と libnftnl、および POSIX スレッド (pthread) ライブラリが必要です。
ビルドは以下のように簡単に行えます。
gcc -lmnl -lnftnl -lpthread exploit.c -o exploit
この脆弱性は、バージョン 5.12 のコミット 345023b0db315648ccc3c1a36aee88304a8b4d91 で導入された nft_validate_register_store に起因し、バージョン 5.17 のコミット 6e1acfa387b9ff82cfc7db8cc3b6959221a95851 で修正されています。
この Proof-of-Concept と脆弱性の解説は、教育目的のみ を意図しています。 このコードがどのように使用されるかについて、私は法的責任を負いません。