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 映射来跟踪进程,并对文件访问、网络操作和进程执行实施基于角色的策略。

查看仓库网站
58211个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Jailer - eBPF 强制访问控制

警告:该项目正处于密集开发阶段,尚未准备好用于生产环境。API、策略格式及行为可能随时更改,恕不另行通知。仅供测试和实验使用。

致谢

注意:这是一个独立的实现,与 Meta 的解决方案并非同一项目。虽然 BpfJailer 在功能上类似,并且受到 Meta 的 Liam Wisehart、Justin Nga、Carl El Khoury、Mansee Chadha 原创想法和设计的启发,但这是独立开发的独立代码库。我们感谢激发此项工作的愿景和基础概念。

社区

加入我们的 Discord Substack

Jailer 是一个基于 eBPF 的进程隔离系统,为 Linux 提供强制访问控制(MAC)。它使用 BPF task_storage 映射跟踪进程,并对文件访问、网络操作和进程执行实施基于角色的策略。

功能(当前版本)

功能状态描述
进程跟踪✅ 可用使用 task_storage BPF 映射跟踪进程
Socket 注册✅ 可用进程通过 Unix socket API 注册
基于角色的策略✅ 可用受限角色和允许角色
文件访问控制✅ 可用阻止/允许文件打开操作
Jail 继承✅ 可用子进程继承父进程的 jail
网络控制✅ 可用阻止/允许 socket 绑定/连接
端口/协议过滤✅ 可用按端口 TCP/UDP 允许/拒绝规则
执行控制✅ 可用阻止/允许进程执行
路径匹配✅ 可用带缓存失效的目录项遍历
签名二进制文件🚧 占位二进制签名验证(未实现)
备选注册✅ 可用按可执行文件、cgroup 或 xattr 自动注册
无守护进程模式✅ 可用引导二进制文件在早期启动时固定程序
审计事件✅ 可用用于 systemd-journald 集成的 perf 缓冲区

Nginx 演示

Nginx 演示

复杂演示

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:~
# 在没有 jail 的情况下运行漏洞测试(显示攻击成功)
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"Enrollment: {response}")
sock.close()

# 尝试读取文件(应被阻止)
try:
    open("/etc/passwd").read()
    print("File access: ALLOWED")
except PermissionError:
    print("File access: BLOCKED")

策略文件

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 }
  值:允许 (1) 或拒绝 (0)
  • protocol:6 = TCP,17 = UDP
  • direction:0 = 绑定,1 = 连接
  • 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)?;

协议常量

端口范围

端口范围可以在 policy.json 中使用 port_start 和 port_end 指定:

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 → 信息)   │  │ (角色→标志) │  │(任务→信息)   │   │
│  └──────────────────┘  └─────────────┘  └──────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                     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 支持两种安装模式:

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

特性:

  • 基于 socket 的注册 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

# 检查 socket 权限
ls -la /run/bpfjailer/enrollment.sock

备选注册方法

除了 Unix socket 注册,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. 在执行时(bprm_check_security LSM 钩子):

    • 检查可执行文件的 inode 是否在 exec_enrollment 映射中
    • 检查进程的 cgroup ID 是否在 cgroup_enrollment 映射中
    • 如果找到,则自动设置 task_storage,包含 pod_id 和 role_id
  2. 注册通过 fork/exec 保持(通过 task_alloc 钩子)

  3. 策略规则(网络、路径、执行)基于 role_id 应用

许可证

GPL-2.0(BPF 程序必需)

下载工具
测试漏洞缓解方式
path_traversal通过 ../ 读取任意文件restricted, isolated
command_injectionShell 命令执行restricted, webserver, isolated
reverse_shell与攻击者建立出站连接restricted, isolated
ssrf访问内部服务/云元数据restricted, isolated
arbitrary_write写入敏感路径restricted
crypto_miner下载 + 执行 + 连接矿池restricted, webserver
privilege_escalation读取 shadow、写入 sudoersrestricted
标志描述
allow_file_access允许文件打开操作
allow_network允许 socket 绑定/连接
allow_exec允许进程执行
allow_setuid允许 setuid 操作
allow_ptrace允许 ptrace 操作
角色 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 socket + 备选仅备选
策略更新热重载需要重启
审计日志守护进程读取 ringbuf通过 perf 缓冲区 journald
程序移除停止守护进程仅重启
启动顺序network.target 之后basic.target 之前