
CVE-2026-68121の調査リポジトリ。LinuxカーネルのPPPoEにおけるpppoe_sendmsg()のuse-after-freeで、ローカル権限昇格を可能にする。PoC、根本原因分析、ラボ環境構築を含む。
PPPoEject
PPPoE送信パスにおけるLinuxカーネルのメモリ破壊脆弱性。
デバイスヘッダーコールバックがskbヘッドを再割り当てした後に、
sk_buffヘッダーへの古いポインタが残ることによって引き起こされます。
このリポジトリは、許可されたセキュリティ研究、カーネル脆弱性分析、 CTF環境、および防御的テストのみを目的としています。
明示的な許可なく、システムに対して概念実証コードを実行しないでください。
CVEレコードは、この脆弱性を、dev_hard_header()がskbヘッドを再割り当てした際に無効になる可能性がある古いPPPoEヘッダーポインタとして特定しています。
脆弱性は以下に存在します:
drivers/net/ppp/pppoe.c
以下の中の:
pppoe_sendmsg()
脆弱なシーケンスは概念的には以下の通りです:
pppoe_sendmsg()
│
▼
PPPoEヘッダーポインタを保存
│
▼
dev_hard_header()
│
▼
skbヘッドが再割り当てされる可能性
│
▼
古いポインタが古くなる
│
▼
PPPoEが古いポインタを通じて書き込む
│
▼
Use-After-Free
│
▼
カーネルメモリ破壊
Linuxネットワーキングコードでは、デバイスヘッダーコールバックがsk_buffヘッドを再割り当てすることが許可されています。したがって、古いヘッドへのポインタは、dev_hard_header()が戻った後に安全に再利用することはできません。
核心的な問題はライフタイム違反です。
pppoe_sendmsg()は、以下を呼び出す前にPPPoEヘッダーへのポインタを取得します:
dev_hard_header()
しかし、そのコールバックはskbヘッドを移動させる可能性があります。
概念的には:
コールバック前:
skb
┌──────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴───────────┘
▲
│
古いポインタ
skb拡張後:
古いskbヘッド ──X──► 解放済み
新しいskbヘッド
┌────────────────────────────────────┐
│ Ethernet │ PPPoE │ Payload │
└──────────┴───────┴─────────────────┘
▲
│
有効な場所
古いポインタは依然として解放された割り当てを参照しています。
PPPoEがその後そのポインタを通じてヘッダーを書き込むと、カーネルはuse-after-free書き込みを実行します。
文書化されたトリガーは、copy_from_user()とteamデバイスのヘッダー操作の変更をめぐる競合を伴います。
記述されているシーケンスの1つは以下の通りです:
PPPoE sendmsg()
│
▼
copy_from_user()がブロック
│
│
├───────────────┐
│ │
▼ ▼
Teamデバイスが変更 最初の非Ethernet
ヘッダー操作 ポートが追加される
│
▼
委譲されたGREコールバック
│
▼
skbヘッド拡張
│ │
└───────────────┘
│
▼
古いPPPoEポインタ
│
▼
use-after-free書き込み
CVEレコードは、これが空のteamデバイスに最初の非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ソケット
│
▼
pppoe_sendmsg()
│
▼
sk_buff (skb)
│
▼
dev_hard_header()
│
▼
ネットワークデバイスヘッダーコールバック
│
▼
潜在的なskbヘッド拡張
│
▼
PPPoEの古いヘッダーポインタ
│
▼
UAF書き込み
したがって、脆弱なコードは単なる汎用的なPPPoEパケットパーサーではありません。重要な条件は、PPPoEソケット送信と動的なskbヘッド再割り当ての間の相互作用です。
アップストリームの修正のタイトルは以下の通りです:
pppoe: reload header pointer after dev_hard_header()
この修正は、デバイスヘッダー作成後に、skbのネットワークヘッダーオフセットを通じてPPPoEヘッダーを再読み込みします。
重要な特性は以下の通りです:
修正前:
ヘッダーポインタ
│
▼
dev_hard_header()
│
▼
skbが移動
│
▼
ポインタ = 古い ❌
修正後:
dev_hard_header()
│
▼
skbが移動する可能性
│
▼
skbオフセットを使用してヘッダーを再読み込み
│
▼
ポインタ = 有効 ✅
pskb_expand_head()は、skbヘッドが再配置されたときに関連するskbオフセットを更新するため、再割り当て後もオフセットベースの検索は安全です。
制御されたラボは以下のように構成できます:
┌───────────────────────────────────────────────┐
│ 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
制御されたカーネル研究のために:
01. 脆弱なカーネルをビルド
↓
02. 分離されたVMを起動
↓
03. PPPoEサポートを有効化
↓
04. 制御されたネットワークトポロジを作成
↓
05. team/GREの相互作用を設定
↓
06. PPPoE sendmsg()を実行
↓
07. skbのライフタイムを監視
↓
08. カーネル診断情報をキャプチャ
↓
09. アップストリームパッチを適用
↓
10. 繰り返して比較
目的は、メモリライフタイム違反を安全に再現し、脆弱版と修正版の動作を比較することです。
CVE-2026-68121-PPPoEject/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── pppoe-sendmsg.md
│ ├── skb-lifetime.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
推奨される緩和策は、アップストリームの修正または適切なディストリビューションのバックポートを含むLinuxカーネルに更新することです。
Debian/Kaliの場合:
sudo apt update
sudo apt full-upgrade
その後再起動:
sudo reboot
実行中のカーネルを確認:
uname -r
ディストリビューションのバックポートは異なるバージョン番号を使用する可能性があるため、管理者はインストールされたパッケージをディストリビューションのセキュリティアドバイザリと照合して確認する必要があります。Debianは現在、Bookworm用の6.1.187-1およびTrixie用の6.12.101-1を含む修正バージョンをリストしています。
Linuxのstableツリーには、複数のメンテナンスブランチにわたって修正が含まれています。CVEレコードは、対応するstableコミットをリストし、影響を受けるソースファイルを以下のように特定しています:
drivers/net/ppp/pppoe.c
脆弱な履歴はLinuxカーネルPPPoE実装から始まり、修正コミットシリーズはCVEデータ内の7a56e7c9b08e08fd55a1bcada24cf4fe3782b722で表されるアップストリーム修正で終了します。
skbへのポインタは、skbヘッドを再割り当てする可能性のあるコールバックの後では有効であると仮定できません。
ネットワーキングコールバックは、基盤となるメモリレイアウトを変更する可能性があります。
このパッチは、再配置の可能性がある操作をまたいで生のポインタを保持するよりも、skb相対オフセットの方が安全である理由を示しています。
脆弱な状態は、パケット送信とネットワークデバイス設定をめぐる並行アクティビティに依存しています。
カーネルネットワーキングコード内の古いポインタは、機密性、完全性、可用性に影響を及ぼすメモリ破壊プリミティブになる可能性があります。
drivers/net/ppp/pppoe.cpppoe_sendmsg()pppoe: reload header pointer after dev_hard_header()Linux Kernel · PPPoE · Use-After-Free · Kernel Security · LPE
Research • Analyze • Reproduce • Harden
| 項目 | 詳細 |
|---|
| CVE | CVE-2026-68121 |
| コードネーム | PPPoEject |
| コンポーネント | Linuxカーネル |
| サブシステム | PPPoE / ネットワーキング |
| 影響を受けるファイル | drivers/net/ppp/pppoe.c |
| 主要関数 | pppoe_sendmsg() |
| バグクラス | Use-After-Free |
| 影響 | カーネルメモリ破壊 |
| 潜在的な影響 | ローカル特権昇格 |
| CVSS v3.1 | 7.8 — High |
| 攻撃ベクトル | ローカル |
| 攻撃の複雑さ | 低 |
| 必要な特権 | 低 |
| ユーザー操作 | なし |
| ステータス | 修正済み |
| セキュリティ特性 | 脆弱版 | 修正版 |
|---|
| コールバック前にヘッダーポインタを保存 | ✅ | — |
| skbヘッドが移動可能 | ✅ | ✅ |
| コールバック後にポインタを更新 | ❌ | ✅ |
| 古いポインタの参照外し | 可能性あり | 防止済み |
| use-after-free書き込み | 可能性あり | 緩和済み |
| カーネルメモリ破壊 | 可能性あり | 緩和済み |