Linux Kernel の脆弱性 CVE-2025-21756 が FIX:完全な Root アクセスと PoC エクスプロイト

CVE-2025-21756: How a Tiny Linux Kernel Bug Led to a Full Root Exploit, PoC Releases

2025/04/29 SecurityOnline — Linux Kernel の vsock サブシステムに影響を与える、解放後使用 (UAF) の脆弱性 CVE-2025-21756 の全容が、セキュリティ研究者である Michael Hoefler の分析で、を明らかになった。当初は、vsock_remove_sock() の動作を数行で変更する単純なコード調整から始まり、最終的には、ローカル権限昇格 (LPE) とカーネル・コード実行へと至るものだという。

Michael Hoefler は、「カーネル内でオブジェクトの参照カウンタがゼロに達すると、そのオブジェクトは対応するメモリ・マネージャへ向けて解放される。その際に、つまり、vsock オブジェクトを解放した後に、何らかの解放後使用 (UAF) をトリガーして、より高度なプリミティブを取得し、権限を昇格できるようになる」と説明している。

この脆弱性は、トランスポートの再割り当て時に、ソケットのバインド状態が適切に処理されないことに起因する。具体的には、前もって vsock コードがバインドされていないソケットの、参照カウンタを誤って減らされることで、vsock オブジェクトの早期解放につながっていた。

パッチ分析メモには、「トランスポートの再割り当てにより、vsock_remove_sock がトリガーされ、vsock_remove_bound が呼び出され、vsock オブジェクトの参照カウンタが誤って減少する可能性がある。それにより、攻撃者に対して強力なエクスプロイト・プリミティブの悪用を許す、危険な UAF 状態が発生していた」と記されている。

初期のエクスプロイト試行では、カーネル・パニックが引き起こされ、Linux Security Module (LSM) フックを介して、AppArmor がソケットの解放時に sk_security ポインタを消去し、直接的な関数ポインタの破損を阻止していることが判明した。

Michael Hoefler は、「カーネルはソケットに対する dangling pointer を提供するが、それが有効化される前に、AppArmor がクラッシュさる。​ そのため、攻撃者はエクスプロイトを継続するために、AppArmor による保護が行われていないおカーネル関数を見つける必要があった」と述べている。

AppArmor で保護される関数に依存しながら、Kernel Address Space Layout Randomization (kASLR) を回避するために、Hoefler が利用したのは、保護のない netlink 診断ツール vsock_diag_dump() 関数である。

それにより、細工したパイプ・バッファを用いて、解放された vsock ソケットを回収し、vsock_diag_dump をサイドチャネルとして利用することで、有効な skc_net ポインタに対して総当たり攻撃を仕掛け、kASLR を回避することが可能になったという。

Michael Hoefler は、「分析に行き詰まったので、kernelctf コミュニティに頼った。そうしたら、@h0mbre が、vsock_diag_dump をサイド・チャネルとして用いて、skc_net ポインタに対して総当たり攻撃を仕掛ける方法を提案してくれた。それにより、既知のメモリ・オフセットを持ち、そこにつながっているソケット・オブジェクトを完全に制御できるようになった」と解説している。

Hoefler は、コード実行の権限を取得するために、vsock_release() 関数を悪用した。 AppArmor による保護がないため、sk->sk_prot->close 関数ポインタの乗っ取りが達成され、ROP (Return-Oriented Programming) チェーンへと移行できたという。

彼は、「私たちが最も注目しているのは、sk->sk_prot->close(sk, 0) の呼び出しである。sk を制御しているので、関数へのポインタに対する、有効なポインタが必要だった。最後の ROP チェーンは、commit_creds(init_cred) と呼ばれ、攻撃者に対してルート権限を付与し、その実行を、ユーザー空間にクリーンに返すものだ」と付け加えている。

Image: Michael Hoefler

Hoefler の、PoC エクスプロイト・コードは、ココで参照できる