IL-0053 Wiz · 2025-03-24 (게시일)kubernetessecurity
Wiz Research는 Ingress NGINX Controller에서 인증 없이 원격 코드를 실행할 수 있는 취약점 CVE-2025-1097, CVE-2025-1098, CVE-2025-24514, CVE-2025-1974를 찾았다. Wiz 분석으로는 클라우드 환경의 약 43%가 영향을 받았고, 인터넷에 노출된 클러스터 가운데 41% 넘는 곳이 ingress-nginx를 쓰고 있었다. 어드미션 컨트롤러는 기본으로 인증 없이 네트워크로 접근할 수 있고, 클러스터 전체 Secret을 읽을 수 있는 쿠버네티스 역할로 돈다.
어드미션 컨트롤러는 AdmissionReview 요청이 오면 템플릿과 Ingress 객체로 임시 NGINX 설정을 만들고 nginx -t로 검사한다. Wiz는 여기서 설정 지시어를 끼워 넣을 길을 세 가지 찾았다. CVE-2025-24514는 auth-url 어노테이션 값이 걸러지지 않고 설정에 들어가는 문제였고, 어노테이션을 정규식으로 검사하는 v1.12.0에는 해당하지 않는다. CVE-2025-1097은 auth-tls-match-cn 어노테이션의 검사를 우회하는 문제였다. 이 값이 설정에 들어가려면 auth-tls-secret 어노테이션에 클러스터 안의 TLS Secret 이름이 필요한데, ingress-nginx 서비스 계정은 모든 Secret에 접근할 수 있어서 어느 네임스페이스의 Secret이든 쓸 수 있었다. CVE-2025-1098은 어노테이션이 아닌 Ingress 객체의 UID가 mirror 설정에 그대로 들어가는 문제였다.
CVE-2025-1974는 주입한 설정으로 코드를 실행하는 단계다. 코드 실행에는 설정 앞부분에서만 쓸 수 있는 load_module 대신 ssl_engine 지시어를 썼다. ssl_engine은 설정 어디서나 쓸 수 있고 공유 라이브러리를 읽어 들인다. 라이브러리 파일을 올리려고 같은 파드에서 도는 NGINX에 8KB가 넘는 요청 본문을 보냈고, NGINX는 이 본문을 임시 파일로 저장했다. NGINX는 이 파일을 곧바로 지우지만, Content-Length를 실제보다 크게 보내 연결을 붙잡아 두면 ProcFS의 파일 디스크립터로 계속 접근할 수 있다. PID와 파일 디스크립터 번호를 몇 번 추측해 이 경로를 ssl_engine에 넘기면 nginx -t가 라이브러리를 읽으면서 코드가 실행된다. 공격자는 컨트롤러 파드의 높은 권한을 얻어 모든 Secret을 읽고 클러스터를 장악할 수 있다.
운영 중 장애로 드러난 증상은 없다. 이 사례는 Wiz Research가 Ingress NGINX Controller의 어드미션 컨트롤러 코드를 검토하다 찾은 취약점들이고, 이 취약점들을 묶어 IngressNightmare라고 부른다. CVSS v3.1 기본 점수는 9.8이다.
공격은 클러스터 파드 네트워크에 닿을 수 있는 곳에서 어드미션 컨트롤러로 조작한 AdmissionReview 요청을 직접 보내는 데서 시작한다. 정상이라면 이 요청은 쿠버네티스 API 서버만 보낸다. Wiz는 이 어드미션 컨트롤러를 인터넷에 그대로 노출한 클러스터를 6,500개 넘게 찾았다. 자기 클러스터가 ingress-nginx를 쓰는지는 kubectl get pods --all-namespaces --selector app.kubernetes.io/name=ingress-nginx 로 확인할 수 있다.
증상 ? 무단 접근과 낯선 워크로드
Wiz Research가 어드미션 컨트롤러 코드를 검토하다 찾았다. 2024년 12월 31일 CVE-2025-1974와 CVE-2025-24514를 쿠버네티스에 보고했고, 2025년 1월 2일 CVE-2025-1097을, 1월 21일 CVE-2025-1098을 보고했다. 일반 공개는 2025년 3월 24일이었다.
–
Ingress NGINX Controller를 최신 버전으로 올리고, 어드미션 웹훅 엔드포인트를 외부에 노출하지 않는다. 바로 올릴 수 없다면 네트워크 정책으로 쿠버네티스 API 서버만 어드미션 컨트롤러에 닿게 하거나 어드미션 컨트롤러를 잠시 끈다. Helm으로 설치했다면 controller.admissionWebhooks.enabled=false 로 다시 설치하고, 직접 설치했다면 ingress-nginx-admission ValidatingWebhookConfiguration을 지우고 컨트롤러의 --validating-webhook 인자를 뺀다. 업그레이드한 뒤에는 어드미션 컨트롤러를 다시 켠다.
어드미션 컨트롤러는 흔히 놓치는 공격 지점이다. 인증 없이 도는 웹 서버이면서 권한이 높고, 클러스터 안 어느 파드에서나 닿는다. 공격자가 컨테이너 탈출이나 SSRF로 파드 네트워크에 들어오는 일은 생각보다 쉽다. Wiz는 최소 권한 설계가 없어 공격이 클러스터 장악까지 이어졌다고 지적했다. 걸러지지 않은 사용자 입력을 nginx -t로 검사하는 것 자체도 위험하다고 봤다. 2025년 11월 갱신된 글에 따르면 ingress-nginx는 2026년 3월에 유지보수를 끝내고 지원을 종료한다. 그러니 Gateway API나 다른 인그레스 컨트롤러로 옮겨야 한다.
같은 원인 · 공통 인그레스 컨트롤러
같은 원인 · 공통 인그레스 컨트롤러
같은 원인 · 공통 어드미션 웹훅
같은 원인 · 공통 인그레스 컨트롤러
같은 원인 · 공통 인그레스 컨트롤러
같은 원인 · 공통 인그레스 컨트롤러