
CVE-2026-68121の調査リポジトリ。LinuxカーネルのPPPoEにおけるpppoe_sendmsg()のuse-after-freeで、ローカル権限昇格を可能にする。PoC、根本原因分析、ラボ環境構築を含む。
PPPoEject
PPPoE送信パスにおけるLinuxカーネルのメモリ破壊脆弱性であり、
デバイスのヘッダーコールバックがskbヘッドを再割り当てした後に
sk_buffヘッダーへの古いポインタが残ることによって引き起こされます。
このリポジトリは、許可されたセキュリティ研究、カーネル 脆弱性分析、CTF環境、および防御的テストのみを目的としています。
明示的な許可なく、システムに対して概念実証コードを実行しないでください。
| 項目 | 詳細 |
|---|---|
| CVE | CVE-2026-68121 |
| コードネーム | PPPoEject |
| コンポーネント | Linuxカーネル |
| サブシステム | PPPoE / ネットワーキング |
| 影響を受けるファイル | drivers/net/ppp/pppoe.c |
| 主要関数 | pppoe_sendmsg() |
| バグ分類 | Use-After-Free |
| 影響 | カーネルメモリ破壊 |
| 潜在的な影響 | ローカル権限昇格 |
| CVSS v3.1 | 7.8 — 高 |
| 攻撃ベクトル | ローカル |
| 攻撃の複雑さ | 低 |
| 必要な権限 | 低 |
| ユーザー操作 | なし |
| ステータス | 修正済み |
CVEレコードでは、この脆弱性は、dev_hard_header()がskbヘッドを再割り当てした際に
無効になり得る古いPPPoEヘッダーポインタとして特定されています。
この脆弱性は以下に存在します:
drivers/net/ppp/pppoe.c
内:
pppoe_sendmsg()
脆弱なシーケンスは概念的には次のとおりです:
pppoe_sendmsg()
│
▼
Save PPPoE header pointer
│
▼
dev_hard_header()
│
▼
skb head may be reallocated
│
▼
Old pointer becomes stale
│
▼
PPPoE writes through stale pointer
│
▼
Use-After-Free
│
▼
Kernel memory corruption
Linuxのネットワークコードでは、デバイスのヘッダーコールバックが sk_buff のヘッドを再割り当てすることが許可されています。そのため、古いヘッドを指すポインタは、dev_hard_header() が戻った後に安全に再利用することはできません。
中心的な問題はライフタイム違反です。
pppoe_sendmsg() は、以下を呼び出す前にPPPoEヘッダーへのポインタを取得します:
dev_hard_header()
ただし、そのコールバックによって skb の先頭が移動する可能性があります。
概念的には:
Before callback:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
stale pointer
After skb expansion:
old skb head ──X──► freed
new skb head
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
valid location
古いポインタは解放済みの割り当てを依然として参照しています。
その後、PPPoE がそのポインタを介してヘッダーを書き込むと、カーネルは use-after-free 書き込みを実行します。
文書化されたトリガーは、copy_from_user() 周辺の競合状態と、
チームデバイスのヘッダー操作への変更を伴います。
説明されているシーケンスの一つは次のとおりです:
PPPoE sendmsg()
│
▼
copy_from_user() blocks
│
│
├───────────────┐
│ │
▼ ▼
Team device changes First non-Ethernet
header operations port is added
│
▼
Delegated GRE callback
│
▼
skb head expansion
│ │
└───────────────┘
│
▼
stale PPPoE pointer
│
▼
use-after-free write
CVEレコードは、最初の非Ethernetポートが空のチームデバイスに追加され、委譲されたGREヘッダーコールバックがskbヘッドを拡張する際にこれが発生する可能性があると述べています。
この脆弱性は以下を引き起こす可能性があります:
CVEの公開CVSSベクターは以下の通りです:
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
スコアは 7.8 High です。
関連するコンポーネントは次のとおりです:
PF_PPPOX / PPPoE socket
│
▼
pppoe_sendmsg()
│
▼
sk_buff (skb)
│
▼
dev_hard_header()
│
▼
Network device header callback
│
▼
Potential skb head expansion
│
▼
PPPoE stale header pointer
│
▼
UAF write
脆弱なコードは単なる汎用的なPPPoEパケットパーサーではない。 重要な条件は、PPPoEソケット送信と動的なskbヘッド再割り当ての間の相互作用である。
アップストリーム修正のタイトルは次のとおりである:
pppoe: reload header pointer after dev_hard_header()
デバイスヘッダー作成後、修正は skb のネットワークヘッダーオフセットを介して PPPoE ヘッダーを再読み込みします。
重要な特性は次のとおりです:
Before:
header pointer
│
▼
dev_hard_header()
│
▼
skb moves
│
▼
pointer = stale ❌
After:
dev_hard_header()
│
▼
skb may move
│
▼
reload header using skb offset
│
▼
pointer = valid ✅
pskb_expand_head() は skb ヘッドが再配置される際に関連する skb オフセットを更新するため、再割り当て後もオフセットベースの参照が安全になります。
| セキュリティ特性 | 脆弱なバージョン | 修正済みバージョン |
|---|---|---|
| コールバック前に保存されたヘッダーポインタ | ✅ | — |
| skb ヘッドが移動可能 | ✅ | ✅ |
| コールバック後にポインタを更新 | ❌ | ✅ |
| 古いポインタの参照解除 | 発生しうる | 防止済み |
| use-after-free 書き込み | 発生しうる | 緩和済み |
| カーネルメモリ破壊 | 発生しうる | 緩和済み |
管理された実験室は次のように構成できます:
┌───────────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────┐ │
│ │ PPPoE Socket │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ pppoe_sendmsg │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Team │ │
│ └───────┬───────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ GRE │ │
│ └───────────────┘ │
│ │
└───────────────────────────────────────────────┘
便利なカーネルデバッグツール:
gdb
pwndbg
gef
crash
objdump
readelf
pahole
カーネルメッセージを監視します:
sudo dmesg -w
PPPoEサポートを検査します:
lsmod | grep pppoe
利用可能な PPP モジュールを確認します:
find /lib/modules/$(uname -r) -iname '*pppoe*'
現在実行中のカーネルを確認します:
uname -r
PPPoE 関連の設定を確認します:
grep -E 'CONFIG_PPP|CONFIG_PPPOE' \
/boot/config-$(uname -r)
代表的な関連オプションは次のとおりです:
CONFIG_PPP
CONFIG_PPP_ASYNC
CONFIG_PPP_SYNC_TTY
CONFIG_PPPOE
制御されたカーネルリサーチのために: