Printr-o analiză de securitate cuprinzătoare efectuată de echipa roșie a OPSWAT, cercetătorii în securitate Thai Do și Minh Pham au identificat mai multe vulnerabilități care afectează cadrul Rack Ruby, în special CVE-2025-25184, CVE-2025-27111 și CVE-2025-27610.
Acest articol oferă o prezentare detaliată a acestor vulnerabilități, cu un accent deosebit pe CVE-2025-27610. Acesta examinează cauzele principale, evaluează impactul potențial și prezintă strategii eficiente de atenuare pentru a securiza aplicațiile care se bazează pe cadrul Rack.
Prezentare generală a rafturilor
Rack este o interfață modulară care conectează serverele web la aplicațiile web bazate pe Ruby. Aceasta standardizează interacțiunea dintre aceste componente prin înglobarea cererilor și răspunsurilor HTTP într-un singur apel de metodă, simplificând procesul de dezvoltare și promovând compatibilitatea între diverse cadre și servere.
Rack este utilizat de multe cadre și biblioteci web Ruby, cum ar fi Ruby on Rails și Sinatra. Rack este disponibil ca Ruby Gem. Adoptarea globală pe scară largă a Rack, cu peste un miliard de descărcări la nivel global, subliniază rolul său integral în cadrul ecosistemului de dezvoltare Ruby. Componentele middleware precum Rack::Static și Rack::Sendfile sporesc eficiența prin gestionarea livrării conținutului static și optimizarea transmiterii fișierelor. Datorită acestei integrări extinse, vulnerabilitățile descoperite în Rack prezintă implicații de securitate substanțiale, putând afecta numeroase aplicații și sisteme din întreaga lume.
Descoperirea vulnerabilităților de securitate în Rack
În timpul cercetărilor recente de securitate efectuate pe cadrul middleware Rack, cercetătorii OPSWAT Thai Do și Minh Pham au identificat mai multe vulnerabilități care prezintă riscuri de securitate semnificative pentru aplicațiile web bazate pe Ruby:
- CVE-2025-25184: Thai Do a descoperit o vulnerabilitate care permite atacatorilor să efectueze injectarea jurnalului prin intermediul caracterelor CRLF (Carriage Return Line Feed), manipulând potențial intrările din jurnal.
- CVE-2025-27111: Minh Pham a descoperit un defect de securitate, care permite atacatorilor să injecteze și să manipuleze conținutul jurnalului prin valori de antet malițioase.
- CVE-2025-27610: Minh Pham a identificat, de asemenea, o vulnerabilitate Path Traversal, care ar putea permite atacatorilor să obțină acces neautorizat la fișiere situate în afara directorului de fișiere static desemnat, reprezentând o amenințare semnificativă la adresa securității.
Printre aceste vulnerabilități, CVE-2025-27610 este deosebit de gravă, deoarece ar putea permite atacatorilor neautentificați să recupereze informații sensibile, inclusiv fișiere de configurare, acreditări și date confidențiale, conducând astfel la încălcări ale securității datelor. Acestei vulnerabilități i-a fost atribuit un scor CVSS de 7,5, catalogând-o drept un risc de severitate ridicată.
Rack::Static și Vulnerabilitatea includerii fișierelor locale
Înțelegerea Rack::Static
Rack::Static este un middleware esențial în aplicațiile Rack, utilizat în principal pentru a servi eficient fișiere statice precum JavaScript, CSS și imagini. Prin utilizarea Rack::Static, dezvoltatorii pot integra fără probleme servirea conținutului static în aplicațiile Ruby, fără a fi nevoie să se bazeze pe configurarea suplimentară a serverului web.
Atunci când configurați Rack::Static, două opțiuni esențiale ies în evidență - :urls și :root. Înțelegerea și utilizarea corectă a acestor opțiuni simplifică și raționalizează semnificativ procesul de servire a fișierelor statice.
1. Opțiunea :urls
Opțiunea :urls specifică căile URL pe care aplicația Rack ar trebui să le gestioneze ca active statice. Aceasta este furnizată ca un șir de șiruri de caractere, fiecare reprezentând un prefix de cale care declanșează gestionarea fișierelor statice.
De exemplu:
În această configurație, cererile către /images, /css sau /js sunt interceptate și procesate de Rack::Static. Orice fișier care corespunde acestor căi va fi servit direct din sistemul de fișiere.
2. Opțiunea :root
Opțiunea :root definește directorul de bază din care vor fi servite fișierele statice. Acest director este relativ la directorul curent de lucru al aplicației Rack.
Având în vedere exemplul anterior:
Când se face o cerere către /assets/logo.png, Rack::Static încearcă să servească fișierul localizat la public/assets/logo.png.
Exemplu practic
Implementarea eficientă a Rack::Static prin opțiunile :urls și :root oferă o metodă organizată și performantă pentru servirea conținutului static în cadrul aplicațiilor web Ruby:
În acest scenariu, cererile către /assets/* și /favicon.ico vor fi gestionate automat de Rack::Static. Toate fișierele corespunzătoare trebuie să existe în directorul public/assets și, respectiv, public/favicon.ico.
CVE-2025-27610 Detalii tehnice
În timpul unei ample analize de securitate a Rack::Static, Minh Pham a descoperit o vulnerabilitate semnificativă legată de gestionarea necorespunzătoare a opțiunii :root. În mod specific, atunci când parametrul :root nu este definit în mod explicit, Rack atribuie implicit acestei valori directorul curent de lucru prin atribuirea valorii Dir.pwd, desemnându-l implicit ca director rădăcină web pentru aplicația Rack.
În mod semnificativ, Rack::Static concatenează direct căile URL de intrare cu directorul :root specificat fără validare sau igienizare suficientă. În consecință, dacă opțiunea :root este nedefinită sau configurată greșit în raport cu opțiunea :urls, un atacator neautentificat ar putea exploata această vulnerabilitate prin tehnici de traversare a căilor pentru a accesa fișiere sensibile din afara directorului web vizat.
Următoarea secțiune oferă o analiză detaliată a procesului de gestionare a cererilor Rack::Static, ilustrând clar modul în care această vulnerabilitate poate fi exploatată.
Traversarea căii și vulnerabilitatea includerii fișierelor locale în Rack::Static
Pentru a înțelege mai bine modul în care middleware-ul Rack::Static procesează cererile, Minh Pham a efectuat o analiză aprofundată a codului sursă al Rack. În timpul inițializării clasei Rack::Static, el a observat că, dacă opțiunea :root nu este definită explicit, Rack::Static servește în mod implicit fișiere din directorul de lucru curent (Dir.pwd). În consecință, omiterea acestei opțiuni duce la utilizarea implicită de către middleware a directorului din care este executată aplicația.
În urma inițializării, s-a stabilit că atunci când Rack::Static primește o cerere HTTP, este invocată metoda de apel.
Ulterior, Rack::Static deleagă operațiunea de servire a fișierelor către Rack::Files, care încearcă să localizeze și să servească fișierul pe baza căii construite a fișierului derivată din directorul :root configurat și din PATH_INFO furnizat de utilizator.
În primul rând, prin invocarea metodelor can_serve(path) și overwrite_file_path(path), middleware-ul examinează env["PATH_INFO"] pentru a determina dacă cererea de intrare corespunde vreunuia dintre prefixele URL configurate (de exemplu, /static, /public).
Dacă condiția este îndeplinită, Rack::Static construiește calea fișierului prin combinarea directorului rădăcină configurat (:root) cu PATH_INFO furnizat de utilizator. Această construcție are loc fără normalizarea sau igienizarea adecvată a căii de intrare. Mai exact, middleware-ul concatenează direct PATH_INFO din cererea de intrare cu directorul specificat de opțiunea :root, introducând o vulnerabilitate din cauza validării insuficiente a căii furnizate
Minh Pham a descoperit că, din cauza absenței unei sanitizări sau validări adecvate în acest flux de lucru, dacă PATH_INFO furnizat de utilizator conține secvențe de traversare a directoarelor, iar opțiunea :root nu este definită explicit, calea construită a fișierelor ar putea duce la o locație în afara directorului rădăcină intenționat, expunând potențial fișiere sensibile.
CVE-2025-27610 Proof of Concept
Pentru a demonstra această vulnerabilitate în Rack::Static, am dezvoltat o aplicație web bazată pe Ruby care utilizează Rack versiunea 3.1.10. În scenariile în care aplicația nu definește în mod explicit opțiunea :root, un atacator neautentificat poate exploata această vulnerabilitate pentru a accesa date sensibile, cum ar fi acreditări, fișiere de configurare sau fișiere de baze de date, ceea ce poate duce la o încălcare semnificativă a securității datelor.
Vă rugăm să consultați următorul videoclip pentru o demonstrație detaliată a impactului semnificativ asociat cu această vulnerabilitate:
Atenuare și îndrumare
Pentru a atenua vulnerabilitățile discutate mai sus, vă rugăm să vă asigurați că sistemul dumneavoastră este actualizat la cea mai recentă versiune a Rack.
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-27610, CVE-2025-27111 și CVE-2025-25184, în cadrul componentelor enumerate. Acest lucru permite echipelor de dezvoltare și securitate să prioritizeze eforturile de aplicare a patch-urilor, atenuâ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-27610, CVE-2025-27111 și CVE-2025-25184, care au fost detectate de MetaDefender Core cu SBOM: