CVE-2026-61450
ŚrednieCVSS 6.5Streszczenie
Grav przed wersją 2.0.2 zawiera obejście sandboksa Twig, które pozwala autorowi strony (każdemu użytkownikowi z uprawnieniami admin.pages lub osobie mogącej pisać do katalogu user/pages) na wyciek sekretów konfiguracyjnych. Mimo że sandboks zastępuje zmienną 'config' okrojoną fasadą i usuwa metody Config::get/toArray z listy dozwolonych, surowy kontener pozostaje dostępny przez dozwoloną metodę grav.offsetGet('config'), która zwraca oryginalny obiekt Config. Dozwolone filtry dumpowania obiektów (json_encode, print_r, yaml_encode) serializują ten obiekt na poziomie PHP bez wywoływania bramki metod sandboksa, ujawniając pełne drzewo konfiguracji, w tym sekrety wtyczek, takie jak dane uwierzytelniające SMTP, klucze API i dane uwierzytelniające bazy danych wtyczek.
Ocena ryzyka
Organizacja narażona jest na wyciek wrażliwych danych konfiguracyjnych, w tym poświadczeń SMTP, kluczy API i danych logowania do baz danych wtyczek, co może prowadzić do nieautoryzowanego dostępu do systemów zewnętrznych i wewnętrznych.
Rekomendacja
Należy natychmiast zaktualizować Grav do wersji 2.0.2 lub nowszej, która zawiera pełną poprawkę dla tego problemu. Dodatkowo, ogranicz dostęp do kont użytkowników z uprawnieniami admin.pages oraz do katalogu user/pages tylko do zaufanych osób.
Inne podatności w Grav
Zobacz wszystkie- CVE-2026-53654Średnie
Grav przed wersją 3.8.5 w zadaniu twofa_cancel wtyczki Login akceptuje kontrolowane przez klienta pole _redirect bez nonce i pozwala nieuwierzytelnionemu żądaniu ustawić zewnętrzny cel Location (http, https lub protocol-relative). Controller::execute() stosuje to pole, gdy taskTwofa_cancel() nie ustawia przekierowania, a Grav::getRedirectResponse() akceptuje cel przez Uri::isExternal(), umożliwiając phishingowe przekierowania z zaufanego hosta Grav.
- CVE-2026-75834Średnie
Grav przed wersją 2.0.14 zawiera podatność na przechowywany cross-site scripting w funkcji Security::detectXss() (system/src/Grav/Common/Security.php). Wszystkie wzorce wykrywania XSS używają modyfikatora PCRE /u (UTF-8), więc pojedynczy nieprawidłowy bajt UTF-8 w treści strony powoduje, że preg_match() zwraca false dla każdego wzorca, po cichu omijając bramkę bezpieczeństwa XSS przy zapisie (Validation::checkSafety()). Uwierzytelniony atakujący z uprawnieniami do edycji stron (bez uprawnienia security.xss_whitelist) może przechowywać złośliwy JavaScript, który wykonuje się w przeglądarce odwiedzającego daną stronę.
- CVE-2026-75831Wysokie
Grav przed wersją 2.0.15 zawiera podatność na trwały cross-site scripting w renderowaniu mediów audio i wideo przez metodę sourceParsedownElement. Fragment URL mediów jest konkatenowany bez ucieczki do elementów źródłowych rawHtml, co pozwala atakującym na wstrzyknięcie dowolnego HTML i JavaScript, który wykonuje się w sesjach przeglądających.
- CVE-2026-75828Wysokie
Grav przed wersją 2.0.15 zawiera podatność na trwały cross-site scripting w funkcji detectXss(), gdzie niesparowane cudzysłowy w niecytowanych wartościach atrybutów omijają wykrywanie procedur obsługi zdarzeń. Uwierzytelnieni edytorzy mogą wstrzyknąć procedury obsługi zdarzeń, takie jak onerror=, które przechodzą walidację i wykonują się w przeglądarkach odwiedzających podczas renderowania treści strony.
- CVE-2026-74907Średnie
Grav przed wersją 2.0.15 zawiera podatność na path traversal w serwerze statycznych zasobów w index.php, który używa dopasowania prefiksu string zamiast walidacji granic katalogów. Nieuwierzytelnieni atakujący mogą uzyskać dostęp do plików w katalogach sąsiednich, wykorzystując nazwy katalogów, które rozszerzają bazową ścieżkę string, takie jak żądanie assets-secret, gdy assets jest skonfigurowaną bazą.
- CVE-2026-72832Średnie
Grav w wersjach od 1.5.2 do 2.0.12 zawiera podatność na trwały cross-site scripting (XSS) w funkcji Security::detectXss() (system/src/Grav/Common/Security.php). Skanowanie obsługi zdarzeń jest zakotwiczone na `<` i używa `[^>]*?`, które nie może przekroczyć pierwszego dosłownego `>`; gdy `>` pojawi się wewnątrz wartości atrybutu w cudzysłowie, przeglądarka utrzymuje tag otwarty i parsuje kolejny moduł obsługi zdarzeń (np. onerror), więc detektor i przeglądarka są w niezgodzie. Edytor strony bez uprawnień admin.super może zapisać treść strony taką jak `<img src=x title=">" onerror=alert(document.domain)>`, która jest akceptowana, przechowywana i wykonywana w originie witryny, gdy dowolny odwiedzający (w tym nieuwierzytelnieni użytkownicy) przegląda stronę. Naprawiono w wersji 2.0.13.
- CVE-2026-61455Średnie
Grav przed wersją 2.0.1 zawiera podatność na bombę dekompresyjną w metodzie ZipArchiver::extract(), która nie ogranicza rozmiaru po dekompresji, liczby plików ani głębokości zagnieżdżenia. Atakujący może dostarczyć spreparowane archiwum ZIP, które po rozpakowaniu wypełnia całe dostępne miejsce na dysku, powodując odmowę usługi poprzez wyczerpanie zasobów pamięci masowej.
- CVE-2026-58657Średnie
Grav przed wersją 2.0.0 (aż do 2.0.0-rc.9 i gałęzi 2.0) zawiera podatność na przechowywane wstrzykiwanie CSS w akcji mediów Markdown image resize(). Wcześniejsze zabezpieczenia odrzucają bezpośrednie ładunki ?style= i niebezpieczne funkcje fallback, ale akcja resize() w Excerpts::processMediaActions() zapisuje wartości kontrolowane przez wywołującego bezpośrednio do atrybutu styleAttributes obrazu. Redaktor treści z niższymi uprawnieniami, który może edytować Markdown strony, może przechowywać spreparowany URL obrazu z deklaracjami CSS oddzielonymi średnikami w parametrach resize, które są renderowane w końcowym atrybucie <img style=...> gdy recenzent/admin z wyższymi uprawnieniami przegląda stronę lub podgląd.
- CVE-2026-56701Średnie
Grav przed wersją 2.0.0-beta.2 zawiera podatność na wstrzykiwanie zewnętrznych jednostek XML (XXE) w procesie przesyłania plików SVG, co pozwala uwierzytelnionym atakującym na odczyt dowolnych plików. Aplikacja używa funkcji simplexml_load_string bez wyłączenia ładowania zewnętrznych jednostek, co umożliwia atakującym wstrzykiwanie ładunków XXE za pomocą złośliwych plików SVG.
- CVE-2026-44738Wysokie
Grav to platforma internetowa oparta na plikach. W wersjach przed 2.0.0-rc.2, lista dozwolonych działań w sandboxie Twig pozwalała każdemu użytkownikowi z rolą admin.pages na wywołanie config.toArray() w treści strony, co skutkowało wyświetleniem całej zintegrowanej konfiguracji witryny, w tym tajemnic pluginów.
Oryginalny opis (angielski, źródło NVD)
Grav before 2.0.2 contains a Twig sandbox bypass that allows a page author (any admin.pages user, or anyone able to write to user/pages) to exfiltrate configuration secrets. Although the sandbox replaces the 'config' variable with a redacted facade and strips Config::get/toArray from the method allowlist, the raw container remains accessible via the allow-listed grav.offsetGet('config'), which returns the real Config object. Allow-listed object-dumping filters (json_encode, print_r, yaml_encode) then serialize that object at the PHP level without invoking the sandbox method gate, exposing the full config tree including plugin secrets such as SMTP credentials, API keys, and plugin DB credentials. This is an incomplete fix for GHSA-j274-39qw-32c9.

