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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Copy-Fail-CVE-2026-31431-Kubernetes-PoC — PoC: CVE-2026-31431 페이지 캐시 손상 + 공유 이미지 레이어를 통한 Kubernetes에서 완전 비특권 컨테이너 이스케이프에서 노드 수준 코드 실행까지. Alibaba Cloud ACK, Amazon EKS 및 Google GKE에서 검증됨. | Kitploit
도구/GitHubGitHub/percivalll/copy-fail-cve-2026-31431-kubernetes-poc
Privilege EscalationVulnerability AnalysisExploitationCloud SecurityPapers & ResearchLearning & EducationContainer Escape
GitHubpercivalll/copy-fail-cve-2026-31431-kubernetes-poc

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Copy-Fail-CVE-2026-31431-Kubernetes-PoC

PoC: CVE-2026-31431 페이지 캐시 손상 + 공유 이미지 레이어를 통한 Kubernetes에서 완전 비특권 컨테이너 이스케이프에서 노드 수준 코드 실행까지. Alibaba Cloud ACK, Amazon EKS 및 Google GKE에서 검증됨.

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

Copy Fail (CVE-2026-31431) — Kubernetes 컨테이너 탈출 PoC

공유 컨테이너 이미지 레이어를 통해 CVE-2026-31431 리눅스 커널 페이지 캐시 손상 버그를 악용하여 완전히 권한이 없는 컨테이너가 Kubernetes에서 노드 수준 코드 실행을 달성할 수 있는 방법을 보여주는 개념 증명입니다.

핵심 공격 원리는 다음과 같습니다: 공격자가 제어하는 컨테이너와 이미지 레이어를 공유하는 모든 권한 있는 DaemonSet이 컨테이너 탈출에 무기화될 수 있습니다. 이 PoC는 kube-proxy를 구체적인 예로 사용하지만, 이 기술은 클러스터의 모든 권한 있는 워크로드에 일반화됩니다.

Alibaba Cloud ACK, Amazon EKS, Google GKE에서 검증됨 — 권한 없는 파드가 권한 있는 kube-proxy DaemonSet을 통해 호스트 파일 시스템에 [*] success를 기록합니다:

Alibaba Cloud ACK (커널 6.6.88)Amazon EKS (커널 6.12.79)Google GKE (커널 6.12.68)
ACKEKSGKE

면책 조항: 이 저장소는 교육 및 방어 목적으로만 게시됩니다. 귀하가 소유하거나 테스트할 명시적 권한이 있는 시스템에서만 사용하십시오.

배경

CVE-2026-31431 ("Copy Fail")은 페이지 캐시 Copy-on-Write(CoW) 경로의 리눅스 커널 취약점입니다. AF_ALG splice 경합 조건을 통해 권한 없는 프로세스가 읽기 전용 파일의 페이지 캐시 페이지를 손상시킬 수 있습니다. 손상은 커널 페이지 캐시에 지속되며 이후 그 파일을 읽거나 실행하는 모든 프로세스(다른 컨테이너나 호스트의 프로세스 포함)에서 볼 수 있습니다.

원래 취약점에 대한 자세한 내용은 copy.fail을 참조하세요.

공격 원리

이 공격은 Kubernetes 클러스터에서 일반적으로 공존하는 세 가지 속성을 악용합니다:

  1. 커널 페이지 캐시 손상 (CVE-2026-31431) — 권한 없는 프로세스가 읽기 전용으로 열 수 있는 모든 파일의 메모리 내 캐시된 페이지를 덮어쓸 수 있습니다.
  2. 이미지 레이어 공유 — 컨테이너 런타임(containerd, CRI-O)은 오버레이 파일 시스템을 사용하며, 동일한 이미지 레이어가 여러 컨테이너에서 동일한 페이지 캐시 페이지에 매핑됩니다.
  3. 권한 있는 DaemonSet — 많은 클러스터가 상승된 권한(privileged: true, hostNetwork: true, 광범위한 capabilities 등)으로 DaemonSet을 실행하며, 이들은 주기적으로 이미지에서 바이너리를 실행합니다.

이러한 조건이 일치하면, 권한 없는 파드가 공유 이미지 레이어의 바이너리를 손상시킬 수 있고, 동일한 노드의 권한 있는 DaemonSet이 손상된 바이너리를 상승된 권한으로 알지 못한 채 실행하여 완전한 노드 수준 코드 실행을 달성합니다.

취약점 대상은 kube-proxy에 국한되지 않습니다. 공격자가 제어하는 이미지와 이미지 레이어를 공유하는 모든 권한 있는 DaemonSet(모니터링 에이전트, CNI 플러그인, 로그 수집기, 보안 에이전트 등)이 실행 가능한 대상입니다.

작동 방식

공격 체인은 세 단계로 구성됩니다: 페이지 캐시 손상, 컨테이너 간 전파, 권한 있는 실행.

1. AF_ALG Splice 경합 조건을 통한 페이지 캐시 손상

커널의 AF_ALG(암호화) 서브시스템은 사용자 공간 암호화 작업을 위한 소켓 기반 인터페이스를 제공합니다. 익스플로잇은 커널이 파일에서 AF_ALG 소켓으로 splice()를 처리하는 방식의 경합 조건을 남용합니다:

  1. 대상 바이너리를 읽기 전용으로 엽니다.
  2. authencesn(hmac(sha256),cbc(aes))에 바인딩된 AF_ALG AEAD 소켓을 생성합니다.
  3. MSG_MORE 플래그와 함께 AF_ALG 소켓을 통해 작은 페이로드 청크를 전송하여 커널에 더 많은 데이터가 올 것임을 알립니다.
  4. 대상 파일의 내용을 fd → 파이프 → AF_ALG 소켓으로 splice()합니다.
  5. CoW 버그로 인해 커널은 공격자의 페이로드 바이트를 적절히 격리하는 대신 대상 파일의 페이지 캐시 페이지에 기록합니다.

익스플로잇은 전체 대상 바이너리의 캐시된 페이지가 사용자 정의 페이로드로 덮어쓰여질 때까지 각 4바이트 윈도우에 대해 이 과정을 반복합니다.

파일에 대한 쓰기 권한은 필요하지 않습니다. 디스크의 파일은 변경되지 않으며, 메모리 내 페이지 캐시만 손상됩니다.

2. 이미지 레이어 공유를 통한 컨테이너 간 전파

컨테이너 런타임은 오버레이 파일 시스템을 사용합니다. 두 컨테이너가 동일한 이미지 레이어를 공유할 때, 커널은 동일한 페이지 캐시 페이지에서 파일 읽기를 제공합니다.

공격자는 대상 권한 있는 DaemonSet과 동일한 기본 이미지를 FROM하여 PoC 이미지를 빌드합니다. 두 컨테이너가 동일한 오버레이 하위 디렉터리를 공유하기 때문에 공유 레이어의 바이너리는 동일한 페이지 캐시 페이지에 매핑됩니다.

권한 없는 PoC 컨테이너가 바이너리의 페이지 캐시를 손상시키면, 손상은 즉시 동일한 노드의 권한 있는 컨테이너에 표시됩니다 — 컨테이너 간 통신은 전혀 없습니다.

3. 대상 DaemonSet에 의한 권한 있는 실행

권한 있는 DaemonSet이 다음에 손상된 바이너리를 실행할 때(정상 작동 주기를 통해), 커널은 손상된 페이지 캐시 페이지를 로드합니다. 공격자의 페이로드는 DaemonSet의 전체 권한으로 실행되며, 여기에는 다음이 포함될 수 있습니다:

  • 노드에서 완전한 루트
  • 모든 capabilities
  • 호스트 네임스페이스(네트워크, PID, 마운트)에 대한 액세스

이 PoC의 페이로드(payload/payload.c)는 단순히 호스트 루트 파일 시스템을 마운트하고 노드 수준 코드 실행의 증명으로 마커 파일을 /root/res에 기록합니다.

공격 흐름도

root@kitploit:~
┌──────────────────────────┐     ┌──────────────────────────┐
│   PoC 컨테이너            │     │   권한 있는 DaemonSet     │
│   (권한 없음)              │     │   (예: kube-proxy,       │
│                          │     │    모니터링 에이전트 등)   │
│  1. 대상 바이너리 열기    │     │                          │
│     (읽기 전용)           │     │                          │
│                          │     │                          │
│  2. AF_ALG splice 경합   │     │                          │
│     조건으로 페이지 캐시  │     │                          │
│     손상                 │     │                          │
│          │               │     │                          │
└──────────┼───────────────┘     └──────────────────────────┘
           │                                  │
           ▼                                  │
  ┌─────────────────────┐                     │
  │  커널 페이지 캐시    │                     │
  │                      │◄────────────────────┘
  │  공유 레이어 바이너리 │     3. DaemonSet이 손상된
  │  (손상됨)             │        바이너리 실행
  │  공격자의 페이로드    │        → 손상된 페이지 로드
  │  바이트 포함         │        → 페이로드가 DaemonSet의
  └─────────────────────┘           권한으로 실행됨

검증된 클라우드 환경

PoC는 다음 관리형 Kubernetes 플랫폼에서 성공적으로 검증되었습니다:

Alibaba Cloud ACK

ACK PoC 결과

Amazon EKS

EKS PoC 결과

Google GKE

GKE PoC 결과

세 경우 모두, 권한 없는 PoC 파드가 호스트 파일 시스템에 [*] success 마커 파일을 성공적으로 기록했습니다 — 이는 권한 있는 kube-proxy DaemonSet을 통한 노드 수준 코드 실행을 증명합니다.

전체 워크스루(이미지 레이어 분석, 빌드 단계, 배포)는 다음을 참조하세요:

  • EKS: docs/eks-poc.md
  • GKE: docs/gke-poc.md

구체적인 예: kube-proxy

이 PoC는 가장 일반적인 권한 있는 DaemonSet 중 하나인 kube-proxy를 대상으로 사용합니다. 세 가지 변형이 제공됩니다:

  • 기본 (ACK / 업스트림): FROM registry.k8s.io/kube-proxy:v1.35.2로 빌드됨 (Dockerfile 참조)
  • EKS: FROM public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023로 빌드됨 (Dockerfile.eks 참조)
  • GKE: FROM us-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000로 빌드됨 (Dockerfile.gke 참조)

모든 변형은 /usr/sbin/ipset, /usr/sbin/nft, /usr/sbin/xtables-legacy-multi, /usr/sbin/xtables-nft-multi와 같은 바이너리를 손상시킵니다.

중요한 주의 사항:

  • kube-proxy는 ipvs 모드로 구성된 경우에만 ipset을 호출합니다. 기본 모드(iptables)는 ipset을 사용하지 않습니다. ipvs 폐기 계획은 kubernetes/enhancements#5495를 참조하세요.
  • 일부 관리형 Kubernetes 배포판(예: 특정 클라우드 제공업체)은 kube-proxy를 권한 없는 컨테이너로 실행하여 탈출의 영향을 제한합니다.
  • PoC는 여러 바이너리(ipset, nft, xtables-legacy-multi, xtables-nft-multi)를 대상으로 하여 다양한 프록시 모드를 포괄하지만, 호출 여부는 클러스터 구성에 따라 다릅니다.

클러스터에서 kube-proxy가 권한이 없는 경우에도 공격 원리는 여전히 유효합니다 — 빌드할 수 있는 기본 이미지와 이미지 레이어를 공유하는 다른 권한 있는 DaemonSet을 식별하기만 하면 됩니다.

다른 대상으로 일반화

이 PoC를 다른 권한 있는 DaemonSet에 적용하려면:

  1. 클러스터에서 실행 중인 권한 있는 DaemonSet(모니터링 에이전트, CNI 플러그인, 로그 수집기 등)을 식별합니다.
  2. 해당 DaemonSet이 사용하는 동일한 기본 이미지를 FROM하여 PoC 이미지를 빌드합니다.
  3. DaemonSet이 정상 작동 중 실행할 공유 레이어의 바이너리를 식별합니다.
  4. 익스플로잇을 사용하여 해당 바이너리의 페이지 캐시를 손상시킵니다.

저장소 구조

root@kitploit:~
.
├── cmd/copyfail/main.go          # 진입점; 컴파일된 페이로드 포함
├── internal/
│   ├── exploit/
│   │   ├── exploit.go            # 핵심 익스플로잇: AF_ALG splice 경합 조건 루프
│   │   └── patch.go              # 페이로드를 4바이트 패치 윈도우로 분할
│   └── alg/
│       └── alg.go                # AF_ALG AEAD 소켓 추상화
├── payload/
│   ├── payload.c                 # ACK/업스트림 페이로드 (/dev/vda3 ext4 마운트)
│   ├── payload-eks.c             # EKS 페이로드 (NVMe/Xen 장치 자동 감지)
│   ├── payload-gke.c             # GKE 페이로드 (COS/Ubuntu 장치 자동 감지)
│   └── nolibc/                   # 커널의 작은 libc, 정적 종속성 없는 페이로드용
├── deploy/
│   ├── poc.yaml                  # Kubernetes Deployment 매니페스트 (ACK/업스트림)
│   ├── poc-eks.yaml              # EKS Deployment 매니페스트
│   └── poc-gke.yaml              # GKE Deployment 매니페스트
├── Dockerfile                    # ACK/업스트림: FROM registry.k8s.io/kube-proxy
├── Dockerfile.eks                # EKS: FROM eks-distro-minimal-base-iptables
├── Dockerfile.gke                # GKE: FROM gke-release/kube-proxy
├── Makefile                      # 빌드 오케스트레이션 (*-eks 및 *-gke 대상 포함)
└── docs/
    ├── eks-poc.md                # EKS PoC 전체 워크스루
    ├── gke-poc.md                # GKE PoC 전체 워크스루
    ├── ack-poc-res.png           # ACK 검증 스크린샷
    ├── eks-poc-res.png           # EKS 검증 스크린샷
    └── gke-poc-res.png           # GKE 검증 스크린샷

전제 조건

  • Go 1.25+
  • nolibc 페이로드용 크로스 컴파일러 (기본값: x86_64-linux-gnu-gcc)
  • Docker / Buildx
  • PoC 이미지와 이미지 레이어를 공유하는 권한 있는 DaemonSet이 있는 Kubernetes 클러스터 (기본 예제는 kube-proxy 대상)
  • 대상 DaemonSet의 imagePullPolicy: IfNotPresent (Kubernetes 기본값)
  • CVE-2026-31431 수정 이전의 리눅스 커널

빌드

ACK / 업스트림 Kubernetes

root@kitploit:~
# 페이로드 + Go 바이너리 빌드
make build

# Docker 이미지 빌드
make docker-build

# GHCR에 빌드 및 푸시
make docker-push IMAGE=ghcr.io/<you>/copy-fail-poc TAG=latest

Amazon EKS

root@kitploit:~
# EKS 페이로드 + Go 바이너리 + Docker 이미지 빌드
make docker-build-eks

# GHCR에 빌드 및 푸시
make docker-push-eks IMAGE=ghcr.io/<you>/copy-fail-poc

arm64 대상(Graviton)의 경우:

root@kitploit:~
make build-eks CC=aarch64-linux-gnu-gcc GOARCH=arm64

Google GKE

root@kitploit:~
# GKE 페이로드 + Go 바이너리 + Docker 이미지 빌드
make docker-build-gke

# GHCR에 빌드 및 푸시
make docker-push-gke IMAGE=ghcr.io/<you>/copy-fail-poc

arm64 노드의 경우:

root@kitploit:~
make docker-build-gke CC=aarch64-linux-gnu-gcc GOARCH=arm64 PLATFORM=linux/arm64

사용법

PoC 배포

root@kitploit:~
# ACK / 업스트림 Kubernetes
kubectl apply -f deploy/poc.yaml

# Amazon EKS
kubectl apply -f deploy/poc-eks.yaml

# Google GKE
kubectl apply -f deploy/poc-gke.yaml

Deployment는 하나의 권한 없는 파드를 생성합니다. 다음을 수행합니다:

  1. /bin/copyfail을 실행하여 공유 이미지 레이어의 대상 바이너리 페이지 캐시를 손상시킵니다.
  2. 파드가 관찰을 위해 계속 실행되도록 무기한 대기합니다.

탈출 확인

대상 권한 있는 DaemonSet이 다음에 손상된 바이너리를 실행한 후(kube-proxy의 경우 일반적으로 조정 루프로 인해 몇 초 내에 발생), 노드를 확인합니다:

root@kitploit:~
# SSH로 노드에 접속하거나 권한 있는 디버그 파드 사용

# ACK / EKS (쓰기 가능한 루트 파일 시스템)
cat /root/res
# 예상 출력: [*] success

# GKE COS 노드 (읽기 전용 루트, 쓰기 가능한 상태 파티션)
cat /mnt/stateful_partition/copyfail-res
# 예상 출력: [*] success

호스트 파일 시스템에 마커 파일이 존재한다는 것은 공격자가 제공한 코드가 노드 수준 권한으로 실행되었음을 증명합니다 — 권한 있는 DaemonSet의 컨테이너 컨텍스트 내에서.

정리

root@kitploit:~
kubectl delete -f deploy/poc.yaml      # 또는 poc-eks.yaml / poc-gke.yaml

# 영향을 받은 노드에서 마커 제거 및 대상 DaemonSet 재시작:
rm -f /root/res                                     # ACK / EKS
rm -f /copyfail-res /mnt/stateful_partition/copyfail-res  # GKE COS 노드
# kube-proxy의 경우: 파드를 삭제하여 이미지 레이어 재읽기 강제
kubectl delete pod -n kube-system -l k8s-app=kube-proxy --field-selector spec.nodeName=<node>

페이로드 사용자 정의

기본 페이로드(payload/payload.c)는 마커 파일을 기록하는 검증 전용 프로그램입니다. 사용자 정의 페이로드를 빌드하려면:

  1. payload/payload.c를 편집합니다. 이 프로그램은 정적이고 종속성 없는 바이너리를 위해 nolibc(커널의 최소 C 라이브러리)에 대해 빌드됩니다.
  2. make payload를 실행하여 크로스 컴파일합니다.
  3. 컴파일된 페이로드는 //go:embed를 통해 Go 바이너리에 포함됩니다.

영향을 받는 버전

  • 리눅스 커널: CVE-2026-31431 패치 이전의 모든 버전.
  • Kubernetes: 패치되지 않은 노드 커널을 사용하는 모든 버전. 취약점은 커널 자체에 있으며 Kubernetes에는 없습니다. Kubernetes는 단지 실행 컨텍스트(공유 이미지 레이어 + 권한 있는 DaemonSet)를 제공하여 로컬 페이지 캐시 손상에서 완전한 컨테이너 탈출로 영향력을 상승시킵니다.

완화

  • 커널 패치. 이것이 결정적인 수정입니다.
  • 이미지 레이어 격리 활성화. 일부 런타임은 페이지 캐시 공유를 방지하는 컨테이너별 파일 시스템 스냅샷을 지원합니다.
  • 권한 있는 DaemonSet 최소화. 상승된 권한으로 실행되는 워크로드 수를 줄이고 최소 권한 원칙을 사용하세요.
  • privileged: true가 엄격히 필요하지 않은 DaemonSet에서 불필요한 capabilities 제거.
  • 신뢰할 수 없는 워크로드가 기본 이미지를 공유하는 권한 있는 DaemonSet이 실행되는 노드에 스케줄링되지 않도록 제한.
  • 권한 있는 워크로드에 대해 별도의 기본 이미지를 사용하여 신뢰할 수 없는 컨테이너와의 레이어 공유 가능성을 줄입니다.

완화 예시

  • vArmor 내장 완화 규칙: copy-fail-mitigation은 컨테이너가 AF_ALG 소켓을 생성하지 못하도록 하여 익스플로잇 벡터를 차단합니다. 이 규칙은 AppArmor 및 BPF 강제자를 통해 사용할 수 있습니다.
  • Kubernetes eBPF 완화: iwanhae/copyfail-ebpf-k8s는 CVE-2026-31431에 대한 eBPF 기반 Kubernetes 완화 예제를 제공합니다.

크레딧

  • CVE-2026-31431 발견 및 공개: Theori / Xint
  • 크로스 플랫폼 C 페이로드: Tony Gies (LGPL-2.1-or-later OR MIT)
  • nolibc: 리눅스 커널 selftests (tools/include/nolibc/)

라이선스

이 저장소의 Go 익스플로잇 코드는 연구 목적으로 있는 그대로 제공됩니다.

페이로드(payload/payload.c)는 copy-fail-c에서 파생되었으며 LGPL-2.1-or-later OR MIT로 이중 라이선스됩니다. LICENSE-LGPL 및 LICENSE-MIT를 참조하세요.

도구 다운로드
속성값
플랫폼Alibaba Cloud Container Service for Kubernetes (ACK)
Kubernetesv1.35.2
노드 커널6.6.88-4.2.alnx4.x86_64
kube-proxyregistry-cn-*.ack.aliyuncs.com/acs/kube-proxy:v1.35.2-aliyun.1
기본 이미지registry.k8s.io/kube-proxy:v1.35.2 (업스트림)
루트 장치/dev/vda3 (ext4)
속성값
플랫폼Amazon Elastic Kubernetes Service (EKS)
Kubernetesv1.35.4
노드 커널6.12.79-101.147.amzn2023.x86_64
kube-proxy***.dkr.ecr.***.amazonaws.com.cn/eks/kube-proxy:v1.35.3-eksbuild.2
기본 이미지public.ecr.aws/eks-distro-build-tooling/eks-distro-minimal-base-iptables:2026-03-11-1773190710.2023
루트 장치/dev/nvme0n1p1 (xfs)
속성값
플랫폼Google Kubernetes Engine (GKE)
Kubernetesv1.35.3-gke.1234000
노드 OSContainer-Optimized OS (COS) 125, BUILD_ID 19216.220.72
노드 커널6.12.68+ x86_64
kube-proxyus-central1-artifactregistry.gcr.io/gke-release/gke-release/kube-proxy:v1.35.3-gke.1234000
기본 이미지kube-proxy와 동일 (GKE 제공업체 관리 Artifact Registry 이미지)
루트 장치/dev/dm-0 (ext2, 읽기 전용); /dev/sda1 (ext4, 쓰기 가능한 상태 파티션)
마커 경로/mnt/stateful_partition/copyfail-res