Jedna z bibliotek frameworka Symfony otrzymała ocenę 7.5 w skali CVSS (Common Vulnerability Scoring System — skala 0-10 oceniająca powagę luki). Problem, oznaczony jako CVE (Common Vulnerabilities and Exposures, identyfikator publicznie znanej luki) CVE-2026-49212, dotyczy Symfony UX 1, ekosystemu JavaScript dla aplikacji budowanych w tym popularnym frameworku PHP. Błąd w logice kryptograficznej pozwala na nieautoryzowaną modyfikację stanu komponentów interfejsu użytkownika.

Luka, choć technicznie złożona, ma praktyczne konsekwencje dla bezpieczeństwa aplikacji. Umożliwia atakującemu ponowne wykorzystanie cyfrowo podpisanych fragmentów danych w nieprzewidzianym przez dewelopera kontekście. Może to prowadzić do eskalacji uprawnień w ramach logiki biznesowej aplikacji lub do ominięcia zabezpieczeń na poziomie interfejsu. Problem dotyczy wielu polskich software house’ów i zespołów deweloperskich, które szeroko wykorzystują Symfony do budowy systemów dla klientów z sektora e-commerce i administracji publicznej.

TL;DR

  • Produkt: Symfony UX, komponenty LiveComponent.
  • Wektor: Niewystarczający kontekst w sygnaturze HMAC pozwala na ponowne użycie podpisanych danych (replay attack).
  • Identyfikator: CVE-2026-49212, CVSS 7.5 (High).
  • Podsumowanie IoC: Brak klasycznych wskaźników kompromitacji (IoC). Podatność identyfikuje się przez numer wersji biblioteki symfony/ux.
  • Kogo dotyczy: Aplikacje webowe używające symfony/ux-live-component w wersjach od 2.8.0 do 2.36.0 oraz 3.0.0.
  • Pierwszy ruch reagowania: Aktualizacja pakietu symfony/ux do wersji v2.36.0 lub v3.1.0 za pomocą menedżera zależności Composer.

Wektor ataku

Analiza techniczna wskazuje na błąd w implementacji mechanizmu HMAC (Hash-based Message Authentication Code) w klasie Symfony\UX\LiveComponent\LiveComponentHydrator. Mechanizm ten odpowiada za weryfikację integralności danych przesyłanych między frontendem (przeglądarką użytkownika) a backendem aplikacji w komponentach typu LiveComponent.

Problem polega na tym, że obliczany skrót HMAC obejmował jedynie posortowane pary kluczy i wartości właściwości komponentu 2. W sygnaturze brakowało kluczowych danych kontekstowych, takich jak nazwa samego komponentu, identyfikator slotu (props vs propsFromParent) czy ogólny kontekst żądania 3.

Ta niekompletność sygnatury otwiera drogę do ataku typu „replay”. Atakujący, który jest w stanie pozyskać prawidłowo podpisaną porcję danych (tzw. blob) dla jednego komponentu, może ją następnie „odegrać” w żądaniu skierowanym do zupełnie innego komponentu 4. Jeśli docelowy komponent posiada właściwość o tej samej nazwie co właściwość w skradzionym blobie, system błędnie zaakceptuje tę wartość jako prawidłową. Może to pozwolić na ustawienie wartości właściwości, która w docelowym komponencie powinna być przeznaczona tylko do odczytu 4.

Konsekwencje zależą od logiki biznesowej aplikacji. W scenariuszu pesymistycznym atakujący może w ten sposób zmienić identyfikator użytkownika, numer zamówienia lub flagę administratora w stanie komponentu, omijając logikę walidacji zaimplementowaną w innym miejscu.

Identyfikacja podatności

W tym przypadku nie mówimy o klasycznych wskaźnikach kompromitacji (IoC — Indicators of Compromise), takich jak adresy IP serwerów C2 (Command and Control — serwer kontrolujący zainfekowane maszyny) czy hashe złośliwego oprogramowania. Wskaźnikiem jest sama obecność podatnej wersji oprogramowania w projekcie.

Podatne są następujące wersje pakietu symfony/ux:

  • Wersje od 2.8.0 do 2.36.0 (z wyłączeniem 2.36.0)
  • Wersja 3.0.0

Najprostszym sposobem na sprawdzenie, czy projekt jest podatny, jest użycie wbudowanych narzędzi menedżera pakietów Composer:

# Sprawdzenie zainstalowanej wersji pakietu
composer show symfony/ux-live-component

# Uruchomienie audytu bezpieczeństwa zależności
composer audit

Narzędzie composer audit powinno automatycznie zidentyfikować podatność i wskazać ją jako krytyczną lub o wysokim priorytecie.

Co zrobić w 24-48h

Rekomendowane podejście zakłada natychmiastową aktualizację zależności. Problem został w pełni załatany w nowszych wersjach biblioteki 5.

  1. Aktualizacja zależności: Należy zaktualizować pakiet symfony/ux do wersji v2.36.0 (dla gałęzi 2.x) lub v3.1.0 (dla gałęzi 3.x). Można to zrobić za pomocą polecenia Composera:

    composer update symfony/ux --with-dependencies
  2. Weryfikacja i testy: Po aktualizacji kluczowe jest przeprowadzenie pełnych testów regresji, aby upewnić się, że zmiana nie wpłynęła negatywnie na działanie aplikacji. Szczególną uwagę należy zwrócić na komponenty interaktywne (Live Components).

  3. Audyt kodu (opcjonalnie): Warto przeanalizować istniejące komponenty pod kątem potencjalnego wykorzystania luki w przeszłości. Należy szukać logiki, gdzie zmiana właściwości readonly mogłaby mieć krytyczne znaczenie dla bezpieczeństwa.

  4. Komunikacja w zespole: Polskie software house’y i agencje interaktywne powinny potraktować ten alert jako sygnał do przeglądu wszystkich projektów opartych o Symfony. Samo wdrożenie poprawki nie usuwa skutków ewentualnego wcześniejszego wykorzystania luki. Jeśli istnieją podejrzenia co do incydentu bezpieczeństwa, należy postępować zgodnie z wewnętrzną procedurą reagowania lub skontaktować się z zespołem takim jak CERT Polska.

Atrybucja

Zgodnie z publicznymi danymi, luka została zgłoszona przez GitHub, Inc. w dniu 17 lipca 2026 roku 6.

Źródła

Zobacz też

Przypisy

  1. Symfony UX to ekosystem JavaScript dla Symfony. — nvd.nist.gov › CVE 2026 49212

  2. Od wersji 2.8.0 do 2.36.0 i 3.1.0, HMAC obliczany przez Symfony\UX\LiveComponent\LiveComponentHydrator obejmował tylko posortowane pary klucz/wartość właściwości. — nvd.nist.gov › CVE 2026 49212

  3. HMAC nie zawierał nazwy komponentu, identyfikatora slotu (props vs propsFromParent) ani kontekstu żądania. — nvd.nist.gov › CVE 2026 49212

  4. Pozwalało to na ponowne użycie podpisanego blobu, utworzonego dla jednego komponentu lub slotu, w innym, aby ustawić właściwość tylko do odczytu w docelowym komponencie. — nvd.nist.gov › CVE 2026 49212 2

  5. Problem został naprawiony w wersjach 2.36.0 i 3.1.0. — nvd.nist.gov › CVE 2026 49212

  6. Luka CVE-2026-49212 została zgłoszona przez GitHub, Inc. 17 lipca 2026 roku o godzinie 13:17:15. — nvd.nist.gov › CVE 2026 49212