Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
copy-fail-blocker — BPF-LSM 완화 도구 for CVE-2026-31431 (Copy Fail) — 클러스터 전체에서 AF_ALG 소켓 생성을 차단합니다. | Kitploit
도구/GitHubGitHub/cozystack/copy-fail-blocker
Defensive ToolsContainer SecurityVulnerability AnalysisNetwork SecurityCloud Security
GitHubcozystack/copy-fail-blocker

copy-fail-blocker

BPF-LSM 완화 도구 for CVE-2026-31431 (Copy Fail) — 클러스터 전체에서 AF_ALG 소켓 생성을 차단합니다.

저장소 보기
3453개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

copy-fail-blocker

CVE-2026-31431("Copy Fail") 및 Dirty Frag의 RxRPC 변종에 대한 BPF-LSM 완화 조치이며, AF_ALG 또는 AF_RXRPC 소켓 패밀리를 통해 접근 가능한 커널 측 인플레이스 암호화 경로에 대한 사용자 공간 접근에 의존하는 유사한 권한 상승 취약점에도 적용됩니다.

모든 노드의 socket_create 후크에 단일 BPF-LSM 프로그램을 연결하는 소규모 DaemonSet입니다. 이 프로그램은 프로세스 권한, 네임스페이스 또는 seccomp 프로필과 관계없이 모든 사용자 공간의 socket(AF_ALG, ...) 또는 socket(AF_RXRPC, ...) 호출에 대해 -EPERM을 반환합니다. 커널 내부의 sock_create_kern() 호출자(예: fs/afs, IPsec 스택)는 통과하므로 적법한 커널 내부 사용자는 계속 작동합니다.

Talos Linux(v1.10부터 CONFIG_BPF_LSM=y 및 기본 LSM 스택에 bpf 포함)에서 테스트되었으며, 동일한 커널 구성을 가진 모든 배포판에서 작동합니다.

이유

Copy Fail(CVE-2026-31431)은 algif_aead의 논리 결함으로, 권한이 없는 로컬 사용자가 732바이트 Python 스크립트로 루트 권한을 얻기 위해 모든 setuid 바이너리에 4바이트 페이지 캐시 쓰기를 수행할 수 있게 합니다. 이 익스플로잇은 기본적으로 권한이 없는 모든 프로세스에서 접근 가능한 AF_ALG + splice()만 필요합니다. 메인라인 수정은 a664bf3d603d입니다.

Dirty Frag는 동일한 연구 라인에서 2026년 5월에 공개된 후속 취약점 클래스입니다. sk_buff의 frag 멤버를 "더티"하게 만드는 두 가지 버그(xfrm-ESP Page-Cache Write 및 RxRPC Page-Cache Write)를 연결합니다. RxRPC 변종은 rxkad_verify_packet_1() 내부에서 splice()로 고정된 페이지 캐시 페이지에 대해 인플레이스 pcbc(fcrypt) 복호화를 수행하며, 사용자 네임스페이스 생성 없이 루트 권한에 도달하므로 강화된 배포판에서 체인의 더 보편적으로 악용 가능한 절반입니다. xfrm-ESP 수정은 f4c50a4034e6(2026-05-07)으로 netdev에 반영되었습니다. 작성 시점 기준 배포판은 여전히 백포트 중이며, RxRPC에는 아직 공개 수정 사항이 없습니다. 공개 타임라인은 업스트림 문서를 참조하세요.

두 익스플로잇 모두 영향을 받는 패밀리의 소켓을 여는 데 의존합니다. 커널 수정 사항이 배포판에 반영될 때까지 사용자 공간이 AF_ALG 또는 AF_RXRPC 소켓을 생성하지 못하도록 하여 공격 표면을 제거할 수 있습니다. 대안과 비교:

이 프로젝트는 재부팅 없는 옵션입니다. 클러스터 전체에 배포한 후 일반 패치 주기에 맞춰 영구적인 커널 수정을 계획하세요.

Dirty Frag의 ESP 변종에 대한 참고 사항. Dirty Frag의 xfrm-ESP Page-Cache Write 절반은 이 DaemonSet으로 차단되지 않습니다. 이는 전용 소켓 패밀리가 아닌 XFRM netlink + UDP_ENCAP_ESPINUDP를 통해 트리거되며, 이를 위한 깔끔한 BPF-LSM 필터는 호스트의 적법한 IPsec을 깨뜨리거나 사용자 네임스페이스 인식 로직이 필요합니다. 현재 여기서 추적되지 않습니다 — 기여를 환영합니다. 권한 없는 사용자 네임스페이스를 차단하는 강화된 배포판(예: Ubuntu의 기본 AppArmor 정책)에서는 ESP 변종이 애초에 도달 불가능하며 여기의 RxRPC 차단으로 충분합니다.

작동 방식

bpf/blocker.c는 짧은 BPF-LSM 프로그램입니다:

root@kitploit:~
SEC("lsm/socket_create")
int BPF_PROG(block_socket_family, int family, int type, int protocol,
             int kern, int ret)
{
    if (ret)
        return ret;
    /* kern != 0 means sock_create_kern() — let in-kernel callers through. */
    if (!kern && (family == AF_ALG || family == AF_RXRPC))   // 38, 33
        return -EPERM;
    return 0;
}

Go 로더(main.go, 약 40줄)는 프로그램을 로드하고 bpf(BPF_LINK_CREATE)를 통해 연결합니다. 링크는 Pod 수명 동안 유지됩니다. SIGTERM 시 링크가 닫히고 후크가 분리됩니다.

CONFIG_BPF_LSM=y 및 활성 LSM 스택에 bpf(커널 cmdline의 lsm=...,bpf)가 포함된 커널이 필요합니다. Talos Linux는 v1.10부터 기본적으로 둘 다 활성화되어 제공됩니다.

설치

kubectl

root@kitploit:~
kubectl apply -f https://raw.githubusercontent.com/cozystack/copy-fail-blocker/v0.3.0/manifests/copy-fail-blocker.yaml

main의 최신 커밋(미공개 변경 사항 포함 가능)의 경우:

root@kitploit:~
kubectl apply -f https://raw.githubusercontent.com/cozystack/copy-fail-blocker/main/manifests/copy-fail-blocker.yaml

Helm

차트는 OCI 아티팩트로 게시되지 않습니다(레지스트리 경로가 컨테이너 이미지와 공유됨). 태그된 체크아웃에서 설치:

root@kitploit:~
git clone --branch v0.3.0 https://github.com/cozystack/copy-fail-blocker
cd copy-fail-blocker
helm upgrade --install copy-fail-blocker charts/copy-fail-blocker \
  --namespace kube-system

또는 Makefile 단축 명령 사용:

root@kitploit:~
make apply         # helm upgrade --install into kube-system
make diff          # preview changes against the cluster
make delete        # uninstall
make manifest      # regenerate manifests/copy-fail-blocker.yaml

DaemonSet은 권한 있는(privileged) 모드로 실행되어야 합니다(BPF 프로그램 로드 및 bpffs 쓰기). 권한 있는 Pod Security Standard가 적용된 네임스페이스 또는 기본적으로 권한이 있는 kube-system에 배치하세요.

검증

적용된 노드의 모든 Pod에서:

root@kitploit:~
python3 -c '
import errno, socket
# Pass each family with a type the family-specific create() actually
# supports (AF_ALG → SOCK_SEQPACKET, AF_RXRPC → SOCK_DGRAM) so that on
# a node WITHOUT this hook the call would either succeed (FAIL: socket
# created) or fail with a non-EPERM errno — both surface as FAIL below.
# With the hook active, security_socket_create() returns -EPERM before
# pf->create() runs, so the type does not matter; we still pass the
# correct one to keep the FAIL diagnostic unambiguous.
for name, family, stype in [("AF_ALG",   38, socket.SOCK_SEQPACKET),
                            ("AF_RXRPC", 33, socket.SOCK_DGRAM)]:
    try:
        socket.socket(family, stype, 0)
        print(f"FAIL: {name} socket created")
    except OSError as e:
        if e.errno == errno.EPERM:
            print(f"OK ({name}): blocked with EPERM")
        else:
            print(f"FAIL: {name} got {e.errno} ({e.strerror}), expected EPERM")'

예상 출력:

root@kitploit:~
OK (AF_ALG): blocked with EPERM
OK (AF_RXRPC): blocked with EPERM

다른 errno(예: ESOCKTNOSUPPORT 94, EAFNOSUPPORT 97)는 해당 노드에서 후크가 활성화되지 않았음을 의미합니다. 적용되었다고 가정하기 전에 조사하세요.

빌드

root@kitploit:~
make image                                       # docker buildx build + push
make image REGISTRY=ghcr.io/myorg TAG=v0.3.0     # custom tag
make image PUSH=0 LOAD=1                         # build locally without pushing

make image는 해결된 이미지 다이제스트로 charts/copy-fail-blocker/values.yaml을 업데이트하여 차트가 항상 다이제스트로 고정되도록 합니다.

빌드 종속성은 Containerfile(clang, libbpf-dev, Go)에 있습니다. 로컬 호스트에는 docker buildx, helm, yq(mikefarah), kubectl, helm-diff만 필요합니다.

구성

charts/copy-fail-blocker/values.yaml:

제한 사항

  • 후크는 Pod가 실행되는 동안에만 존재합니다. Pod 재시작 시 사용자 공간 AF_ALG 및 AF_RXRPC에 다시 접근할 수 있는 짧은 창(수 초)이 있습니다. 대부분의 위협 모델에서는 허용 가능합니다. 그렇지 않은 경우 BPF 링크를 bpffs에 고정하는 것을 고려하세요(현재 구현되지 않음 — 기여를 환영합니다).
  • 호스트에서 CAP_BPF 및 CAP_SYS_ADMIN을 가진 사람은 후크를 분리할 수 있습니다. 이는 클러스터 전체 권한 제한을 대체하지 않습니다.
  • algif_skcipher / algif_hash 등을 차단하지 않습니다. 프로그램은 전체 AF_ALG 패밀리를 거부하지만 현재 algif_aead만 악용 가능한 것으로 알려져 있습니다. 향후 CVE에서 더 세밀한 필터(예: bind() 후크 및 salg_type 검사)가 필요한 경우 추가하기 쉽습니다.
  • 이미 열린 AF_ALG 또는 AF_RXRPC 소켓을 보유한 프로세스에는 영향이 없습니다. 기존 소켓은 닫힐 때까지 계속 작동합니다.
  • Dirty Frag의 ESP 변종을 다루지 않습니다. 해당 경로는 전용 소켓 패밀리가 아닌 XFRM netlink 및 UDP_ENCAP_ESPINUDP를 통해 도달합니다 — 현재 추적되지 않으며 기여를 환영합니다. 섹션의 참고 사항을 참조하세요.

라이선스

Apache License 2.0 — LICENSE 참조.

도구 다운로드
완화 조치적용 범위재부팅?지속성?
커널 cmdline module_blacklist=af_alg,rxrpc(algif_aead뿐만 아니라 패밀리 핸들러)호스트 전체예예
/etc/modprobe.d/*.conf에 install af_alg /bin/false + install rxrpc /bin/false 및 이미 로드된 모듈의 rmmod(업스트림 Dirty Frag 지침과 일치 — 일반 blacklist는 커널 내부 request_module() 자동 로드를 중지하지 않으며, install … /bin/false만 중지함)호스트 전체아니요예(파일이 있는 동안)
CRYPTO_USER_API / AF_RXRPC가 없는 커스텀 커널호스트 전체예예
Pod별 커스텀 seccomp 프로필레이블이 지정된 워크로드만아니요예
copy-fail-blocker(이 프로젝트)호스트 전체 사용자 공간아니요DS 실행 중
키기본값참고
image.repositoryghcr.io/cozystack/copy-fail-blockermake image로 자동 업데이트
image.tagvX.Y.Z@sha256:...다이제스트로 고정, 현재 값은 values.yaml에 있음
priorityClassNamesystem-node-critical데몬이 축출에서 살아남도록 보장
tolerations[{operator: Exists}]taint가 있는 노드를 포함한 모든 노드에서 실행
resources.requests5m CPU / 16Mi memory연결 후 유휴 사용량
이유
  • 사용자 공간 AF_RXRPC 클라이언트가 차단됩니다. RxRPC는 AFS 네트워크 프로토콜입니다. !kern 가드는 인트리 fs/afs(kAFS) 모듈이 sock_create_kern()을 통해 소켓을 열기 때문에 계속 작동하도록 보장합니다. socket(2)를 통해 직접 AF_RXRPC 소켓을 여는 사용자 공간 AFS 도구(예: OpenAFS 사용자 공간 데몬)는 거부됩니다 — 이러한 도구를 실행하는 노드에는 이 DaemonSet을 배포하지 마세요.