
IngressNightmare 취약점 (CVE-2025-1974)에 대한 내 견해
이 저장소는 IngressNightmare 취약점에 대한 제 연구입니다. 취약한 Ingress 배포 파일, 익스플로잇 자체, 공유 객체 페이로드를 포함하고 있습니다.
CVE 인덱스 목록:
auth-url 어노테이션 주입auth-tls-match-cn 어노테이션 주입몇 가지 참고 자료:
이 취약점의 근본 원인은 적절한 입력 검증(sanitization)이 부족하기 때문입니다. AdmissionReview 요청을 보내면 임시 NGINX 구성이 생성되고, 이후 nginx -t 명령어로 유효성이 검사됩니다. 버그가 완화된 소스 코드를 참조하세요.
테스트되는 구성의 내용을 제어할 수 있게 되면 다양한 구성 필드를 활용하여 잘못된 구성을 주입할 수 있습니다:
auth-url - 적절한 검증 없이 전달되어 #와 \n을 추가할 수 있습니다. 이 주입 지점을 사용할 것입니다.auth-tls-match-cn - 필드가 CN=로 시작하고 유효한 정규식이어야 한다는 조건만 있습니다.ing.UID - UID가 그대로 구성에 포함됩니다.NGINX 구성이 테스트만 된다는 사실은 사용할 수 있는 지시어의 수를 약간 줄입니다. 남아 있는 지시어 중 하나는 ssl_engine으로, 공유 라이브러리를 로드할 수 있게 해줍니다. 좋은 진입점입니다. 하지만 어떻게 우리의 .so 파일을 파드 파일시스템에 넣을 수 있을까요?
WIZ의 똑똑한 사람들은 우리의 .so 객체를 본문으로 하여 요청을 보내면, 그것이 충분히 크면 NGINX가 procfs에 파일로 저장한다는 아이디어를 생각해냈습니다! 또한 Content-Length를 조정하여 NGINX가 더 많은 데이터를 기다리게 하여 파일을 procfs에 잠시 유지시킬 수 있습니다. 실제 PID와 FD 번호는 추측됩니다.
자세한 내용은 WIZ 연구팀의 원본 분석 기사를 읽어보세요.
익스플로잇 코드는 꽤 자명합니다. 그러니 소스를 확인하세요.
저장소를 클론합니다:
git clone https://github.com/I3r1h0n/IngressNightterror
cd IngressNightterror
Docker k3s 이미지를 시작합니다:
cd stand
docker compose up -d
NGINX Ingress를 배포합니다:
Linux/Mac을 사용하는 경우 스크립트를 사용하여 배포할 수 있습니다:
./k8s/setup.sh
Windows를 사용하거나 배포 과정을 더 세밀하게 제어하려면 수동으로 수행하십시오:
NGINX Ingress 배포:
kubectl --kubeconfig=./output/kubeconfig.yaml apply -f ./k8s/ingress.yaml
이제 ./output에 제공된 config로 kubectl을 사용할 수 있습니다. 네임스페이스 ingress-nginx를 사용하는 것을 잊지 마세요.
중요 참고 사항: ingress.yaml은 취약한 NGINX Ingress를 기반으로 만들어졌습니다.
페이로드는 간단한 리버스 프록시입니다. 빌드하기 전에 포트와 IP 주소를 편집하는 것을 잊지 마세요:
make all
Docker 컨테이너 gcc:latest를 사용하여 공유 객체를 빌드합니다.
취약점을 최초로 발견한 WIZ 연구팀과 NGINX Ingress 메인테이너에게 큰 존경을 표합니다.
제작: I3r1h0n.