Transmiterea jurnalelor, a alertelor și a datelor de telemetrie prin intermediul unei diode de date

Află cum
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ă.

CVE-2026-25049: Sandbox a expresiilor, care duce la executarea de cod de la distanță în n8n

De Loc Nguyen, șeful echipei de testare a penetrării
Împărtășește această postare

În februarie 2026, a fost dezvăluită public o vulnerabilitate critică de evadare din mediul sandbox în n8n, platforma open-source de automatizare a fluxurilor de lucru utilizată pe scară largă. Cunoscută sub numărul CVE-2026-25049, această vulnerabilitate permite utilizatorilor autentificați să ocolească mediul sandbox de evaluare a expresiilor și să execute comenzi de sistem arbitrare pe serverul gazdă, obținând astfel executarea completă a codului de la distanță, cu un scor CVSS v3.1 de 9,9.

În cadrul Programului de burseOPSWAT , bursierii noștri au realizat o analiză tehnică detaliată a vulnerabilității CVE-2026-25049, examinând cauza principală a acesteia, mecanismul de exploatare și impactul asupra organizațiilor.

Acest blog oferă o analiză detaliată a vulnerabilității – de la arhitectura de procesare a expresiilor n8n și controalele sale de securitate stratificate până la tehnica precisă care reușește să treacă simultan de toate cele cinci straturi de apărare.

CVE-2026-25049 este o vulnerabilitate critică de evadare din zona de izolare a expresiilor în n8n, clasificată sub CWE-913: Control necorespunzător al resurselor de cod gestionate dinamic. Vulnerabilitatea afectează toate versiunile n8n anterioare versiunii 1.123.17, precum și versiunile 2.0.0 până la 2.5.1, și a fost remediată în versiunile 1.123.17 și 2.5.2. Aceasta permite utilizatorilor autentificați cu permisiuni de creare a fluxurilor de lucru să creeze expresii JavaScript rău intenționate care ocolesc sandbox-ul de expresii al platformei, reușind în cele din urmă să execute comenzi arbitrare pe serverul gazdă.

Figura 1: CVE-2026-25049 (sursă: NVD)

Vulnerabilitatea este deosebit de gravă, deoarece n8n ocupă de obicei o poziție privilegiată în cadrul infrastructurii unei organizații. În calitate de platformă de automatizare a fluxurilor de lucru, n8n are, de regulă, acces direct la API-uri interne, baze de date, baze de date cu date de autentificare și servicii terțe. O instanță n8n compromisă nu doar expune serverul de automatizare, ci oferă un punct de acces către fiecare sistem conectat, amplificând considerabil amploarea potențială a exploatării.

CVE-2026-25049 nu reprezintă o vulnerabilitate descoperită independent, ci o modalitate de ocolire a patch-ului pentru CVE-2025-68613, o vulnerabilitate anterioară de evadare din sandbox în evaluatorul de expresii al n8n. În ciuda implementării unor apărări pe mai multe niveluri după vulnerabilitatea inițială, o lacună fundamentală în modul în care sanitizatorul procesează tipurile de noduri ale Arborelui de Sintaxă Abstractă (AST) JavaScript a permis clasei originale de atac să reapară printr-un vector sintactic diferit. Acest model – în care un patch abordează tehnica specifică de exploatare, mai degrabă decât slăbiciunea de proiectare subiacentă – evidențiază provocarea persistentă a securizării mediilor de evaluare a codului dinamic.

Vulnerabilitatea a fost făcută publică pe 4 februarie 2026, alături de alte zece avize de securitate pentru n8n, și a fost analizată în mod independent de mai multe echipe de cercetare în domeniul securității.

Despre n8n

n8n este o platformă open-source de automatizare a fluxurilor de lucru care permite organizațiilor să conecteze sisteme, să automatizeze procese și să creeze integrări între sute de servicii. Datorită adoptării pe scară largă și a celor peste 1.300 de integrări disponibile, n8n a devenit unul dintre cele mai populare instrumente din categoria sa, fiind utilizat de echipele de dezvoltare și de întreprinderi pentru a automatiza totul, de la instrumentele interne până la fluxurile de date esențiale pentru activitatea companiei.

Figura 2: Un exemplu de flux de lucru n8n.

Platforma acceptă atât implementări auto-găzduite, cât și în cloud și oferă un generator vizual de fluxuri de lucru, alături de suport direct pentru JavaScript în vederea implementării unei logici personalizate. Arhitectura n8n este bazată pe noduri: fluxurile de lucru sunt compuse din noduri interconectate care transmit date în format JSON între declanșatoare, acțiuni și pași funcționali. Execuția poate rula în modul manual pentru testare sau în modul de producție pentru implementare live. Această arhitectură, combinată cu suportul nativ pentru expresii JavaScript și accesul la API-uri interne și stocuri de credențiale, face din n8n un instrument puternic de automatizare - dar și o țintă de mare valoare atunci când apar vulnerabilități.

Context tehnic

Arbori de sintaxă abstractă

Un arbore sintactic abstract (AST) este o reprezentare ierarhică a codului sursă generată de un analizor sintactic. În loc să trateze codul ca pe un șir de caractere simplu, un AST îl descompune în noduri structurate care reprezintă elementele sale sintactice – declarații de variabile, expresii de funcții, expresii de membri, identificatori și litere.

Figura 3: Etapele compilării.

Înțelegerea tipurilor de noduri AST este esențială pentru această analiză, deoarece mecanismele de securitate ale n8n funcționează la nivelul AST. Modulele de curățare inspectează anumite tipuri de noduri pentru a detecta și a bloca tiparele periculoase. Vulnerabilitatea exploatează faptul că aceeași operație semantică – accesarea unei proprietăți a unui obiect – poate genera tipuri de noduri AST complet diferite, în funcție de sintaxa JavaScript utilizată.

Figura 4: Câteva noduri AST în JavaScript.

De exemplu, expresia obj.constructor generează un nod MemberExpression, în timp ce const { constructor } = obj generează o VariableDeclaration care conține un ObjectPattern cu un nod Property. Ambele extrag aceeași proprietate, dar structurile AST sunt fundamental diferite – iar modulele de validare ale n8n verifică doar primul tipar.

Evaluarea expresiilor și arhitectura de securitate n8n

Arhitectura n8n este organizată în cinci straturi: Frontend, CLI, Core, Workflow și Nodes. Stratul Workflow se ocupă de evaluarea expresiilor, aceasta fiind componenta relevantă pentru această vulnerabilitate.

Figura 5: Prezentare generală a fluxului n8n.

n8n permite utilizatorilor să încorporeze expresii JavaScript în parametrii nodurilor fluxului de lucru pentru a manipula datele în mod dinamic. Aceste expresii sunt evaluate pe server folosind o bibliotecă numită Tournament, care analizează expresiile într-un AST înainte de execuție. Cârligele de igienizare sunt integrate direct în procesul de creare al Tournament, efectuând verificări în timpul construirii AST pentru a intercepta tiparele periculoase înainte ca orice cod să fie executat.

Figura 6: Crearea inițială a turneului.

Deoarece aceste expresii se execută în cadrul aceluiași proces Node.js ca și serverul n8n, platforma implementează cinci niveluri distincte de securitate menite să împiedice codul neîncredibil să iasă din mediul izolat.

Nivelul 1 – Suprascrierea contextului global

Înainte ca orice expresie să fie evaluată, n8n creează un context de execuție restricționat prin suprascrierea obiectelor și funcțiilor globale periculoase. Proprietăți precum document, window, globalThis, eval, setTimeout, setInterval și Function sunt înlocuite cu obiecte goale, împiedicând accesul direct la aceste funcționalități.

Figura 7: Inițierea contextului global.
Figura 8: Suprascrieți toate funcțiile periculoase.

Această abordare prezintă o limitare inerentă: dacă un atacator reușește să scape din contextul restricționat și să ajungă la obiectul procesului global propriu-zis, proprietățile suprascrise își pierd relevanța.

Nivelul 2 – Validarea cu expresii regulate

Înainte ca expresia să ajungă la evaluator, n8n efectuează o verificare a expresiei regulate asupra șirului brut al expresiei pentru a bloca accesul la proprietatea constructorului – o metodă frecventă de obținere a constructorului Function și de executare a codului.

Figura 9: Validarea cu expresii regulate.

Expresia regulată /\.\s*constructor/gm detectează accesul la .constructor prin notația cu punct. Totuși, această verificare are limite fundamentale, deoarece JavaScript oferă mai multe modalități sintactice de a accesa aceeași proprietate, dintre care nu toate implică notația cu punct.

Nivelul 3 – AST Runtime Sanitizer – PrototypeSanitizer

Cel mai sofisticat mecanism de apărare se activează în timpul construirii AST. Cârligul PrototypeSanitizer parcurge AST și inspectează nodurile MemberExpression pentru a stabili dacă proprietatea accesată figurează pe o listă neagră a proprietăților nesigure ale obiectelor – inclusiv constructor, __proto__, prototype, mainModule și binding.

Figura 10: Prototip de aparat de dezinfectare.

Sanitizatorul gestionează trei cazuri: notația cu punct (obj.prop), în care verifică numele identificatorului, notația statică între paranteze (obj['prop']), în care verifică valoarea literală a șirului de caractere, și expresiile dinamice, care sunt încadrate într-o funcție de sanitizare la rulare. După cum se arată în Figura 10, sunt inspectate doar nodurile MemberExpression – modelele de destructurare nu sunt parcurse.

Nivelul 4 - Funcția de curățare a memoriei AST la rulare ThisSanitizer

Adăugat ca patch direct pentru CVE-2025-68613, FunctionThisSanitizer interceptează expresiile funcționale invocate imediat (IIFE) și le rescrie pentru a lega variabila `this` de un obiect gol. Aceasta împiedică tehnica utilizată în exploit-ul original, în care (function(){ return this })() ducea la scurgerea obiectului global al procesului prin referința `this` nelegată.

Figura 11: Funcția GlobalThisSanitizer

Un aspect esențial este că acest dezinfectant procesează doar nodurile de tip FunctionExpression. El se oprește în mod explicit înainte de final pentru orice obiect apelat care nu este de tip FunctionExpression, inclusiv funcțiile săgeată.

Proprietățile periculoase, precum eval, Function și process.mainModule, sunt eliminate sau suprascrise în contextul de execuție, împiedicând accesul direct la elementele de bază ale execuției codului, chiar și în cazul în care straturile anterioare sunt ocolite.

Analiza vulnerabilității

Cauza principală

Cauza principală a vulnerabilității CVE-2026-25049 rezidă într-o presupunere comună tuturor celor cinci straturi de securitate: fiecare strat a presupus că accesarea proprietăților se va realiza fie prin notația cu punct (obj.constructor), fie prin notația cu paranteze [] (obj['constructor']). Niciunul nu a luat în considerare sintaxa de destructurare din JavaScript.

Destructurarea JavaScript permite extragerea proprietăților din obiecte folosind o structură AST fundamental diferită:

// Traditional access - produces MemberExpression node
obj.constructor; // Blocked by regex, AST sanitizer, and runtime checks

// Destructuring - produces ObjectPattern → Property node
const { constructor } = obj; // Not checked by any layer

Deși ambele tipare conduc la același rezultat, ele generează reprezentări AST complet diferite. PrototypeSanitizer inspectează doar nodurile MemberExpression, iar expresia regulată se potrivește doar cu tiparele .constructor. Atribuțiile de destructurare creează noduri de tip VariableDeclaration → ObjectPattern → Property, pe care niciunul dintre sanitizere nu le parcurge.

La aceasta se adaugă modul în care n8n gestionează funcțiile săgeată. FunctionThisSanitizer interceptează doar nodurile FunctionExpression și le rescrie pentru a lega variabila `this` de un context sigur. Funcțiile săgeată generează noduri AST de tip ArrowFunctionExpression, pe care sanitizerul nu le procesează. Deoarece funcțiile săgeată moștenesc variabila `this` din domeniul de vizibilitate înconjurător (variabila `this` lexicală), ele oferă acces la contextul global nesanitizat.

Împreună, aceste două omisiuni duc la o ocolire completă: destructurarea extrage constructorul Function fără a declanșa nicio verificare a accesului la proprietăți, iar funcțiile săgeată oferă un context de execuție pe care FunctionThisSanitizer nu îl interceptează.

Exploatare

Exploitul combină ambele vulnerabilități pentru a sparge simultan toate straturile de securitate. Colegii noștri au identificat următoarea cale de exploatare:

Pasul 1 – Introducerea funcției săgeată. Codul util începe cu o funcție săgeată încadrată într-o expresie de funcție invocată imediat (IIFE):

={{(() => {
// Funcție săgeată – ocolește FunctionThisSanitizer
...
})()}}

Funcția FunctionThisSanitizer verifică dacă entitatea apelată este o FunctionExpression; întrucât aceasta este o ArrowFunctionExpression, sanitizerul se oprește înainte de a reda apelul. Funcția săgeată se execută având acces deplin la contextul global real.

Pasul 2 – Ocolirea destructurării. În interiorul funcției săgeată, destructurarea extrage constructorul Function dintr-o instanță a funcției săgeată:

const { constructor } = () => {};

Deoarece aceasta este o atribuire de destructurare, AST-ul conține un nod ObjectPattern în loc de un MemberExpression. Verificarea cu expresii regulate nu detectează niciun model .constructor, iar PrototypeSanitizer nu verifică niciodată numele proprietății. Atacatorul deține acum o referință la constructorul Function.

Pasul 3 – Executarea dinamică a codului. Odată obținut constructorul funcției, atacatorul creează și execută cod arbitrar:

return constructor(
'return process.mainModule.require("child_process").execSync("whoami").toString()',
)();

Funcția construită dinamic rulează în afara contextului sandbox, având acces deplin la obiectul procesului Node.js, ceea ce permite executarea unor comenzi de sistem arbitrare pe gazdă.

Figura 12: Sarcina utilă finală de atac

Dovada conceptului

Pentru a demonstra impactul concret al acestei vulnerabilități, colegii noștri au reprodus exploitul într-un mediu de laborator controlat. Scenariul de atac presupune găzduirea unei instanțe n8n vulnerabile și importarea unui flux de lucru care conține încărcătura dăunătoare într-un parametru al nodului – vizând în mod specific nodul „Edit Fields”, care permite evaluarea expresiilor.

Figura 13: Un administrator importă un flux de lucru dăunător.

Odată ce fluxul de lucru este declanșat, încărcătura ocolește toate cele cinci straturi de filtrare și execută un shell invers pe serverul gazdă, oferind atacatorului capacitatea deplină de a executa comenzi.

Figura 14: Executarea sarcinii utile prin declanșarea fluxului de lucru.

Escaladarea unui webhook către o vulnerabilitate RCE fără autentificare

Gravitatea acestei vulnerabilități crește semnificativ atunci când este combinată cu funcționalitatea webhook a n8n. n8n permite fluxurilor de lucru să expună puncte finale HTTP sub formă de webhook-uri cu opțiuni de autentificare configurabile, inclusiv token-uri de tip „bearer”, autentificare de bază și – aspect critic – fără nicio autentificare. Un atacator cu acces la crearea fluxurilor de lucru poate configura un webhook public cu autentificare: „none”, poate încorpora încărcătura RCE într-un nod conectat și poate activa fluxul de lucru. În acel moment, orice cerere HTTP către URL-ul webhook-ului – de oriunde de pe internet – declanșează executarea arbitrară a comenzilor pe serverul gazdă.

Această cale de escaladare transformă CVE-2026-25049 dintr-o vulnerabilitate internă, accesibilă doar utilizatorilor autentificați, într-un vector de atac practic neautentificat, cu expunere la nivelul întregii rețele de internet.

Atenuare

Echipa n8n a remediat vulnerabilitatea CVE-2026-25049 în versiunile 1.123.17 și 2.5.2 prin implementarea unei verificări adecvate a tipurilor de date în timpul rulării în cadrul funcțiilor de curățare a datelor și prin extinderea acoperirii AST pentru a gestiona tiparele de destructurare. Organizațiile care utilizează versiunile afectate ar trebui să efectueze imediat actualizarea.

În cazul în care o actualizare imediată nu este posibilă, administratorii ar trebui să limiteze permisiunile de creare și editare a fluxurilor de lucru doar la utilizatorii de încredere și să implementeze n8n într-un mediu securizat, cu privilegii restrânse la nivelul sistemului de operare și acces limitat la rețea.

Având în vedere gravitatea critică a vulnerabilității și ușurința cu care poate fi exploatată – în special atunci când este combinată cu webhook-uri publice –, organizațiile ar trebui, de asemenea, să verifice fluxurile de lucru existente în căutarea unor expresii suspecte, să monitorizeze execuția comenzilor de sistem anomale provenite din procesul n8n și să revizuiască configurațiile webhook-urilor pentru a identifica eventualele terminale expuse fără autentificare.

Reducerea riscurilor cu OPSWAT

Prin utilizarea OPSWAT , organizațiile pot identifica rapid componentele n8n vulnerabile din infrastructura lor și pot lua măsuri înainte ca acestea să fie exploatate. OPSWAT , o tehnologie fundamentală a platformei MetaDefender®, oferă un inventar complet al tuturor componentelor software, bibliotecilor și dependențelor utilizate în mediul unei organizații.

Figura 15: Detectarea vulnerabilității CVE-2026-25049 în OPSWAT

După cum se arată în Figura 15, MetaDefender a scanat fișierul package.json care conține dependența n8n și a marcat automat CVE-2026-25049 ca fiind „Critică”, afișând intervalul de versiuni afectate și versiunile corectate recomandate pentru remediere. Acest lucru permite echipelor de securitate să identifice rapid și să prioritizeze vulnerabilitatea în întregul lor mediu de implementare.

OPSWAT este disponibil în MetaDefender și MetaDefender Software Chain™, permițând echipelor de securitate să:

  • Identificați rapid componentele vulnerabile – Identificați imediat dependențele open-source afectate de vulnerabilități legate de evadarea din mediul sandbox și de executarea codului, permițând remedierea sau eliminarea rapidă a acestora.
  • Asigurați-vă că aplicați patch-uri și actualizări în mod proactiv – Monitorizați în permanență componentele open-source pentru a detecta pachetele învechite sau nesigure, permițând astfel actualizări în timp util și reducerea expunerii la riscuri.
  • Asigurarea conformității și a raportării – Respectați cerințele de reglementare, având în vedere că normele impun din ce în ce mai mult transparența în lanțurile de aprovizionare cu software.

Referințe

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.