Mayıs 2025, bulut yerel altyapılarında yaygın olarak kullanılan Kubernetes ingress-nginx denetleyicisini etkileyen ve IngressNightmare olarak adlandırılan CVE-2025-1974 adlı kritik bir güvenlik açığının kamuya açıklanmasına işaret etti. Bu güvenlik açığı, kimliği doğrulanmamış saldırganların NGINX'e keyfi yapılandırmalar enjekte etmesine olanak tanıyarak yetkisiz RCE'ye (uzaktan kod yürütme) ve kümenin tamamen ele geçirilmesine yol açabilir.
OPSWAT Burs programının bir parçası olarak, bursiyerlerimiz bu yüksek önem derecesine sahip sorunun temel nedenini, istismar yolunu ve hafifletme stratejilerini daha iyi anlamak için derinlemesine bir teknik analiz gerçekleştirdiler.
CVE-2025-1974'e Genel Bakış
CVE-2025-1974, 1.11.4 ve özellikle 1.12.0'a kadar olan ingress-nginx sürümlerinde tespit edilen kritik bir şablon enjeksiyonu güvenlik açığıdır. Bir Kubernetes kümesine düğüm düzeyinde erişimi olan saldırganlar, varsayılan olarak küme içindeki kritik sırlara erişim de dahil olmak üzere kapsamlı ayrıcalıklara sahip olan ingress-nginx denetleyicisi aracılığıyla RCE kullanarak rastgele kod çalıştırmak için bu kusurdan yararlanabilir.
Kubernetes Güvenlik Müdahale Komitesi bu güvenlik açığına 9.8 (kritik önem derecesi) CVSS v3.1 puanı vermiştir:
Bu Analizdeki Temel Bileşenler
Kubernetes'e Genel Bakış
Kubernetes (K8s), konteynerli uygulamaların dağıtımını, ölçeklendirilmesini ve operasyonel yönetimini otomatikleştirmek için kullanılan açık kaynaklı bir platformdur. Kubernetes kümeleri tipik olarak hem fiziksel donanım hem de sanal makineler içerebilen ve yüksek oranda kullanılabilir, ölçeklenebilir ve yönetilebilir uygulama ortamları sağlamak için birlikte çalışan birden fazla makineden oluşur.
NGINX Giriş Denetleyicisi
NGINX giriş denetleyicisi (ingress-nginx), NGINX web sunucusunun üzerine inşa edilmiş açık kaynaklı bir giriş denetleyicisidir. Bir Kubernetes kümesi içinde çalışır ve öncelikle bir ters proxy ve yük dengeleyici olarak işlev görür. Bu denetleyici, kullanıcılar tarafından tanımlanan Ingress kaynaklarını yorumlar ve trafik akışını kümeye ve küme içine yönlendirmek için bunları eyleme geçirilebilir NGINX yapılandırmalarına dönüştürür.
Kabul İncelemesi ve Rolü
Ingress-nginx, AdmissionReview adlı bir web kancası hizmeti kullanarak Kubernetes ile entegre olur. Bu hizmet, yerel Kubernetes Ingress nesnelerini işlemek ve bunları doğrulanmış ve sözdizimsel olarak doğru NGINX yapılandırmalarına çevirmek için çok önemlidir. AdmissionReview yapılandırma doğruluğunu sağlarken, ingress-nginx denetleyicisinden bağımsız olarak çalışır ve genellikle sıkı kimlik doğrulama kontrollerinden yoksundur. Bu sıkı kimlik doğrulama eksikliği, CVE-2025-1974'ün istismar edilebilirliğine katkıda bulunan önemli bir faktördür.
Güvenlik Açığı İstismarı ve Teknik Analiz
İstismar Mekanizması
CVE-2025-1974'ün istismarı özünde kötü niyetli bir istekle başlar. Saldırganlar, AdmissionReview web kancasına kötü niyetli bir istek göndererek NGINX'i çalışma zamanında paylaşılan bir kütüphaneyi dinamik olarak yüklemeye zorlar. Bu mekanizmaya dayanarak, arkadaşlarımız bu istismar yolunu anlamak için hem AdmissionReview webhook'unu hem de NGINX iş akışını analiz etti.
Şablon Enjeksiyonu Güvenlik Açığı
AdmissionReview web kancasında, gelen istekler işlenirken CheckIngress işlevi Kubernetes Ingress Objects'i geçerli NGINX yapılandırma dosyalarına dönüştürür. Akış aşağıdaki gibi ilerler:
- Her yapılandırma ayrıştırılır ve önceden tanımlanmış NGINX şablonlarına göre biçimlendirilmek üzere generateTemplate 'e aktarılır.
- Daha sonra, testTemplate oluşturulan yapılandırmayı temel NGINX ikili dosyasına karşı doğrular.
Tüm NGINX yapılandırmaları, ingress-nginx kaynak kodu içindeki nginx.tmpl dosyasında bulunan önceden tanımlanmış şablonlara dayanmaktadır:
generateTemplate işlevi içinde, yapılandırma aşağıdaki kod parçasında gösterildiği gibi işlenir:
Ancak girdi doğrulama ve sanitizasyon yetersizdir. Özellikle, bir Ingress Nesnesinden gelen uid alanı doğrudan NGINX yapılandırma şablonuna eklenir ve bir enjeksiyon noktası oluşturur. Bir saldırgan, uid="1234#;\n\n}\n}\n}\n injection_value" gibi hazırlanmış bir girdi sağlayarak bu durumdan yararlanabilir.
Bu kötü amaçlı girdi, NGINX şablonuna global kapsam enjeksiyonuna izin vererek saldırganların keyfi NGINX yönergelerini tetiklemesine ve potansiyel olarak RCE elde etmesine olanak tanır.
Şablon Enjeksiyonundan Uzak Kod Çalıştırmaya
testTemplate() Fonksiyonunun Açıklaması
NGINX yapılandırması generateTemplate fonksiyonu tarafından oluşturulduktan sonra, testTemplate fonksiyonu geçici bir yapılandırma dosyası oluşturur ve NGINX kütüphanesini nginx -c {config_file} komutuyla çalıştırır. -t. Bu, NGINX ikilisini yapılandırmayı ayrıştırmaya ve doğrulamaya zorlar.
Güvenlik açığından faydalanmak için, bir saldırganın kötü amaçlı kod çalıştırabilecek bir yönerge belirlemesi gerekir. Başlangıçta, arkadaşlarımız load_module yönergesini potansiyel olarak yararlı olarak tanımladılar, çünkü bu yönerge NGINX'in harici eklentileri yüklemesine izin veriyor. Ancak, bu yönergeye yalnızca yapılandırma ayrıştırmasının ilk aşamasında izin verilir, bu da enjeksiyon noktamızla eşleşmez.
Bu zorluğu çözmek için araştırmaya devam ettik ve "Modül, yapılandırma testi sırasında OpenSSL tarafından dinamik olarak yüklenebilir." şeklinde tanımlanan ssl_engine yönergesine ulaştık. Bu, modülleri dinamik olarak yükleyebilme özelliği nedeniyle merak uyandırdı ve daha derin bir inceleme gerektirdi.
ssl_engine Yönergesini Anlama
NGINX'in ssl_engine yönergesini nasıl ele aldığını daha iyi anlamak ve NGINX'in bu yönerge aracılığıyla ek modüllerin dinamik olarak yüklenmesine hangi koşullarda izin verdiğini belirlemek için NGINX kaynak kodunu inceledik.
Başlangıçta NGINX ilk durumunu yükler, ardından yapılandırma dosyalarını satır satır ayrıştırır. Her yönerge nginx_command_t yapısı tarafından ele alınır, ssl_engine yönergesi doğrudan ngx_openssl_commands'ı çağırır.
ngx_openssl_commands işlevini analiz eden arkadaşlarımız, bu işlevin OpenSSL desteğine, özellikle de donanım hızlandırmalı SSL modülleri için kullanılan ENGINE_by_id işlevine dayandığını keşfetmişlerdir.
ENGINE_by_id fonksiyonunu analiz ederken, paylaşılan kütüphanelerin dinamik olarak yüklenmesini sağladığını tespit ettik. Dahası, eğer kütüphane __attribute__ ((constructor)) uzantısı ile derlenmişse, ilgili fonksiyon yüklendikten hemen sonra çalıştırılabilir. Bu, bir saldırganın ssl_engine yönergesinden yararlanarak ana bilgisayara rastgele paylaşılan kütüphaneler yükleyebileceğini ve potansiyel olarak RCE'ye yol açabileceğini gösterir.
Paylaşılan Kütüphaneleri Hedefleme ve Saldırı Stratejisi
Kodun yürütülmesini güvenilir bir şekilde kolaylaştırmak için, bir sonraki adım paylaşılan bir kütüphane tanımlamayı içerir. Harici kütüphanelere güvenmek yerine, NGINX'in kendi davranışından daha uygulanabilir ve kontrollü bir yaklaşım ortaya çıkar: istemci gövde tampon mekanizması. Bu özellik, NGINX'in gelen büyük istekleri geçici dosyalara aktarmasını sağlayarak öngörülebilir dosya işleme davranışına dayalı istismar fırsatları sunar.
Varsayılan olarak, gelen bir istek 8KB'yi aştığında, NGINX istek gövdesini /tmp/nginx/client-body adresinde bulunan geçici bir dosyaya cfg-{random_value} biçiminde bir dosya adı kullanarak yazar. Bu geçici dosyalar, alınan bir iletinin başarılı parçaları arasında 60 saniyeye kadar tutulur.
Kısmi bir istek gövdesini geçici bir dosyaya yazdıktan sonra, NGINX tüm gövde alınana kadar silmeyi erteler. İstek tamamlanmamış olarak kalırsa ve 60 saniyeye kadar veri alınmazsa, dosya sonunda temizlenir. Bununla birlikte, bir saldırgan son veri yığınını kasıtlı olarak saklayarak geçici dosyayı kullanımda tutabilir ve istismar edilebilir hale getirebilir.
Yüklenen dosya içeriği kontrol edilebilmesine rağmen, dosya adının rastgele olması nedeniyle dosya sisteminde yerini bulmak zordur. Depolama yolu client_body_temp_path kullanılarak yapılandırılabilir, ancak dosya adı çalışma zamanında rastgele oluşturulur ve tahmin edilemez hale gelir. Bu rastgelelik, kaba kuvvet yoluyla bile hedeflenen erişimi önemli ölçüde engeller. Ekip bunun üstesinden gelmek için Linux işletim sisteminin doğasında bulunan davranışlardan yararlandı. Aşağıdaki örneği ele alalım:
This code opens a file and keeps it in an active state, closely mimicking the behavior of NGINX's client body buffer mechanism. Using /proc/{pid}/fd directory, attackers can find symbolic links created by the Linux kernel that map open file descriptors to their corresponding file paths. This route allows attackers to reduce the brute-force space to only two variables: the process ID (pid) and the file descriptor (fd).
İstismar Simülasyonu
Yukarıdaki analize dayanarak, Ingress-NGINX bölmesi içinde RCE için pratik bir istismar yaklaşımı şudur:
- Dosya sisteminde geçici olarak depolamak için NGINX'in istemci gövdesi arabellek mekanizmasını kullanarak kötü amaçlı bir paylaşılan kitaplık yükleyin.
- NGINX'i savunmasız yönergeler aracılığıyla önceden yüklenmiş paylaşılan kitaplığı yüklemeye zorlayan bir kaba kuvvet girişimi başlatmak için şablon enjeksiyonu kullanın.
Paylaşılan Kitaplığı İçeren Yükün Hazırlanması
Yükleme sırasında kodun yürütülmesini sağlamak için, kötü amaçlı paylaşılan kütüphanede kurucu uzantılı bir giriş noktası işlevi tanımlanmıştır. Bu işlev NGINX tarafından yüklendikten sonra çalıştırılır ve uzak bir ana bilgisayara ters kabuk bağlantısı kurmak için tasarlanmıştır.
Derlemeden sonra, ortaya çıkan paylaşılan kütüphanenin boyutu 8KB'yi rahatça aştı ve ek dolgu gerektirmeden NGINX tarafından arabelleğe alınmasına izin verdi.
Arkadaşlarımız daha sonra bir boyut uyuşmazlığı yaratmak için şişirilmiş bir İçerik-Uzunluğu değeri (örneğin 1MB) içeren bir istek hazırladılar. Bu, NGINX'in tüm gövdeyi hemen işlemek yerine arabelleğe almasına neden olarak paylaşılan nesnenin öngörülebilir bir konuma yazılmasını sağladı.
Enjeksiyon Yoluyla Paylaşılan Kitaplığı Tetikleme
Paylaşılan kütüphaneyi yerleştirdikten sonra, savunmasız uid alanını kullanarak NGINX yapılandırmasına kötü amaçlı bir yönerge enjekte ettik. Bu yönerge, tamponlanmış dosya yolunu işaret eden ssl_engine 'i içeriyordu:
Başarılı bir RCE, ssl_engine yönergesinin tamponlanmış dosyanın doğru yoluna referans vermesini gerektirir. Bu, tamponlanmış paylaşılan nesneye işaret eden geçerli sembolik bağlantıyı tanımlamak için işlem kimliklerinin ve dosya tanımlayıcılarının olası kombinasyonlarını sistematik olarak yineleyen otomatik bir kaba kuvvet betiği aracılığıyla elde edilebilir.
Aşağıda, istismarı tetikleyen oluşturulan NGINX şablonunun bir örneği yer almaktadır.
Başarılı bir istismarın ardından saldırgan, varsayılan olarak hassas Kubernetes küme sırlarına erişimi olan ingress-nginx pod bağlamı altında kabuk erişimi elde edebilir.
Etki Azaltma ve İyileştirme
CVE-2025-1974 ile ilişkili riskleri etkili bir şekilde azaltmak için kuruluşların açık kaynak bileşenleri üzerinde görünürlük ve kontrol sağlayan bir çözüme ihtiyacı vardır.
MetaDefender® platformunda temel bir teknoloji olan OPSWAT SBOM, kullanılan tüm yazılım bileşenlerinin, kütüphanelerin, Docker konteynerlerinin ve bağımlılıkların bir envanterini sağlayarak bu ihtiyacı karşılar. Kurumların bileşenlerini proaktif olarak izlemelerine, güvence altına almalarına ve güncellemelerine olanak tanır.
Yukarıdaki örnekte, MetaDefender Core™'daki SBOM teknolojisi, CVE-2025-1974 güvenlik açığını içeren nginx-ingress-controller paketini taradı. Sistem, sorunu otomatik olarak Kritik olarak işaretledi ve mevcut düzeltilmiş sürümler hakkında rehberlik sağlayarak ekiplerin güvenlik açığı istismar edilmeden önce hızlı bir şekilde önceliklendirmesini ve yamalamasını sağladı.
OPSWAT SBOM, MetaDefender Core ve MetaDefender Software Supply Chain™'de mevcuttur ve güvenlik ekiplerinin güvenlik açıklarını daha hızlı tespit etmesini ve harekete geçmesini sağlar. OPSWAT SBOM ile güvenlik ekipleri şunları yapabilir
- Savunmasız bileşenleri hızla bulun - Derileştirme saldırılarından etkilenen açık kaynaklı bileşenleri hemen belirleyin. Bu, savunmasız kütüphanelerin yamalanması veya değiştirilmesi konusunda hızlı hareket edilmesini sağlar.
- Proaktif yama ve güncellemeler sağ layın - Derileştirme güvenlik açıklarının önüne geçmek için OPSWAT SBOM aracılığıyla açık kaynaklı bileşenleri sürekli izleyin. OPSWAT SBOM eski veya güvensiz bileşenleri tespit ederek zamanında güncelleme yapılmasını ve saldırılara daha az maruz kalınmasını sağlayabilir.
- Uyumluluğu ve raporlamayı sürdürün - OPSWAT SBOM, düzenleyici çerçevelerin yazılım tedarik zincirlerinde şeffaflığı giderek daha fazla zorunlu kılması nedeniyle kuruluşların uyumluluk gereksinimlerini karşılamasına yardımcı olur.