Krytyczna luka w Ruby on Rails Active Storage może prowadzić do odczytu plików i zdalnego wykonania kodu - Security Bez Tabu

Krytyczna luka w Ruby on Rails Active Storage może prowadzić do odczytu plików i zdalnego wykonania kodu

Cybersecurity news

Wprowadzenie do problemu / definicja

Zespół utrzymujący Ruby on Rails opublikował poprawki dla krytycznej podatności w komponencie Active Storage, odpowiadającym za obsługę przesyłania i przetwarzania plików. Problem dotyczy scenariuszy, w których aplikacja akceptuje obrazy od niezaufanych użytkowników i wykorzystuje bibliotekę libvips do generowania wariantów lub miniaturek.

W takim modelu ataku odpowiednio spreparowany plik graficzny może doprowadzić do nieautoryzowanego odczytu plików znajdujących się na serwerze. W określonych warunkach incydent może następnie eskalować do przejęcia aplikacji, a nawet zdalnego wykonania kodu.

W skrócie

Podatność oznaczona jako CVE-2026-66066 została sklasyfikowana jako krytyczna i dotyczy wybranych wersji Rails używających Active Storage z backendem libvips. Zagrożone są wydania wcześniejsze niż 7.2.3.2 w gałęzi 7.2, wcześniejsze niż 8.0.5.1 w gałęzi 8.0 oraz wcześniejsze niż 8.1.3.1 w gałęzi 8.1.

  • wektor ataku wymaga wykorzystania Active Storage oraz libvips,
  • atak jest istotny tam, gdzie niezaufani użytkownicy mogą przesyłać obrazy,
  • możliwy skutek obejmuje odczyt plików lokalnych, ujawnienie sekretów i dalszą eskalację,
  • użytkownicy ImageMagick nie są objęci tym konkretnym wektorem ataku.

Kontekst / historia

Active Storage to natywny mechanizm Rails służący do obsługi załączników, uploadu plików oraz generowania pochodnych zasobów, takich jak miniatury. W praktyce komponent ten bywa szeroko stosowany w aplikacjach webowych, platformach SaaS, systemach CMS, serwisach e-commerce i portalach z profilami użytkowników.

Znaczenie podatności rośnie ze względu na popularność libvips jako wydajnego backendu do przetwarzania obrazów. W wielu środowiskach deweloperskich i produkcyjnych biblioteka ta jest wdrażana ze względu na szybkość działania i niskie zużycie zasobów, co jednocześnie zwiększa zasięg potencjalnego ryzyka.

Dodatkowym czynnikiem presji na szybkie łatanie jest fakt, że publicznie opisano scenariusze łańcucha ataku prowadzące od odczytu plików do pełnego przejęcia aplikacji. To sprawia, że problem nie powinien być traktowany jako lokalna wada techniczna, lecz jako podatność o dużym znaczeniu operacyjnym.

Analiza techniczna

Źródłem problemu jest sposób przetwarzania obrazów przez Active Storage przy użyciu libvips. Jeżeli aplikacja przyjmuje obraz od użytkownika, a następnie generuje jego wariant, miniaturę lub inną pochodną, odpowiednio spreparowany plik może spowodować odczyt lokalnych plików systemowych lub aplikacyjnych.

Warunki skutecznego wykorzystania podatności są stosunkowo precyzyjne i obejmują kilka elementów jednocześnie:

  • aplikacja korzysta z Active Storage,
  • backend przetwarzania obrazów opiera się na libvips,
  • niezaufany użytkownik może przesłać obraz,
  • system wykonuje operacje przetwarzania tego pliku po stronie serwera.

Najbardziej niebezpieczny aspekt podatności polega na tym, że odczyt plików może ujawnić dane o wysokiej wartości operacyjnej. W praktyce mogą to być sekrety aplikacji, zmienne środowiskowe, dane dostępowe do baz danych, klucze do usług chmurowych, poświadczenia magazynów obiektowych czy materiał kryptograficzny używany do obsługi sesji.

Jeśli atakujący uzyska dostęp do takich informacji, może w niektórych architekturach przejść do kolejnego etapu. Obejmuje on między innymi fałszowanie sesji, manipulowanie tokenami, nadużycie podpisanych identyfikatorów, a w skrajnych przypadkach osiągnięcie zdalnego wykonania kodu i pełnego przejęcia aplikacji.

Warto zaznaczyć, że nie wszystkie środowiska Rails są narażone w identycznym stopniu. Według opublikowanych informacji Rails 6.x jest dotknięty problemem wyłącznie wtedy, gdy Active Storage został skonfigurowany poza ustawieniami domyślnymi. Jednocześnie środowiska korzystające z ImageMagick nie są objęte tym konkretnym wektorem. Dla instalacji z libvips 8.13 lub nowszym możliwe są również działania tymczasowe ograniczające ryzyko poprzez odpowiednią konfigurację.

Konsekwencje / ryzyko

Ryzyko należy ocenić jako bardzo wysokie, ponieważ podatność łączy relatywnie prosty scenariusz wejścia z potencjalnie katastrofalnym skutkiem biznesowym. Już sam odczyt plików może oznaczać utratę poufności danych konfiguracyjnych i sekretów. Kolejny etap może prowadzić do przejęcia sesji użytkowników, dostępu do bazy danych, manipulacji zasobami lub eskalacji do RCE.

Szczególnie narażone są środowiska, w których upload obrazów jest funkcją publiczną albo powszechnie dostępną dla kont użytkowników. Dotyczy to zwłaszcza następujących typów systemów:

  • portale z publicznym przesyłaniem plików graficznych,
  • aplikacje SaaS z profilami użytkowników,
  • platformy marketplace i e-commerce,
  • systemy CMS oraz zaplecza administracyjne,
  • środowiska kontenerowe, w których sekrety są wstrzykiwane przez zmienne środowiskowe.

Wyzwanie z perspektywy zespołów bezpieczeństwa polega również na detekcji. Aktywność atakującego może przypominać zwykłe operacje na obrazach, przez co bez odpowiedniego monitoringu aplikacyjnego, telemetrii z hostów i korelacji zdarzeń związanych z uploadem wykrycie incydentu może być opóźnione.

Rekomendacje

Priorytetem powinno być natychmiastowe zidentyfikowanie wszystkich aplikacji Rails korzystających z Active Storage oraz ustalenie, czy używają libvips jako backendu przetwarzania obrazów. Następnie należy wdrożyć wersje naprawcze odpowiednie dla używanej gałęzi frameworka.

  • zaktualizować Rails do wersji zawierających poprawkę,
  • zaktualizować libvips do wersji 8.13 lub nowszej, jeżeli środowisko tego wymaga,
  • czasowo wyłączyć podatną funkcjonalność tam, gdzie aktualizacja nie może zostać wdrożona od razu,
  • przeprowadzić rotację secret_key_base,
  • zmienić hasła, tokeny i poświadczenia do baz danych, storage oraz usług chmurowych,
  • przeanalizować logi uploadu i przetwarzania obrazów pod kątem anomalii,
  • zweryfikować integralność hostów i kontenerów obsługujących aplikację.

Warto także wdrożyć działania wzmacniające odporność środowiska:

  • ograniczyć upload plików do zaufanych użytkowników, jeśli model biznesowy na to pozwala,
  • separować sekrety od procesu aplikacyjnego wszędzie tam, gdzie jest to możliwe,
  • uruchamiać przetwarzanie mediów w odizolowanych workerach o minimalnych uprawnieniach,
  • stosować reguły WAF i mechanizmy detekcji behawioralnej jako środek kompensacyjny,
  • przeprowadzić przegląd zasad zarządzania kluczami i sesjami w aplikacjach Rails.

Jeżeli istnieje choćby podejrzenie kompromitacji, samo wdrożenie poprawki nie powinno być uznane za wystarczające. Organizacja powinna założyć możliwość ujawnienia wszystkich sekretów dostępnych dla procesu aplikacji i uruchomić pełny proces response, obejmujący analizę śladów, rotację poświadczeń oraz walidację integralności środowiska.

Podsumowanie

CVE-2026-66066 pokazuje, jak pozornie ograniczony problem w obszarze przetwarzania plików może przerodzić się w pełne przejęcie aplikacji. W środowiskach Ruby on Rails korzystających z Active Storage i libvips ryzyko jest szczególnie wysokie tam, gdzie aplikacja dopuszcza przesyłanie obrazów przez niezaufanych użytkowników.

Najważniejsze działania obejmują szybką aktualizację komponentów, ocenę potencjalnej ekspozycji, rotację sekretów oraz retrospektywną analizę logów i oznak nadużycia. Dla zespołów DevSecOps to również sygnał, aby ponownie ocenić bezpieczeństwo pipeline’ów przetwarzania mediów oraz uprawnienia procesów odpowiedzialnych za ich obsługę.

Źródła

  1. https://www.bleepingcomputer.com/news/security/rails-patches-critical-active-storage-flaw-with-rce-potential/
  2. https://github.com/rails/rails/security/advisories
  3. https://github.com/rails/rails/security/advisories/GHSA-xr9x-r78c-5hrm
  4. https://www.cve.org/CVERecord?id=CVE-2026-66066
  5. https://www.akamai.com/