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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
block-copyfail — BPF LSM 차단기 for CVE-2026-31431 (Copy Fail) - OpenShift 4용 제로-리부트 완화 | Kitploit
도구/GitHubGitHub/mrunalp/block-copyfail
Defensive ToolsContainer SecurityVulnerability AnalysisSecurity VirtualizationCloud Security
GitHubmrunalp/block-copyfail

block-copyfail

BPF LSM 차단기 for CVE-2026-31431 (Copy Fail) - OpenShift 4용 제로-리부트 완화

저장소 보기
123개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

요약

CVE-2026-31431("Copy Fail")은 Linux 커널의 algif_aead 암호화 인터페이스에서 발생하는 권한 상승 취약점입니다. 공격자는 authencesn 알고리즘과 splice()를 사용하는 AF_ALG 소켓을 이용하여 /usr/bin/su와 같은 setuid 바이너리를 포함한 커널 페이지 캐시의 임의 파일을 손상시킬 수 있습니다.

이 문서는 Copy Fail이 악용하는 하위 시스템인 모든 AF_ALG AEAD 바인드를 차단하는 BPF LSM DaemonSet을 사용한 재부팅 없는 완화 방법을 제공합니다. 이는 암호화 템플릿 중첩(예: pcrypt(authencesn(...)))을 통한 우회를 방지합니다. 다른 AF_ALG 사용(해시, skcipher)은 영향을 받지 않습니다. 별도의 OCP 4.22 클러스터 3개에서 엔드투엔드로 테스트되었습니다.

빠른 시작

root@kitploit:~
# 1. BPF LSM이 활성화되어 있는지 확인합니다 (RHEL CoreOS 9.8에는 기본적으로 활성화되어 있음)
oc debug node/<any-node> -- chroot /host cat /sys/kernel/security/lsm
# "bpf"가 포함되어 있어야 합니다

# 2. 네임스페이스를 배포하고 privileged SCC를 부여합니다
oc apply -f daemonset.yaml

# 3. DaemonSet 파드는 모든 노드에서 자동으로 시작됩니다

# 4. 확인
oc get pods -n block-copyfail     # 모든 노드에서 Running 상태여야 합니다
oc logs -n block-copyfail -l app=block-copyfail
# 예상 출력: "block-copyfail: blocker active — all AF_ALG AEAD binds blocked"

재부팅이 필요 없습니다. 노드 드레인이 필요 없습니다. 파드 재시작이 필요 없습니다. 보호는 즉시 적용되며 모든 노드의 모든 프로세스를 포함합니다(100% 적용 범위).

목차

  1. 취약점 작동 방식
  2. 클러스터의 취약점 확인
  3. BPF LSM DaemonSet 배포
  4. 배포 후 검증
  5. 소스에서 이미지 빌드
  6. 제거

취약점 작동 방식

이 취약점은 세 가지 커널 기능을 연결합니다:

  1. AF_ALG 소켓 — socket(AF_ALG, SOCK_SEQPACKET, 0)을 통해 커널 암호화에 대한 사용자 공간 핸들을 생성합니다
  2. AEAD 바인드 — 특정 인증 암호화 알고리즘인 authencesn(hmac(sha256),cbc(aes))에 바인딩합니다
  3. splice() + sendmsg() — 커널이 소스와 대상 페이지 매핑이 다른 "제자리" 작업을 잘못 수행하여 읽기 전용 파일의 페이지 캐시를 손상시킵니다

공격자는 (파일에 대한 쓰기 권한 없이) 페이지 캐시의 /usr/bin/su를 손상시킨 다음 실행하여 root 권한을 얻습니다.


클러스터의 취약점 확인

클러스터에 새 cve-2026-31431-test 네임스페이스를 만들고 test 디렉토리의 매니페스트를 적용하여 테스트 스크립트를 실행합니다:

root@kitploit:~
oc apply -f test

결과를 확인합니다:

root@kitploit:~
oc wait pod/cve-test -n cve-2026-31431-test \
  --for=jsonpath='{.status.phase}'=Succeeded --timeout=120s
oc -n cve-2026-31431-test logs -l app=cve-2026-31431-test

취약한 클러스터에서 다음과 같은 출력이 표시됩니다:

root@kitploit:~
=== CVE-2026-31431 Vulnerability Test ===
Target: /usr/bin/su

Original SHA256: 8969560ae8e6e21c6184c1451f59418822ee69dd5d946d71987b55236bbc0feb
Attempting splice + AF_ALG page-cache corruption (160 bytes in 40 chunks)...
After SHA256:    30b0f5b5a054c4df65b48ca792863bf7054b4d793f15f57163792ba6c2b151ae

PAGE CACHE CORRUPTION: YES - /usr/bin/su was modified in the page cache

Attempting to execute corrupted /usr/bin/su ...
  exit code: 0

RESULT: PARTIALLY MITIGATED
  Page-cache corruption succeeded (kernel is vulnerable)
  Privilege escalation blocked (allowPrivilegeEscalation=false)

4단계: 정리

root@kitploit:~
oc delete namespace cve-2026-31431-test

BPF LSM DaemonSet 배포

BPF LSM 접근 방식은 커널 수준에서 socket_bind를 후킹하고 템플릿 중첩에 관계없이 모든 AF_ALG AEAD 바인드를 차단합니다. 이는 OCP 배포를 위해 libbpf를 사용하여 C로 다시 작성된 block-copyfail을 기반으로 합니다.

사전 요구 사항

BPF LSM이 활성화되어 있어야 합니다. RHEL CoreOS 9.8(OCP 4.22)에는 기본적으로 활성화되어 있습니다. 다음으로 확인합니다:

root@kitploit:~
oc debug node/<any-node> -- chroot /host cat /sys/kernel/security/lsm

예상 출력에는 bpf가 포함됩니다:

root@kitploit:~
lockdown,capability,landlock,yama,selinux,bpf

bpf가 없는 경우 일회성 MachineConfig가 필요합니다(재부팅이 필요한 유일한 시나리오):

root@kitploit:~
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: worker
  name: 99-enable-bpf-lsm
spec:
  kernelArguments:
    - lsm=lockdown,capability,selinux,bpf

1단계: 네임스페이스 생성, SCC 부여, 배포

새 block-copyfail 네임스페이스를 만들고 SCC를 부여한 다음 daemonset.yaml 매니페스트를 적용하여 DaemonSet을 배포합니다. DaemonSet 파드가 생성되기 전에 privileged SCC가 부여되어야 합니다. 그렇지 않으면 SCC 검증 오류로 파드 생성이 실패합니다.

root@kitploit:~
oc apply -f daemonset.yaml

2단계: 모든 노드에서 파드가 시작될 때까지 대기

root@kitploit:~
oc get pods -n block-copyfail -o wide

예상: 노드당 하나의 파드, 모두 Running 상태:

root@kitploit:~
NAME                   READY   STATUS    AGE   NODE
block-copyfail-2jhzf   1/1     Running   34s   ci-...-master-2
block-copyfail-4dfq7   1/1     Running   34s   ci-...-master-1
block-copyfail-c2ts8   1/1     Running   34s   ci-...-worker-c
block-copyfail-ctblk   1/1     Running   34s   ci-...-worker-a
block-copyfail-m26sx   1/1     Running   34s   ci-...-worker-b
block-copyfail-xsh6d   1/1     Running   34s   ci-...-master-0

3단계: 차단기가 활성 상태인지 확인

root@kitploit:~
oc logs -n block-copyfail -l app=block-copyfail

예상:

root@kitploit:~
block-copyfail: blocker active — all AF_ALG AEAD binds blocked

배포 후 검증

취약점 확인 섹션의 동일한 취약점 테스트를 다시 실행합니다.

BPF LSM DaemonSet 배포 후 출력은 다음과 같습니다:

root@kitploit:~
=== CVE-2026-31431 Vulnerability Test ===
Target: /usr/bin/su

Original SHA256: 30b0f5b5a054c4df65b48ca792863bf7054b4d793f15f57163792ba6c2b151ae
Attempting splice + AF_ALG page-cache corruption (160 bytes in 40 chunks)...
  AF_ALG bind failed: [Errno 1] Operation not permitted

RESULT: CANNOT TEST - AF_ALG or splice not available/permitted

DaemonSet 로그에는 차단된 시도가 표시됩니다:

root@kitploit:~
oc logs -n block-copyfail -l app=block-copyfail
root@kitploit:~
block-copyfail: blocker active — all AF_ALG AEAD binds blocked
block-copyfail: BLOCKED pid=16777    comm=python3 time=2026-05-01 16:37:23

다른 알고리즘이 영향을 받지 않는지 확인

노드에서 verify-algos.py를 실행하여 모든 AEAD 알고리즘이 차단되는 동안 다른 AF_ALG 유형(해시, skcipher)이 계속 작동하는지 확인합니다:

root@kitploit:~
oc debug node/<any-node> -- chroot /host python3 -c "
import socket
tests = [
    ('aead',     'gcm(aes)'),
    ('aead',     'ccm(aes)'),
    ('aead',     'rfc4106(gcm(aes))'),
    ('hash',     'sha256'),
    ('skcipher', 'cbc(aes)'),
    ('aead',     'authencesn(hmac(sha256),cbc(aes))'),
]
for t, n in tests:
    s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
    try:
        s.bind((t, n))
        print(f'  ALLOWED  {t}/{n}')
    except OSError as e:
        print(f'  BLOCKED  {t}/{n} -- {e}')
    finally:
        s.close()
"

예상 출력:

root@kitploit:~
  BLOCKED  aead/gcm(aes) -- [Errno 1] Operation not permitted
  BLOCKED  aead/ccm(aes) -- [Errno 1] Operation not permitted
  BLOCKED  aead/rfc4106(gcm(aes)) -- [Errno 1] Operation not permitted
  ALLOWED  hash/sha256
  ALLOWED  skcipher/cbc(aes)
  BLOCKED  aead/authencesn(hmac(sha256),cbc(aes)) -- [Errno 1] Operation not permitted

이는 BPF LSM이 다른 AF_ALG 유형은 그대로 두면서 모든 AEAD 바인드를 차단함을 확인합니다.


소스에서 이미지 빌드

BPF LSM 차단기 소스는 block-copyfail/에 있습니다:

root@kitploit:~
block-copyfail/
  block_copyfail.bpf.c     # BPF 커널 프로그램 (LSM 후크)
  block_copyfail.c          # 사용자 공간 로더 (libbpf 스켈레톤)
  block_copyfail.h          # 공유 이벤트 구조체
  Makefile                  # 빌드 파이프라인
  Dockerfile                # 다단계 빌드
  daemonset.yaml            # 네임스페이스 + DaemonSet 매니페스트
  trigger-test.py           # 빠른 검증 스크립트

빌드 및 푸시:

root@kitploit:~
cd block-copyfail/
podman build -t quay.io/<org>/block-copyfail:latest .
podman push quay.io/<org>/block-copyfail:latest

Dockerfile은 다단계 빌드를 사용합니다: 컴파일을 위한 clang/bpftool/libbpf-devel이 포함된 Fedora, 런타임 이미지용 UBI 9 최소(~122 MB).


제거

DaemonSet을 삭제하면 모든 노드에서 완화 조치가 즉시 제거됩니다:

root@kitploit:~
oc delete -f daemonset.yaml
# 또는
oc delete namespace block-copyfail

BPF 프로그램은 로더 프로세스가 종료되면 자동으로 분리됩니다. 재부팅이나 파드 재시작이 필요 없습니다.

도구 다운로드