CVE-2026-100671
WysokieCVSS 8.0Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 19 - wyżej niż 19% wszystkich znanych CVE
Streszczenie
Grav to flat-file CMS. W wersjach 2.0.19 do 2.0.24 — oraz w 2.0.0 do 2.0.18 i 1.7.x tylko tam, gdzie Twig treści został jawnie włączony — treść strony autorstwa użytkownika z uprawnieniem tylko do zapisu strony jest renderowana przez sandbox Twig, który zezwala na get_cookie(), zwracający dowolny cookie wysłany z bieżącym żądaniem, w tym cookie sesji odwiedzającego. Grav przechowuje gotowy wynik po Twig w cache treści strony kluczowanym tylko na tożsamości strony i sumie kontrolnej konfiguracji, bez wymiaru sesji, użytkownika czy żądania.
Ocena ryzyka
Strona opublikowana przez użytkownika z uprawnieniem page-write może przechwycić identyfikator sesji następnego administratora, który ją wyświetli, a następnie cache'owany wynik udostępnia ten identyfikator nieuwierzytelnionym odwiedzającym, którzy mogą odtworzyć cookie, aby uwierzytelnić się jako administrator. Prowadzi to do pełnego przejęcia konta administratora.
Rekomendacja
Zaktualizuj Grav do wersji 2.0.25 lub nowszej. Wyłącz przetwarzanie Twig treści, jeśli nie jest wymagane, i sprawdź cache treści pod kątem podejrzanych danych sesji.
Inne podatności w Grav
Zobacz wszystkie- CVE-2026-100668Średnie
Grav 2.0.0 do 2.0.24 zawiera lukę w sandboxie Twig, która pozwala na ominięcie zabezpieczeń. Filtr `array` jest dozwolony w sandboxie, ale nie sprawdza listy dozwolonych metod, co umożliwia odczytanie prywatnych danych kontenera DI, w tym pełnej konfiguracji z sekretami (hasła, klucze OAuth, SMTP, Redis, proxy).
- CVE-2026-75837Krytyczne
Grav przed wersją 2.0.14 nie zabezpiecza pola access w podstawowym blueprint grupy wymaganym ograniczeniem security@: admin.super. Delegowany operator admin.users może zapisać grupę z access[admin][super]=true, aby eskalować do super-admina, uzyskując możliwości planowania i ewaluacji Twig.
- CVE-2026-65008Krytyczne
Grav 2.0.4 (poprawiony w 2.0.7) zawiera podatność na zdalne wykonanie kodu w funkcji Blueprint::dynamicData(). Funkcja ta przekazuje ciąg znaków wywołania metody klasy i jej argumenty bezpośrednio do call_user_func_array() bez żadnej listy dozwolonych wartości. Ponieważ wtyczka formularza kieruje frontmatter stron przez tę ścieżkę, uwierzytelnione konto z uprawnieniami admin.pages (lub api.pages.write) może umieścić złośliwą dyrektywę wywołania na stronie. Polecenie wykonuje się jako użytkownik serwera WWW, gdy ktokolwiek – w tym nieuwierzytelniony gość – uzyska dostęp do strony.
- CVE-2026-61450Średnie
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.
- CVE-2025-66844Krytyczne
W grav przed wersją 1.7.49.5, wektor SSRF (Server-Side Request Forgery) może być wyzwolony przez szablony Twig, gdy treść strony jest przetwarzana przez Twig, a konfiguracja pozwala na rejestrację niezdefiniowanych funkcji PHP.
- CVE-2025-66301Krytyczne
Grav to platforma webowa oparta na plikach. Przed wersją 1.8.0-beta.27, z powodu niewłaściwych kontroli autoryzacji przy modyfikowaniu krytycznych pól w żądaniu POST do /admin/pages/{page_name}, edytor z uprawnieniami tylko do zmiany podstawowej treści formularza może zmienić działanie formularza poprzez modyfikację zawartości data[_json][header][form], czyli YAML frontmatter, który zawiera sekcję process określającą, co dzieje się po wysłaniu formularza, w tym ważne akcje mogące prowadzić do dalszych podatności. Podatność naprawiona w wersji 1.8.0-beta.27.
- CVE-2026-117604Wysokie
W Grav od wersji 1.7.53.3 do 1.7.53.6 występuje obejście autoryzacji w Debugger::isDebuggerRequestAuthorized(), które pozwala nieuwierzytelnionym odwiedzającym czytać dane profilera /__clockwork/ poprzez mechanizm fallback REMOTE_ADDR dla loopback. Za odwrotnym proxy na tym samym hoście zdalne żądania wyglądają jak loopback, umożliwiając atakującym odczyt zapisanych rekordów, w tym haseł administratorów w postaci jawnej i poświadczeń konfiguracyjnych.
- CVE-2026-116019Wysokie
Grav w wersjach 2.0.15 do 2.2.13 zawiera podatność obejścia listy dozwolonych, która pozwala edytorom stron wywoływać dowolne publiczne metody statyczne poprzez przenoszenie dyrektyw data-*@ z kluczami unset-name@ lub całkowitoliczbowymi. Atakujący z uprawnieniami do edycji stron mogą osadzać spreparowane pola w nadpisaniach formularzy Flex w frontmatterze strony, aby wywołać metody takie jak Folder::delete lub Utils::download, usuwając katalogi, nadpisując pliki lub czytając pliki poza drzewem stron.
- CVE-2026-114660Średnie
Grav od wersji 2.0.0 przed 2.2.5 zawiera lukę w kontroli dostępu w FlexDirectory::dynamicFlexField(), która pozwala autorom stron wywoływać dowolne metody obiektów Flex poprzez dyrektywy flex-*@ w frontmatterze strony. Gdy użytkownik z prawem edycji strony otwiera stronę, dyrektywy wywołujące setStorageKey() i delete() wykonują się w jego sesji, usuwając chronione strony, których żadne z kont nie może usunąć.
- CVE-2026-114657Średnie
Grav w wersjach od 2.0.0 do przed 2.2.5 zawiera podatność ujawnienia informacji, która pozwala autorom stron przechwytywać dane uwierzytelniające HTTP Basic odwiedzających poprzez treść strony Twig. Autorzy mogą wypisać obiekt request Uri, zawierający PHP_AUTH_USER i PHP_AUTH_PW, wewnątrz wbudowanego stylu obrazu tła, aby eksfiltrować dane uwierzytelniające administratorów na zewnętrzny host.
Oryginalny opis (angielski, źródło NVD)
Grav is a flat-file CMS. In versions 2.0.19 through 2.0.24 — and in 2.0.0 through 2.0.18 and 1.7.x only where content Twig has been explicitly enabled — page content authored by a user holding only page-write permission is rendered through a Twig sandbox that allowlists get_cookie(), which returns any cookie sent with the current request, including the visitor's session cookie. Because the read occurs server-side via filter_input(INPUT_COOKIE, ...), the HttpOnly, Secure and SameSite attributes offer no protection. Grav then stores the finished post-Twig output in a page-content cache keyed only on page identity and the configuration checksum, with no session, user or request dimension and no bypass for authenticated visitors. A page published by a page-write user can therefore capture the session identifier of the next administrator who views it, after which the cached output serves that identifier to unauthenticated visitors, who can replay the cookie to authenticate as that administrator. Since 2.0.19, security.twig_content.process_enabled defaults to true and Security::applyTwigContentDefault() derives each page's process.twig flag from that gate, so content Twig runs on every page with no frontmatter or operator action. Fixed in 2.0.25; 1.7.x is outside the backport scope.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

