
CVE-2026-81000(TUNderflow)の研究リポジトリ。LinuxカーネルのTUN/TAP受信ヘッドルーム整数アンダーフローによりローカル権限昇格が可能となる脆弱性で、PoC、根本原因分析、ラボ環境構築を含む。
TUNderflow
TUN/TAP ネットワークサブシステムにおける Linux カーネルのメモリ破壊脆弱性であり、受信ヘッドルームの境界チェック不足と、パケット割り当て経路における整数アンダーフローに起因します。
このリポジトリは、許可されたセキュリティ研究、脆弱性分析、CTF 環境、カーネルデバッグ、および防御的テストを目的としています。
明示的な許可なく、システムに対して概念実証コードを使用しないでください。
| 項目 | 詳細 |
|---|---|
| CVE | CVE-2026-81000 |
| コードネーム | TUNderflow |
| コンポーネント | Linux カーネル |
| サブシステム | TUN/TAP |
| 影響を受けるコード | drivers/net/tun.c |
| 主要関数 | tun_get_user() |
| バグ分類 | 整数アンダーフロー / 範囲外メモリアクセス |
| 影響 | カーネルメモリ破壊 |
| 潜在的な影響 | ローカル権限昇格 |
| CVSS v3.1 | 7.8 — High |
| 攻撃ベクトル | ローカル |
| 必要な権限 | 低 |
| ユーザー操作 | なし |
| ステータス | 修正済み |
CVE アドバイザリでは、この問題を整数アンダーフローと説明しており、これにより skb->data が割り当てられた skb ヘッドの外側に位置する可能性があります。
この脆弱性は、Linux カーネルの TUN/TAP 受信経路に存在します。
影響を受けるコードは、TUN デバイスに設定された受信ヘッドルームを、パケットのヘッドルームとして、またパケットデータのうちどれだけをリニアに保つべきかを計算する際の両方に使用しています。
そのため、過大なヘッドルーム値は、以下において無効な計算を引き起こす可能性があります:
SKB_MAX_HEAD(align)
提供された値が使用可能な1ページ分のskbヘッドを超える場合、計算がアンダーフローする可能性があります。
概念的には:
Oversized receive headroom
│
▼
SKB_MAX_HEAD()
│
▼
Integer underflow
│
▼
Negative value
│
▼
size_t wrap
│
▼
Invalid skb data placement
│
▼
Kernel memory corruption
脆弱な実装は次の場所にあります:
drivers/net/tun.c
tun_get_user() が脆弱な経路の中心にあります。
根本的な問題は、TUN 受信ヘッドルームの境界が不十分であることです。
カーネルは、その値を TUN/TAP に伝播するネットワークデバイスの経路を通じて、過大なヘッドルーム要求を受け取る可能性があります。
この脆弱性は、複雑な仮想ネットワーク構成によって大きなヘッドルーム値が TUN デバイスに到達する場合に特に興味深いものとなります。
公開された情報では、以下を含むシナリオが説明されています:
Netkit
│
▼
VXLAN
│
▼
Open vSwitch
│
▼
TUN
ある設定例では、生の TUN ポートに約 4160 バイト のヘッドルームを伝播させることができ、脆弱な算術演算でアンダーフローが発生します。
この破損はカーネルのネットワークメモリ管理ロジックで発生します。
潜在的な影響には以下が含まれます:
公開された開示情報では、この脆弱性は Linux のローカル root 権限昇格脆弱性群の一つとして報告されており、公開された PoC がサポート対象のターゲット上で非特権ローカルユーザーから root への実行を達成できると述べています。
悪用可能性は環境に依存し、関連する TUN/ネットワークデバイスの設定とサポート機能が必要です。
ATTACKER
│
▼
Oversized network headroom
│
▼
Virtual network device
│
▼
Open vSwitch
│
▼
TUN/TAP
│
▼
tun_get_user()
│
▼
SKB_MAX_HEAD(align)
│
▼
Integer underflow
│
▼
size_t wraparound
│
▼
Invalid skb->data offset
│
▼
Kernel memory corruption
重要なコンポーネントは以下のとおりです:
drivers/net/tun.c
│
├── tun_set_headroom()
│
├── tun_get_user()
│
└── tun_alloc_skb()
脆弱な関係は次のように単純化できます:
tun->align
│
├── skb headroom
│
└── linear-data calculation
同じ過大な値を両方の計算で使用すると、要求されたヘッドルームと実際の skb ヘッドバジェットとの間に安全でない関係が生じます。
重要なセキュリティ特性は、概念的には次のように表すことができます:
usable_head < requested_headroom
その結果、次のようになります:
SKB_MAX_HEAD(align) < 0
その後に符号なし変換が続きます:
negative value
↓
size_t
↓
very large unsigned value
これは最終的に skb の割り当てやデータ配置に影響を与える可能性があります。
公式の説明では、結果の値が size_t 型の linear 変数に代入されるときにラップアラウンドすることが特に指摘されています。
アップストリームの修正は次のとおりです:
447c9303942c439a117d9b76ce6d6e2116c38ee7
コミット:
net: tun: bound receive headroom
この修正は、TUN が保持するヘッドルームを、利用可能な 1 ページ分の skb ヘッド予算と有効な最大 16 ビット skb ヘッダーオフセットに対して制限する。また、raw TUN および TAP 処理に十分なリニアデータが利用可能であることを保証する。
User / network device
│
▼
Large headroom
│
▼
tun->align
│
▼
Unsafe arithmetic
│
▼
Potential OOB access
User / network device
│
▼
Large headroom
│
▼
Bounded headroom
│
▼
Safe skb calculation
│
▼
Normal packet processing
| セキュリティ特性 | 脆弱版 | 修正版 |
|---|---|---|
| ヘッドルームが境界内に収まる | ❌ | ✅ |
| 大きなヘッドルームが安全に処理される | ❌ | ✅ |
| アンダーフロー条件が防止される | ❌ | ✅ |
| skb データの配置が保護される | ❌ | ✅ |
| 不正なネットワーク設定が安全に拒否される | ❌ | ✅ |
推奨されるラボトポロジー:
┌─────────────────────────────────────────┐
│ Linux VM / Host │
│ │
│ ┌─────────┐ ┌──────────────┐ │
│ │ Netkit │────▶│ VXLAN │ │
│ └─────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ Open vSwitch │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ TUN/TAP │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────┘
便利なツール:
uname -a
ip link
ip tuntap
bridge link
ovs-vsctl show
dmesg -w
カーネルデバッグの場合:
GDB
GDB + GEF
GDB + pwndbg
crash
objdump
readelf
pahole
実行中のカーネルを確認します:
uname -r
カーネル設定を確認します:
grep CONFIG_TUN /boot/config-$(uname -r)
想定される設定:
CONFIG_TUN=y
または:
CONFIG_TUN=m
モジュールがロードされているか確認します:
lsmod | grep tun
公開開示では、制御された検証のための専用のTUNderflow PoCリポジトリが提供されています。
安全なリサーチワークフローとしては、次のとおりです。
1. Build vulnerable kernel
2. Boot isolated VM
3. Configure TUN/TAP
4. Reproduce oversized headroom
5. Monitor kernel messages
6. Capture crash/corruption behavior
7. Apply upstream patch
8. Repeat test
9. Compare results
カーネルを監視します: