Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
jailer — Jailerは、eBPFベースのプロセス隔離システムであり、Linuxに強制アクセス制御(MAC)を提供します。BPF task_storageマップを使用してプロセスを追跡し、ファイルアクセス、ネットワーク操作、プロセス実行に対するロールベースのポリシーを適用します。 | Kitploit
ツール/GitHubGitHub/gen0sec/jailer
防御ツールコンテナセキュリティネットワークセキュリティクラウドセキュリティ
GitHubgen0sec/jailer

jailer

Jailerは、eBPFベースのプロセス隔離システムであり、Linuxに強制アクセス制御(MAC)を提供します。BPF task_storageマップを使用してプロセスを追跡し、ファイルアクセス、ネットワーク操作、プロセス実行に対するロールベースのポリシーを適用します。

リポジトリを見るウェブサイト
58218日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Jailer - eBPF強制アクセス制御

警告: このプロジェクトは活発に開発中であり、本番環境での使用には適していません。API、ポリシー形式、動作は予告なく変更される可能性があります。テストおよび実験目的でのみ使用してください。

謝辞

注記: これは独立した実装であり、Metaのソリューションと同じプロジェクトではありません。BpfJailerは機能的に類似しており、Meta の Liam Wisehart、Justin Nga、Carl El Khoury、Mansee Chadha による元のアイデアと設計に触発されていますが、これは独立して開発された別のコードベースです。この作品に影響を与えたビジョンと基礎概念に感謝の意を表します。

コミュニティ

Join us on Discord Substack

Jailerは、Linux向けの強制アクセス制御(MAC)を提供するeBPFベースのプロセス隔離システムです。BPF task_storageマップを使用してプロセスを追跡し、ファイルアクセス、ネットワーク操作、プロセス実行に関するロールベースのポリシーを適用します。

機能(現在のバージョン)

機能ステータス説明
プロセス追跡✅ 動作中task_storage BPFマップを使用してプロセスを追跡
ソケット登録✅ 動作中UnixソケットAPIを介してプロセスが登録
ロールベースのポリシー✅ 動作中制限ロールと許可ロール
ファイルアクセス制御✅ 動作中ファイルオープン操作のブロック/許可
隔離の継承✅ 動作中子プロセスは親の隔離を継承
ネットワーク制御✅ 動作中ソケットbind/connectのブロック/許可
ポート/プロトコルフィルタリング✅ 動作中ポート単位のTCP/UDP許可/拒否ルール
実行制御✅ 動作中プロセス実行のブロック/許可
パス一致✅ 動作中キャッシュ無効化を伴うdentryウォーク
署名済みバイナリ🚧 スタブバイナリ署名検証(未実装)
代替登録✅ 動作中実行ファイル、cgroup、またはxattrによる自動登録
デーモンレスモード✅ 動作中ブートストラップバイナリが早期ブート時にプログラムをピン留め
監査イベント✅ 動作中systemd-journald統合用のperfバッファ

Nginxデモ

Nginx demo

複雑なデモ

asciicast

カーネル要件

最低カーネルバージョン

  • Linux 5.11以上(BPF_MAP_TYPE_TASK_STORAGEサポートのため)
  • 推奨: Linux 6.1以上(BTFサポートがより良好)

必要なカーネル設定

root@kitploit:~
# 現在のカーネル設定を確認
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)

必要なオプション:

root@kitploit:~
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y

BPF LSMを有効化

BPF LSMはカーネルブートパラメータで有効にする必要があります:

root@kitploit:~
# BPF LSMがアクティブか確認
cat /sys/kernel/security/lsm
# リストに "bpf" が含まれている必要があります

# 含まれていない場合、カーネルブートパラメータに追加:
# /etc/default/grub を編集し、GRUB_CMDLINE_LINUX に以下を追加:
#   lsm=lockdown,capability,landlock,yama,apparmor,bpf

# その後grubを更新して再起動:
sudo update-grub
sudo reboot

Ubuntu/Debianシステムでは、以下も使用できます:

root@kitploit:~
# BPF LSMを有効化するスクリプトを作成
cat > /tmp/enable_bpf_lsm.sh << 'EOF'
#!/bin/bash
GRUB_FILE="/etc/default/grub"
if grep -q "lsm=" "$GRUB_FILE"; then
    sudo sed -i 's/lsm=[^""]*/lsm=lockdown,capability,landlock,yama,apparmor,bpf/' "$GRUB_FILE"
else
    sudo sed -i 's/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 lsm=lockdown,capability,landlock,yama,apparmor,bpf"/' "$GRUB_FILE"
fi
sudo update-grub
echo "BPF LSMが有効化されました。再起動してください。"
EOF
chmod +x /tmp/enable_bpf_lsm.sh
sudo /tmp/enable_bpf_lsm.sh

ビルド

前提条件

root@kitploit:~
# Rustをインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# ビルド依存関係をインストール(Ubuntu/Debian)
sudo apt-get install -y clang llvm libelf-dev linux-headers-$(uname -r)

# RustにBPFターゲットを追加
rustup target add bpfel-unknown-none

全コンポーネントのビルド

root@kitploit:~
cd bpfjail

# BPFプログラムをビルド
cd bpfjailer-bpf && cargo build --release && cd ..

# デーモンとクライアントをビルド
cargo build --release

クイックスタート

1. デーモンを起動

root@kitploit:~
# rootとして実行(存在すれば config/policy.json を読み込み)
sudo RUST_LOG=info ./target/release/bpfjailer-daemon

期待される出力:

root@kitploit:~
[INFO] BpfJailer daemon starting...
[INFO] Loading BpfJailer eBPF programs with libbpf-rs...
[INFO] ✓ pending_enrollments map available for enrollment
[INFO] ✓ network_rules map available for port/protocol filtering
[INFO] ✓ task_storage map created successfully
[INFO] ✓ Program task_alloc attached
[INFO] ✓ Program file_open attached
[INFO] ✓ Program socket_bind attached
[INFO] ✓ Program socket_connect attached
[INFO] ✓ Program bprm_check_security attached
[INFO] Initialized with default roles: restricted (1), permissive (2)
[INFO] Loaded policy from config/policy.json
[INFO] Loaded 5 roles
[INFO] Enrollment server listening on /run/bpfjailer/enrollment.sock

2. セキュリティテストの実行

root@kitploit:~
# 隔離なしで脆弱性テストを実行(攻撃が成功することを確認)
sudo python3 tests/vulnerable_apps/run_tests.py

# 制限ロールで脆弱性テストを実行(攻撃がブロックされることを確認)
sudo python3 tests/vulnerable_apps/run_tests.py --role 1

# 特定のテストを実行
sudo python3 tests/vulnerable_apps/run_tests.py --role 1 --test path

# 利用可能なテストとロールを一覧表示
sudo python3 tests/vulnerable_apps/run_tests.py --list

制限ロールでの出力例:

root@kitploit:~
============================================================
TEST: Path Traversal / Arbitrary File Read
============================================================
Attempting to read /etc/passwd via path traversal...
BLOCKED - Permission denied (BpfJailer blocked file access)

============================================================
TEST: Command Injection
============================================================
Attempting command injection...
BLOCKED - Permission denied (BpfJailer blocked exec)

============================================================
TEST: Reverse Shell / Data Exfiltration
============================================================
Test 1: Reverse shell connection to 127.0.0.1:4444
BLOCKED - Permission denied (BpfJailer blocked connect)

利用可能なセキュリティテスト

3. 手動登録テスト

root@kitploit:~
#!/usr/bin/env python3
import socket
import json
import os

# デーモンに接続
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/run/bpfjailer/enrollment.sock")

# 制限ロール(ID 1)で登録
request = {"Enroll": {"pod_id": 1, "role_id": 1}}
sock.send((json.dumps(request) + "\n").encode())
response = sock.recv(4096).decode()
print(f"登録: {response}")
sock.close()

# ファイルを読み取ろうとする(ブロックされるはず)
try:
    open("/etc/passwd").read()
    print("ファイルアクセス: 許可")
except PermissionError:
    print("ファイルアクセス: ブロック")

ポリシーファイル

BpfJailerはJSONポリシーファイルからロールを読み込みます。デーモンは次の順序でポリシーファイルを検索します:

  1. $BPFJAILER_POLICY 環境変数
  2. /etc/bpfjailer/policy.json
  3. config/policy.json(ワーキングディレクトリからの相対パス)

ポリシーファイルの例

root@kitploit:~
{
  "roles": {
    "restricted": {
      "id": 1,
      "name": "restricted",
      "flags": {
        "allow_file_access": false,
        "allow_network": false,
        "allow_exec": false
      },
      "network_rules": []
    },
    "webserver": {
      "id": 3,
      "name": "webserver",
      "flags": {
        "allow_file_access": true,
        "allow_network": true,
        "allow_exec": false
      },
      "network_rules": [
        {"protocol": "tcp", "port": 80, "allow": true},
        {"protocol": "tcp", "port": 443, "allow": true}
      ]
    }
  },
  "pods": []
}

ポリシーフラグ

デフォルトロール

ネットワークポート/プロトコルフィルタリング

BpfJailerはポート単位のTCP/UDPルールによる細かいネットワーク制御をサポートしています。

ルール構造

root@kitploit:~
network_rules マップ:
  キー: { role_id, port, protocol, direction }
  値: allowed (1) または denied (0)
  • protocol: 6 = TCP, 17 = UDP
  • direction: 0 = bind, 1 = connect
  • port: 0 = ワイルドカード(全ポート)

ルール評価順序

  1. ロールに対する特定ポートのルールをチェック
  2. ロールに対するワイルドカードポート(port=0)のルールをチェック
  3. role_flags(ビット1 = ネットワーク許可)にフォールバック

例: 制限ロールにHTTP/HTTPSのみ許可

root@kitploit:~
// デーモンコード内:
use bpfjailer_daemon::process_tracker::{PROTO_TCP, DIR_CONNECT};

// TCP接続をポート80と443のみ許可
process_tracker.add_network_rule(RoleId(1), 80, PROTO_TCP, DIR_CONNECT, true)?;
process_tracker.add_network_rule(RoleId(1), 443, PROTO_TCP, DIR_CONNECT, true)?;

プロトコル定数

ポート範囲

ポート範囲は port_start と port_end を使用してpolicy.jsonで指定できます:

root@kitploit:~
{
  "network_rules": [
    {"protocol": "tcp", "port": 443, "allow": true},
    {"protocol": "tcp", "port_start": 8000, "port_end": 8100, "allow": true}
  ]
}
フィールド説明
port単一ポート(例: 80)
port_start + port_endポート範囲(例: 8000-8100)

注記: 大きな範囲(1000ポート超)は多くのBPFマップエントリを消費します。1000ポートを超える範囲に対しては警告が記録されます。

アーキテクチャ

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│                     ユーザ空間                               │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐    ┌──────────────────┐                    │
│  │   クライアント  │───▶│  bpfjailer-daemon │                    │
│  │  (登録)      │    │                  │                    │
│  └─────────────┘    │  - PolicyManager │                    │
│                     │  - ProcessTracker│                    │
│                     │  - EnrollmentSvr │                    │
│                     └────────┬─────────┘                    │
│                              │ 書き込み                      │
│                              ▼                              │
├─────────────────────────────────────────────────────────────┤
│                     BPFマップ                                │
│  ┌──────────────────┐  ┌─────────────┐  ┌──────────────┐   │
│  │pending_enrollments│  │ role_flags  │  │ task_storage │   │
│  │   (PID → info)   │  │ (role→flags)│  │(task→info)   │   │
│  └──────────────────┘  └─────────────┘  └──────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                     BPF LSMフック                            │
│  ┌────────────┐ ┌───────────┐ ┌─────────────┐ ┌──────────┐ │
│  │ task_alloc │ │ file_open │ │socket_bind/ │ │bprm_check│ │
│  │(継承       │ │(移行      │ │  connect    │ │_security │ │
│  │ + 初期化)  │ │ + 検査)   │ │  (検査)     │ │ (検査)   │ │
│  └────────────┘ └───────────┘ └─────────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘

登録フロー

  1. プロセスが /run/bpfjailer/enrollment.sock に接続
  2. JSONを送信: {"Enroll": {"pod_id": N, "role_id": M}}
  3. デーモンが pending_enrollments[PID] と role_flags[role_id] に書き込み
  4. 次のシステムコール(file_open, exec)で、BPFが登録を task_storage に移行
  5. 以降のすべてのシステムコールは、強制のために task_storage + role_flags を検査
  6. 子プロセスは task_alloc フックを介して継承

インストールモード

BpfJailerは2つのインストールモードをサポートしています:

1. デーモンモード(標準)

実行中のデーモンを使用して登録とポリシー管理を行います:

root@kitploit:~
# systemdサービスのインストール
sudo cp config/bpfjailer-daemon.service /etc/systemd/system/
sudo cp target/release/bpfjailer-daemon /usr/sbin/
sudo mkdir -p /etc/bpfjailer
sudo cp config/policy.json /etc/bpfjailer/

# 有効化して起動
sudo systemctl daemon-reload
sudo systemctl enable bpfjailer-daemon
sudo systemctl start bpfjailer-daemon

特長:

  • ソケットベースの登録API
  • ホットポリシーリロード(デーモンの停止/起動)
  • デーモンプロセスでの完全なログ出力

2. デーモンレスモード(ブートストラップ)

早期ブート時にBPFプログラムをロードして終了します。プログラムは再起動までアクティブのままです:

root@kitploit:~
# ブートストラップサービスのインストール
sudo cp config/bpfjailer-bootstrap.service /etc/systemd/system/
sudo cp target/release/bpfjailer-bootstrap /usr/sbin/
sudo mkdir -p /etc/bpfjailer
sudo cp config/policy.json /etc/bpfjailer/

# 有効化(次のブートで実行)
sudo systemctl daemon-reload
sudo systemctl enable bpfjailer-bootstrap

# または今すぐ手動で実行
sudo bpfjailer-bootstrap

特長:

  • 実行中のデーモンがない(攻撃対象領域の低減)
  • BPFプログラムは /sys/fs/bpf/bpfjailer/ にピン留め
  • 再起動なしでは停止不可
  • 監査イベントはperfバッファを介してsystemd-journaldに送信
  • 代替登録方法のみ動作(exec/cgroup/xattr)

ピン留めされたプログラムの確認:

root@kitploit:~
ls -la /sys/fs/bpf/bpfjailer/
ls -la /sys/fs/bpf/bpfjailer/maps/
ls -la /sys/fs/bpf/bpfjailer/progs/

監査イベントの表示:

root@kitploit:~
# イベントはperfバッファに出力され、journaldが取得
journalctl -f | grep bpfjailer

モード比較

トラブルシューティング

"task_storage map creation failed"

root@kitploit:~
# カーネルバージョンの確認(5.11以上が必要)
uname -r

# BPF LSMがアクティブか確認
cat /sys/kernel/security/lsm | grep bpf

# BTFが利用可能か確認
ls -la /sys/kernel/btf/vmlinux

"Failed to attach program"

root@kitploit:~
# BPFプログラムをロードできるか確認
sudo bpftool prog list

# ケーパビリティの確認
sudo capsh --print | grep cap_bpf

登録時の許可拒否

root@kitploit:~
# デーモンがrootとして実行されていることを確認
ps aux | grep bpfjailer

# ソケットのパーミッション確認
ls -la /run/bpfjailer/enrollment.sock

代替登録方法

Unixソケット登録に加えて、BpfJailerは以下に基づく自動登録をサポートしています:

実行ファイルベースの登録

特定のバイナリを実行するすべてのプロセスを自動登録:

root@kitploit:~
{
  "exec_enrollments": [
    {
      "executable_path": "/usr/bin/nginx",
      "pod_id": 1000,
      "role": "webserver"
    }
  ]
}

任意のプロセスが /usr/bin/nginx を実行すると、自動的に webserver ロールで登録されます。これは実行ファイルのinodeで照合されるため、シンボリックリンクやハードリンクも正しく処理されます。

Cgroupベースの登録

特定のcgroup内のすべてのプロセスを自動登録:

root@kitploit:~
{
  "cgroup_enrollments": [
    {
      "cgroup_path": "/sys/fs/cgroup/bpfjailer/sandbox",
      "pod_id": 2000,
      "role": "sandbox"
    }
  ]
}

cgroupを作成し、プロセスをその中に移動:

root@kitploit:~
# cgroupを作成
sudo mkdir -p /sys/fs/cgroup/bpfjailer/sandbox

# プロセスをcgroupに移動
echo $$ | sudo tee /sys/fs/cgroup/bpfjailer/sandbox/cgroup.procs

# プロセスは自動的にsandboxロールで登録される

Xattrベースの登録

実行ファイルに拡張属性を設定して登録情報を付加:

root@kitploit:~
# 登録xattrを設定
sudo setfattr -n user.bpfjailer.pod_id -v $(printf '\x01\x00\x00\x00\x00\x00\x00\x00') /path/to/binary
sudo setfattr -n user.bpfjailer.role_id -v $(printf '\x03\x00\x00\x00') /path/to/binary

# xattrを確認
getfattr -d /path/to/binary

自動登録の仕組み

  1. exec時(bprm_check_security LSMフック):

    • 実行ファイルのinodeが exec_enrollment マップにあるかチェック
    • プロセスのcgroup IDが cgroup_enrollment マップにあるかチェック
    • 見つかった場合、自動的に task_storage に pod_id と role_id を設定
  2. 登録は task_alloc フックを介してfork/execを通じて永続化

  3. ポリシールール(ネットワーク、パス、exec)は role_id に基づいて適用

ライセンス

GPL-2.0(BPFプログラムに必要なライセンス)

ツールをダウンロード
テスト脆弱性緩和するロール
path_traversal../ による任意ファイル読み取りrestricted, isolated
command_injectionシェルコマンド実行restricted, webserver, isolated
reverse_shell攻撃者へのアウトバウンド接続restricted, isolated
ssrf内部サービス/クラウドメタデータへのアクセスrestricted, isolated
arbitrary_write機密パスへの書き込みrestricted
crypto_minerダウンロード + 実行 + プールへの接続restricted, webserver
privilege_escalationshadow読み取り、sudoers書き込みrestricted
フラグ説明
allow_file_accessファイルオープン操作を許可
allow_networkソケットbind/connectを許可
allow_execプロセス実行を許可
allow_setuidsetuid操作を許可
allow_ptraceptrace操作を許可
ロールID名前ファイルアクセスネットワーク実行
1restrictedブロックブロックブロック
2permissive許可許可許可
3webserver許可ポート80, 443, 8080ブロック
4database許可ポート5432, 6379ブロック
5isolated許可ブロックブロック
6web_with_db許可ポート80, 443, 5432, 3306, 6379ブロック
7worker許可ポート443, 5432, 6379, 5672許可
定数値説明
PROTO_TCP6TCPプロトコル
PROTO_UDP17UDPプロトコル
DIR_BIND0socket bind()
DIR_CONNECT1socket connect()
項目デーモンモードデーモンレスモード
攻撃対象領域デーモン実行中実行中のプロセスなし
登録Unixソケット + 代替代替のみ
ポリシー更新ホットリロード再起動が必要
監査ログデーモンがringbufを読み取りperfバッファ経由のjournald
プログラム削除デーモン停止再起動のみ
ブート順序network.target 後basic.target 前