CentOS 9 Security Flaw Enables Privilege Escalation – PoC Released
2026/02/06 gbhackers — CentOS 9 で発見されたセキュリティ脆弱性は、ローカル・ユーザーに対して root 権限へ昇格を許す深刻なものである。この脆弱性は、Linux kernel のネットワーク・サブシステムに存在する Use-After-Free (UAF) 状態に起因するものであり、TyphoonPWN 2025 ハッキング・コンテストの Linux カテゴリにおいて 1 位を獲得したものだ。

現時点で Proof-of-Concept (PoC) エクスプロイトが公開されており、この脆弱性を悪用する攻撃者が、影響を受けるシステムを完全に制御できることが実証されている。
この脆弱性は、sch_cake(Common Applications Kept Enhanced) パケット・スケジューラ内に存在する。
標準的なローカル・ユーザーであっても、メモリー破壊のバグを引き起こすことが可能であり、それにより root 権限での任意のコード実行が可能となる。
ベンダーに対しては 90 日以上前に通知が行われているが、現時点で公式パッチは提供されておらず、進捗状況は “対応中” とされているのみである。
sch_cake のロジック・エラー
この問題の本質は、CAKE キューイング・ディシプリン (Qdisc) におけるパケット・ドロップ処理にある。具体的に言うと、cake_enqueue 関数が、バッファ制限によりパケットを破棄した場合であっても、親スケジューラに対して成功 (NET_XMIT_SUCCESS) を誤って返すという問題がある。
HFSC (Hierarchical Fair Service Curve) のようなクラスフル・スケジューラが CAKE の上位に構成されている場合には、この戻り値に依存して処理が行われる。CAKE が、パケットを正常にキューへ格納したと誤って通知することで、HFSC はクラスへの参照を保持し続ける。
しかし、実際にはパケットは破棄されているため、クラスは解放され得る状態にある一方で、HFSC は依然としてアクティブであると誤認する。この結果として、無効になったメモリー領域を参照するダングリング・ポインタが発生する。
根本的な原因は、以下に示す cake_enqueue 関数のロジックに表れている。cake_drop によりデータが破棄されているにもかかわらず、関数の戻り値として NET_XMIT_SUCCESS が返されている点に注意してほしい。
static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
struct sk_buff **to_free)
{
// ...
if (q->buffer_used > q->buffer_limit) { // [1] Check buffer limit
u32 dropped = 0;
while (q->buffer_used > q->buffer_limit) {
dropped++;
cake_drop(sch, to_free); // [2] Packet is DROPPED here
}
b->drop_overlimit += dropped;
}
return NET_XMIT_SUCCESS; // [!] Returns SUCCESS anyway
}
エクスプロイト手法
SSD Disclosure によると、公開された PoC は信頼性の高いエクスプロイト・チェーンを示している。最初に攻撃者は、kernel ヒープ上に偽の Qdisc オブジェクトを大量に配置し、メモリー配置を制御する。続いて UAF 状態をトリガーすることで、kernel の実行フローを攻撃者自身のコードへとリダイレクトする。
エクスプロイトの主要な手順は以下の通りである。
- KASLR バイパス:prefetch を用いたサイドチャネル攻撃により、ランダム化された kernel コードの配置位置を特定する。
- ヒープ・スプレー:sendmsg を使用してヒープに偽オブジェクトを大量に配置し、ダングリング・ポインタが攻撃者制御データを指すよう誘導する。
- ROP チェーン:Return-Oriented Programming (ROP) チェーンを構築し、実行経路を乗っ取り、modprobe_path を上書きした上で root 権限でスクリプトを実行する。
以下は、実行制御を奪取するために使用された、ROP チェーンの設定例である。
cvoid rop_chain(uint64_t* data){
int i = 0;
data[i++] = kbase + POP_RDI_RET; // Prepare stack for payload
data[i++] = kbase + PUSH_RDI_POP_RSP_RET; // Stack pivot
data[i++] = kbase + POP_RDI_RET;
data[i++] = 0x782f706d742f; // String: "/tmp/x"
data[i++] = kbase + POP_RSI_RET;
data[i++] = kbase + MODPROBE_PATH; // Overwrite modprobe_path
data[i++] = kbase + MOV_RSI_RDI_RET; // Execute write
data[i++] = kbase + SWAPGS; // Restore user state
data[i++] = kbase + IRETQ; // Return to user space
// ... (Restore registers)
}
現時点で、CentOS 9 システム向けの公式パッチは提供されていない。管理者に対して推奨されるのは、kernel 更新の動向を監視しながら、修正が展開されるまでの間は、tc(traffic control)コマンドへのアクセス制限や、sch_cake モジュールのロード制御を行うことである。
ベンダーは、この脆弱性の存在を認識しているが、具体的なリリース時期は示されていない。
この問題の原因は、Linux カーネルのネットワーク制御機能である CAKE パケット・スケジューラにおいて、パケットを捨てた (失敗) にもかかわらず、システムに対して無事に送った (成功) 報告をしてしまう、ロジックの不備にあります。この誤った戻り値を信じた上位の管理プログラムは、実際にはもう存在しないはずのデータがメモリ上に存在すると想定し、その場所を使い続けます。結果として、すでに解放されたはずのメモリ領域を指し示すダングリング・ポインタが発生し、そこを別のデータで書き換えることで OS カーネルを自在に操る、Use-After-Free (UAF) という深刻な事態が引き起こされてしまいます。PoC も提供されていますので、ご利用のチームは、ご注意ください。よろしければ、CentOS での検索結果も、ご参照ください。
You must be logged in to post a comment.