Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
bpfjailer — eBPF LSM 기반 강제 접근 제어 및 jailer | Kitploit
도구/GitHubGitHub/facebookincubator/bpfjailer
Authentication & AuthorizationDefensive ToolsPrivilege EscalationContainer SecurityConfiguration AuditingNetwork Access Control
GitHubfacebookincubator/bpfjailer

bpfjailer

eBPF LSM 기반 강제 접근 제어 및 jailer

저장소 보기
8981342일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

BpfJailer

Linux용 eBPF 기반 강제 접근 제어(Mandatory Access Control).

이 프로젝트는 클로즈드 소스 BpfJailer의 완전한 재작성이며 완전히 실험적입니다. 내부 BpfJailer가 작성되었을 당시에는 사용할 수 없었던 bpf arena와 같은 최신 기능을 활용합니다. 문제가 발생할 수 있으며, 버그 바운티 대상이 아니고 보안 취약점으로 간주되지 않습니다. 적절히 평가된 후 내부 클로즈드 소스 버전을 대체할 것입니다.

BpfJailer는 eBPF LSM 프로그램을 사용하여 프로세스를 pod라고 불리는 jail에 가두며, 각 pod는 TOML 정책의 역할(role)에 바인딩됩니다. pod는 fork와 exec를 통해 상속됩니다. 선택적 정책 기능:

  • 서명된 바이너리 — 실행되는 바이너리는 fs-verity와 지정된 인증서 집합의 서명을 활성화해야 합니다.
  • kill 및 ptrace — 시그널을 보내거나 attach할 수 있는 대상 역할/pod.
  • bpf — 어떤 역할의 eBPF 맵과 프로그램을 열 수 있는지, 또는 bpf(2)를 호출할 수 있는지 여부.
  • keyring — 어떤 역할의 fs-verity 키링에 인증서를 추가할 수 있는지, 또는 키링에 쓸 수 있는지 여부.
  • 파일시스템 경로 — 파일시스템 경로에 대한 읽기 및 쓰기 접근.
  • 실행 가능 코드 — exec되거나 dll로 사용될 수 있는 경로.
  • 커널 로딩 — 커널 모듈 및 kexec 로딩.
  • IPC — 소유권을 인식하는 System V 및 POSIX 메시지 큐와 공유 메모리, 그리고 POSIX 객체에 대한 변수 확장 이름 패턴.
  • Unix 소켓 — bind, connect 및 데이터그램 목적지에 대한 경로명 및 추상 이름 정책.
  • 마운트 — 목적지 및 파일시스템 유형 규칙.

거부 및 수명 주기 이벤트는 고정된(pinned) 링 버퍼에 기록됩니다. bpfjlog는 사람이 읽을 수 있는 BPF 진단 및 구조화된 이벤트를 출력하고, 라이브 정책 교체 전반에 걸쳐 링 버퍼를 추적합니다.

바이너리는 user.bpfj.policy.exec xattr을 통해 역할을 요청할 수 있으며 exec 시점에 해당 역할에 등록됩니다. 실행 중인 프로세스도 직접 등록할 수 있으며, 비특권 프로세스는 bpfjsrv/bpfjclient를 통해 스스로 등록할 수 있습니다.

구성 요소

디렉터리바이너리용도
bpfj/핵심 라이브러리 및 BPF 프로그램: jailer, enforcer, 정책 파서, libbpf C++ 헬퍼.
ctl/bpfjctljailer의 attach, reload, inspect, detach 및 프로세스 등록을 위한 범용 도구.
cmd/bpfjcmd인수와 선택적으로 정책이 컴파일된 bpfjctl. argv를 무시하므로 정적으로 링크되고 단일 단위로 fs-verity 서명될 수 있습니다.
srv/bpfjsrv이를 허용하는 역할에 비특권 호출자를 등록하는 소켓 활성화 서버.
client/bpfjclientlibbpf 또는 BPF 툴체인 의존성이 없는 bpfjsrv용 최소 클라이언트.
log/bpfjlog고정된 진단 및 구조화된 이벤트 링 버퍼의 소비자.
tests/bpfjtest테스트 스위트.

요구 사항

  • BPF LSM이 활성화된 Linux 6.16 이상 (CONFIG_BPF_LSM=y 및 lsm= 부팅 파라미터에 bpf 포함). BpfJailer는 6.16+에서만 테스트되었으며, 이전 커널은 지원되지 않습니다.
  • BPF 코드 생성용 clang 22 이상, bpftool, 그리고 C++20 컴파일러. clang 20 및 21은 arena 메모리로부터의 __builtin_memcpy에 대해 addr_space_cast를 생성하지 않으므로, 이들이 빌드한 jailer를 검증기가 거부합니다.
  • btrfs가 내장된 커널, 즉 모듈이 아닌 CONFIG_BTRFS_FS=y. BPF 프로그램은 vmlinux.h에서 btrfs inode 유형을 읽으며, Makefile이 실행 중인 커널의 BTF로부터 이를 생성합니다.
  • libbpf
  • protobuf-lite 및 protoc. Debian과 Ubuntu는 이를 libprotobuf-dev 및 protobuf-compiler로 제공합니다.
  • BPF 프로그램이 사용하는 arena 스핀 락을 제공하는 libarena 체크아웃.
  • 서명된 빌드의 경우: openssl, fsverity 및 setfattr, 그리고 Makefile에 나열된 정적 아카이브 (STATIC=1).

pkg-config가 libbpf를 찾지 못하는 경우 LIBBPF_CFLAGS / LIBBPF_LIBS를 설정하십시오. 모든 빌드에서 LIBARENA를 libarena 체크아웃으로 지정하십시오:

빌드

아래의 모든 make 명령에는 LIBARENA(Requirements 참조)도 필요하며, 명령줄에서 설정하거나 환경에 내보내야 합니다.

make                # build/bpfjctl
make STATIC=1       # bpfjctl with no shared object dependencies
make client         # build/bpfjclient, no BPF toolchain needed
make log            # build/bpfjlog
make signing-key    # generate a development signing key and certificate
make signed SIGNING_KEY=... SIGNING_CERT=...   # static, fs-verity signed bpfjctl
make srv  SIGNING_KEY=... SIGNING_CERT=...     # static, signed bpfjsrv
make cmd  SIGNING_KEY=... SIGNING_CERT=... \
     CMD_ARGS="replace-compiled" CMD_POLICY=policy.toml CMD_ROLE=bpfjailer
make clean

모든 출력은 build/ 아래에 생성됩니다. 다른 위치에 빌드하려면 BUILD=를 설정하세요. 예를 들어 make BUILD=build-asan SANITIZE=address,undefined와 같습니다.

테스트

make test

테스트는 각 테스트가 마운트 네임스페이스를 생성하고 bpffs를 마운트하기 때문에 root로 실행해야 합니다. make test는 호출한 사용자로 빌드하고 sudo 아래에서 테스트 바이너리만 실행합니다.

동시 BPF LSM detach가 영향을 받는 커널을 패닉시킬 수 있기 때문에 테스트는 기본적으로 직렬로 실행됩니다. 특정 케이스에는 make test TEST_ARGS=Suite.Test를 사용하고, 일회용 VM 내에서만 -j N 또는 BPFJTEST_JOBS=N을 선택적으로 사용하세요.

사용법

sudo bpfjctl check  policy.toml          # parse a policy and report what it holds
sudo bpfjctl attach policy.toml          # load and pin the jailer
sudo bpfjctl replace policy.toml         # reload without releasing jailed tasks
sudo bpfjctl wrap ROLE POD_ID -- CMD    # run CMD in a new pod
sudo bpfjctl enroll ROLE POD_ID PID [NAME=VALUE...] # enroll with variables
sudo bpfjctl show PID                    # pods a process is in
sudo bpfjctl list                        # every pod and its processes
sudo bpfjctl detach                      # unpin and unload

프로그램은 기본적으로 /sys/fs/bpf/bpfj-pins 아래에 고정됩니다. 이를 변경하려면 --bpffs-path와 --pin-dir를 사용하십시오. 프로그램은 detach가 실행될 때까지 로드된 상태로 유지됩니다.

--drop-cap과 비루트 --uid 없이 bpfjctl wrap을 실행하면 명령이 자신을 jail에서 제거할 수 있는 상태로 남습니다. bpfjctl wrap --help를 참조하십시오.

jailer가 연결된 동안 sudo build/bpfjlog를 실행하여 관찰하십시오. BPF 진단 정보는 stderr에, 구조화된 이벤트는 stdout에 기록됩니다. 로거는 replace가 새로운 고정 맵 세트로 교체할 때 자동으로 다시 연결됩니다.

replace는 활성 jailer 옆에 완전한 두 번째 jailer를 로드하고, pod 멤버십, 변수 및 추적된 리소스 소유권을 마이그레이션한 다음, 고정 트리를 원자적으로 교체합니다. 핸드오프 동안 두 트리 모두 연결된 상태로 유지되며, fork와 등록은 마이그레이션과 조정되고, 소유권 변경은 저널링되어 재생됩니다. 영속화된 레이아웃 버전이 호환되지 않거나 상태를 안전하게 복사할 수 없는 경우 교체는 fail-closed 방식으로 실패합니다.

정책

base-role = "floor"           # optional: enroll every process on the host
vars = ["vm_uuid"]            # known variable names

[certs]
corp-ca = "MIIDXTCCAkWgAwIBAgIJAK..." # PEM or base64 DER certificate

[roles.floor]
any = true                    # open tracking-only base role

[roles.webserver]
enforce-binary-certs = ["corp-ca"] # execs must be signed by one of these
kill-roles = ["floor"]        # may signal its own pod, plus these roles
ptrace-pod = true             # its own pod only
proc-roles = ["floor"]        # may open proc files for these roles
bpf-pod = true                # only BPF objects from its own pod
lkm-any = false               # deny module and kexec loading
mq-sysv-pod = true            # only SysV queues from its own pod
mq-posix-pod = true           # only POSIX queues from its own pod
shm-sysv-pod = true           # only SysV SHM from its own pod
shm-posix-pod = true          # only POSIX SHM from its own pod
keyring-own = true            # only its own role's keyring

[[roles.webserver.mq-posix-pattern]]
name = "/service-${vm_uuid}-*"
allow = true

[[roles.webserver.shm-posix-pattern]]
name = "/service-${vm_uuid}-*"
allow = true

[[roles.webserver.exec-paths]]
path = "/usr/bin/webserver"
allow = true
permissions = ["exec"]

[[roles.webserver.exec-paths]]
path = "/usr/lib"
allow = true
permissions = ["shared-object"]

[[roles.webserver.paths]]     # cached path policy
path = "/"
allow = false

[[roles.webserver.paths]]
path = "/usr"
allow = true
access = "read-only"

[[roles.webserver.paths]]
path = "/etc"
allow = true
access = "read-only"

[[roles.webserver.paths]]
path = "/srv/web"
allow = true
access = "read-write"

[[roles.webserver.unix-bind]] # pathname bind rule
path = "/run/webserver"
allow = true

[[roles.webserver.unix-connect]]
name = "@control-${vm_uuid}"
allow = true

[[roles.webserver.unix-dgram]]
path = "/dev/log"
allow = true

[[roles.webserver.mount]]     # destination and permitted filesystem types
path = "/srv/data"
allow = true
filesystems = ["ext4", "xfs"]

[[roles.webserver.mount]]
path = "/run/webserver"
allow = true
filesystems = ["any"]         # every filesystem type at this destination

[[roles.webserver.umount]]
path = "/"
allow = false

[[roles.webserver.umount]]
path = "/srv/data"
allow = true

[roles.sandbox]
unpriv-enroll = true          # every unspecified operation remains denied
override-stacked = true       # answers alone, ignoring roles stacked below

역할에 해당 옵션이 없으면 대부분의 작업 게이트는 거부됩니다. *-pod 옵션은 같은 pod의 리소스를 허용하고, *-roles는 지정된 소유자 역할을 추가하며, *-any는 해당 작업을 완전히 개방합니다. keyring-own은 fs-verity 키링이 pod가 아닌 역할에 속하기 때문에 역할 범위의 대응 옵션입니다. enroll-roles는 bpfjsrv가 추가할 수 있는 유일한 역할을 지정하며, 이것이 없으면 bpfjsrv를 통한 등록은 거부됩니다. Unix 경로명, 마운트, 언마운트 작업은 해당 옵션이 없거나 일치하는 경로가 없으면 거부됩니다. 추상 Unix 소켓 이름은 여전히 옵트인 필터로 남아 있으므로, 구성되지 않았거나 일치하지 않는 추상 이름은 허용됩니다.

완전히 개방된 proc 옵션은 proc-any이며, 다른 소유권 계열과 동일한 *-any 순서를 따릅니다.

도구 다운로드