Atacuri cibernetice bazate pe IA: Cum să detectați, să preveniți și să vă apărați împotriva amenințărilor inteligente

Citește acum
Utilizăm inteligența artificială pentru traducerile site-urilor și, deși ne străduim să fim exacți, este posibil ca acestea să nu fie întotdeauna 100% precise. Apreciem înțelegerea dumneavoastră.

IngressNightmare: CVE-2025-1974 Vulnerabilitate de execuție a codului la distanță și remediere

de OPSWAT
Împărtășește această postare

Luna mai 2025 a marcat dezvăluirea publică a unei vulnerabilități de securitate critice, CVE-2025-1974, denumită IngressNightmare, care afectează controlerul Kubernetes ingress-nginx implementat pe scară largă în infrastructurile native de cloud. Această vulnerabilitate permite atacatorilor neautentificați să injecteze configurații arbitrare în NGINX, ceea ce poate duce la RCE (executarea codului de la distanță) neautorizat și la compromiterea întregului cluster.

Ca parte a programului de burse OPSWAT , bursierii noștri au efectuat o analiză tehnică aprofundată pentru a înțelege mai bine cauza principală, calea de exploatare și strategiile de atenuare din jurul acestei probleme de mare gravitate.

Prezentare generală a CVE-2025-1974 

CVE-2025-1974 este o vulnerabilitate critică de injectare a șablonului identificată în versiunile ingress-nginx până la 1.11.4 și în special 1.12.0. Atacatorii cu acces la nivel de nod la un cluster Kubernetes pot exploata această deficiență pentru a executa cod arbitrar utilizând RCE prin intermediul controlerului ingress-nginx care, în mod implicit, are privilegii extinse, inclusiv acces la secrete critice din cadrul clusterului.

Kubernetes Security Response Committee a atribuit acestei vulnerabilități un scor CVSS v3.1 de 9.8 (gravitate critică):

CVSS metrics UI pentru CVE-2025-1974, care prezintă opțiunile de exploatare și impact pentru IngressNightmare

Componente cheie în această analiză

Prezentare generală Kubernetes

Kubernetes (K8s) este o platformă open-source pentru automatizarea implementării, scalării și gestionării operaționale a aplicațiilor containerizate. Clusterele Kubernetes constau de obicei din mai multe mașini, care pot include atât hardware fizic, cât și mașini virtuale, care lucrează împreună pentru a oferi medii de aplicații foarte disponibile, scalabile și gestionabile.

Controler de intrare NGINX

Controlerul de intrare NGINX (ingress-nginx) este un controler de intrare open-source construit pe serverul web NGINX. Acesta funcționează în cadrul unui cluster Kubernetes, funcționând în principal ca un proxy invers și un distribuitor de sarcină. Acest controler interpretează resursele Ingress definite de utilizatori și le transformă în configurații NGINX acționabile pentru a direcționa fluxul de trafic în și în cadrul clusterului.

Evaluarea admiterii și rolul său

Ingress-nginx se integrează cu Kubernetes utilizând un serviciu webhook numit AdmissionReview. Acest serviciu este esențial pentru procesarea obiectelor native Kubernetes Ingress și traducerea lor în configurații NGINX validate și corecte din punct de vedere sintactic. Deși AdmissionReview asigură acuratețea configurației, acesta funcționează independent de controlerul ingress-nginx și, în general, nu dispune de controale stricte de autentificare. Această lipsă de autentificare strictă este un factor-cheie care a contribuit la exploatabilitatea CVE-2025-1974.

CVE-2025-1974 (IngressNightmare) diagramă care arată AdmissionReview în fluxul de lucru al controlorului Kubernetes Ingress NGINX

Exploatarea vulnerabilităților și analiza tehnică

Mecanism de exploatare

În esența sa, exploatarea CVE-2025-1974 începe cu o cerere rău intenționată. Atacatorii elaborează o cerere rău intenționată către webhook-ul AdmissionReview, forțând NGINX să încarce dinamic o bibliotecă partajată în timpul execuției. Pe baza acestui mecanism, colegii noștri au analizat atât webhook-ul AdmissionReview, cât și fluxul de lucru NGINX pentru a înțelege această cale de exploatare.

CVE-2025-1974 (IngressNightmare) diagramă care arată calea de exploatare Kubernetes prin intermediul obiectului de intrare rău intenționat și NGINX

Vulnerabilitate de injectare a șabloanelor

Pe webhook-ul AdmissionReview, la procesarea cererilor primite, funcția CheckIngress transformă Kubernetes Ingress Objects în fișiere de configurare NGINX valide. Fluxul se desfășoară după cum urmează:

Fragment de cod Go care arată logica de injectare a șablonului legată de vulnerabilitatea CVE-2025-1974 (IngressNightmare)
  1. Fiecare configurație este analizată și transmisă către generateTemplate pentru a fi formatată în conformitate cu modelele NGINX predefinite.
  2. Ulterior, testTemplate validează configurația generată față de binarul NGINX de bază.

Toate configurațiile NGINX se bazează pe șabloane predefinite găsite în fișierul nginx.tmpl din codul sursă ingress-nginx:

Fragment de cod care prezintă o vulnerabilitate de injectare a șablonului legată de CVE-2025-1974 (IngressNightmare)

În cadrul funcției generateTemplate, configurația este procesată după cum se arată în următorul fragment de cod:

Fragment de cod Go care arată logica de analizare a adnotărilor legată de injectarea șablonului CVE-2025-1974 (IngressNightmare)

Cu toate acestea, validarea și igienizarea intrărilor sunt insuficiente. Concret, câmpul uid dintr-un obiect de intrare este introdus direct în șablonul de configurare NGINX, creând un punct de injectare. Un atacator poate exploata acest lucru prin furnizarea de date de intrare modificate, cum ar fi uid="1234#;\n\n\n}\n}\n}\n injection_value".

Această intrare malițioasă permite injectarea domeniului de aplicare global în șablonul NGINX, permițând atacatorilor să declanșeze directive NGINX arbitrare și să obțină potențial RCE.

Codul de configurare Nginx prezintă o injecție de șablon legată de vulnerabilitatea CVE-2025-1974 (IngressNightmare)

De la injectarea de șabloane la execuția de cod de la distanță

Explicarea funcției testTemplate()

După ce configurația NGINX este generată de funcția generateTemplate, funcția testTemplate creează un fișier de configurare temporar și rulează biblioteca NGINX cu comanda nginx -c {file_config} -t. Aceasta forțează binarul NGINX să analizeze și să valideze configurația.

Cod Go pentru funcția testTemplate() și interfețele legate de vulnerabilitatea CVE-2025-1974 (IngressNightmare)

Pentru a exploata vulnerabilitatea, un atacator trebuie să identifice o directivă capabilă să execute un cod malițios. Inițial, colegii noștri au identificat directiva load_module ca fiind potențial utilă, deoarece această directivă permite NGINX să încarce pluginuri externe. Cu toate acestea, această directivă este permisă numai în faza inițială a analizei configurației, ceea ce nu corespunde punctului nostru de injectare.

Captură de ecran a codului care arată sintaxa și contextul load_module, relevante pentru CVE-2025-1974 (IngressNightmare)
Rezultatul terminalului arată eșecul testului de configurare nginx legat de eroarea load_module CVE-2025-1974 (IngressNightmare)

Pentru a rezolva această provocare, am continuat cercetările, care au condus la directiva ssl_engine, descrisă ca "Modulul poate fi încărcat dinamic de OpenSSL în timpul testării configurației". Acest lucru a stârnit curiozitate datorită capacității sale de a încărca dinamic module, necesitând o examinare mai aprofundată.

Captură de ecran a codului care explică sintaxa dispozitivului ssl_engine pentru contextul CVE-2025-1974 (IngressNightmare)

Înțelegerea directivei ssl_engine

Pentru a obține o înțelegere mai profundă a modului în care NGINX gestionează directiva ssl_engine, precum și pentru a determina condițiile în care NGINX permite încărcarea dinamică a modulelor suplimentare prin intermediul acestei directive, am analizat codul sursă NGINX.

Fragment de cod C care arată analiza configurației NGINX, relevant pentru directiva ssl_engine CVE-2025-1974 (IngressNightmare)

La pornire, NGINX își încarcă starea inițială, apoi analizează fișierele de configurare linie cu linie. Fiecare directivă este gestionată de structura nginx_command_t, directiva ssl_engine invocând direct ngx_openssl_commands.

Definiția structurii C pentru ngx_command_s legată de directiva ssl_engine CVE-2025-1974 (IngressNightmare)
Figura 1. Definiția ngx_command_s
Fragment de cod care prezintă matricea de directive ssl_engine, relevantă pentru contextul CVE-2025-1974 (IngressNightmare)
Figura 2 Structura ssl_engine ngx_command_t

Analizând funcția ngx_openssl_commands, colegii noștri au descoperit că aceasta se bazează pe suportul OpenSSL, în special pe funcția ENGINE_by_id care este utilizată pentru modulele SSL accelerate hardware.

Fragment de cod C care prezintă logica directivei ssl_engine, relevantă pentru analiza CVE-2025-1974 (IngressNightmare)

Analizând funcția ENGINE_by_id, am constatat că aceasta permite încărcarea dinamică a bibliotecilor partajate. În plus, dacă biblioteca este compilată cu extensia __attribute__((constructor)), funcția asociată poate fi executată imediat după încărcare. Acest lucru indică faptul că, prin exploatarea directivei ssl_engine, un atacator ar putea încărca biblioteci partajate arbitrare pe gazdă, putând duce la RCE.

Direcționarea bibliotecilor partajate și strategia de atac

Pentru a facilita în mod fiabil executarea codului, următorul pas implică identificarea unei biblioteci partajate. În loc să se bazeze pe biblioteci externe, o abordare mai viabilă și mai controlată reiese din propriul comportament al NGINX: mecanismul de tamponare a corpului clientului. Această caracteristică permite NGINX să descarce solicitările mari primite în fișiere temporare, deschizând oportunități de exploatare bazate pe comportamentul previzibil de gestionare a fișierelor.

Codul nginx.conf care arată căile temporare și setările tamponului, relevante pentru atacul CVE-2025-1974 (IngressNightmare)

În mod implicit, atunci când o cerere primită depășește 8KB, NGINX scrie corpul cererii într-un fișier temporar situat la /tmp/nginx/client-body, folosind un nume de fișier în formatul cfg-{random_value}. Aceste fișiere temporare sunt păstrate timp de până la 60 de secunde între bucățile de succes ale unui mesaj primit.

Diagrama CVE-2025-1974 (IngressNightmare) arată fluxul de atac care vizează bibliotecile partajate NGINX și fișierele temporare

După scrierea unui corp parțial al cererii într-un fișier temporar, NGINX amână ștergerea până la primirea întregului corp. Dacă solicitarea rămâne incompletă și nu se primesc date timp de 60 de secunde, fișierul este în cele din urmă șters. Cu toate acestea, prin reținerea intenționată a ultimei bucăți de date, un atacator poate menține fișierul temporar în uz, făcându-l exploatabil.

Diagrama care arată fluxul de atac CVE-2025-1974 (IngressNightmare) care vizează bibliotecile partajate NGINX și ștergerea fișierelor

Deși conținutul fișierului încărcat poate fi controlat, localizarea acestuia pe sistemul de fișiere este dificilă din cauza numelui de fișier aleatoriu. Calea de stocare poate fi configurată utilizând client_body_temp_path, dar numele fișierului este generat aleatoriu în timpul execuției, ceea ce îl face imprevizibil. Această aleatorizare împiedică în mod semnificativ accesul direcționat chiar și prin forța brută. Pentru a depăși acest lucru, echipa a valorificat comportamentele inerente sistemului de operare Linux. Luați în considerare următorul exemplu:

Codul Python exploatează CVE-2025-1974 (IngressNightmare) cu scriere de fișiere și logică de buclă infinită

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).

Ieșirea terminalului care arată detaliile descriptorului de proces și fișier relevante pentru strategia de atac CVE-2025-1974 (IngressNightmare)

Simularea exploatării

Pe baza analizei de mai sus, o abordare practică de exploatare pentru RCE în cadrul podului Ingress-NGINX este:

  1. Încărcați o bibliotecă partajată malițioasă utilizând mecanismul de tamponare a corpului clientului NGINX pentru a o stoca temporar pe sistemul de fișiere.
  2. Utilizați injectarea șablonului pentru a iniția o încercare de forță brută care forțează NGINX să încarce biblioteca partajată încărcată anterior prin directive vulnerabile.
VE-2025-1974 (IngressNightmare) diagrama fluxului de exploatare care arată calea de atac prin Ingress-NGINX către NGINX

Crearea încărcăturii utile care conține biblioteca partajată

Pentru a asigura executarea codului la încărcare, în cadrul bibliotecii partajate malițioase este definită o funcție de punct de intrare cu extensie de constructor. Această funcție este executată la încărcare de NGINX și este concepută pentru a stabili o conexiune reverse shell la o gazdă la distanță. 

Codul C pentru sarcina utilă CVE-2025-1974 (IngressNightmare) cu bibliotecă partajată și comandă reverse shell

După compilare, dimensiunea bibliotecii partajate rezultate a depășit cu ușurință 8KB, permițându-i să fie tamponată de NGINX fără a fi nevoie de umplutură suplimentară.

Lista de terminale care prezintă biblioteca partajată danger.so pentru crearea sarcinii utile CVE-2025-1974 (IngressNightmare)

Colegii noștri au creat apoi o cerere cu o valoare Content-Length umflată (de exemplu, 1MB) pentru a introduce o neconcordanță de dimensiune. Acest lucru a determinat NGINX să stocheze întregul corp al cererii în loc să îl proceseze imediat, asigurându-se că obiectul partajat va fi scris într-o locație previzibilă.

Cod Go pentru crearea unei sarcini utile cu bibliotecă partajată, legată de explozia CVE-2025-1974 (IngressNightmare)

Declanșarea bibliotecii partajate prin injectare

Cu biblioteca partajată instalată, am injectat apoi o directivă rău intenționată în configurația NGINX folosind câmpul vulnerabil uid. Această directivă a inclus ssl_engine indicând calea fișierului tamponat:

Cod JSON care arată obiectul Kubernetes Ingress cu injecție pentru exploatarea CVE-2025-1974 (IngressNightmare)

O RCE reușită necesită ca directiva ssl_engine să facă trimitere la calea corectă către fișierul tamponat. Acest lucru poate fi realizat prin intermediul unui script automatizat de forță brută care trece sistematic peste combinațiile posibile de ID-uri de proces și descriptori de fișier pentru a identifica legătura simbolică validă care indică obiectul partajat tamponat.

Codul Go exploatează CVE-2025-1974 (IngressNightmare) prin injectarea bibliotecii partajate și validarea webhook

Mai jos este prezentat un exemplu de șablon NGINX generat care a declanșat exploatarea.

Codul de configurare Nginx arată injectarea CVE-2025-1974 (IngressNightmare) prin directivele ssl_engine și mirror

La exploatarea cu succes, atacatorul putea obține acces la shell în contextul podului ingress-nginx, care în mod implicit avea acces la secrete sensibile ale clusterului Kubernetes.

Rezultatul terminalului care arată comanda kubectl get secrets -A, relevantă pentru CVE-2025-1974 (IngressNightmare)

Mitigare și remediere

Pentru a reduce în mod eficient riscurile asociate cu CVE-2025-1974, organizațiile au nevoie de o soluție care să ofere vizibilitate și control asupra componentelor open-source.

OPSWAT SBOM, o tehnologie fundamentală din cadrul platformei MetaDefender®, răspunde acestei nevoi prin furnizarea unui inventar al tuturor componentelor software, bibliotecilor, containerelor Docker și dependențelor în uz. Aceasta permite organizațiilor să urmărească, să securizeze și să își actualizeze proactiv componentele.

Captură de ecran UI care arată vulnerabilitatea critică CVE-2025-1974 (IngressNightmare) în nginx-ingress-controller

În exemplul de mai sus, tehnologia SBOM din MetaDefender Core™ a scanat pachetul nginx-ingress-controller care conținea vulnerabilitatea CVE-2025-1974. Sistemul a marcat automat problema ca fiind critică și a oferit îndrumări cu privire la versiunile corectate disponibile, permițând echipelor să prioritizeze rapid și să remedieze vulnerabilitatea înainte ca aceasta să poată fi exploatată.

OPSWAT SBOM este disponibil în MetaDefender Core și MetaDefender Software Supply Chain™, permițând echipelor de securitate să identifice și să acționeze mai rapid asupra vulnerabilităților. Cu OPSWAT SBOM, echipele de securitate pot:

  • Localizarea rapidă a componentelor vulnerabile - Identificați imediat componentele open-source afectate de atacurile de deserializare. Acest lucru asigură o acțiune rapidă de remediere sau înlocuire a bibliotecilor vulnerabile. 
  • Asigurați patch-uri și actualizări proactive - Monitorizați continuu componentele open-source prin intermediul OPSWAT SBOM pentru a rămâne în fața vulnerabilităților de deserializare. OPSWAT SBOM poate detecta componente învechite sau nesigure, permițând actualizări în timp util și reducerea expunerii la atacuri. 
  • Mențineți conformitatea și raportarea - OPSWAT SBOM ajută organizațiile să îndeplinească cerințele de conformitate, deoarece cadrele de reglementare impun tot mai mult transparența în lanțurile de aprovizionare cu software.

Rămâneți la curent cu OPSWAT!

Înscrieți-vă astăzi pentru a primi cele mai recente actualizări ale companiei, povești, informații despre evenimente și multe altele.