CVE-2026-44646
ŚrednieCVSS 5.3Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 19 - wyżej niż 19% wszystkich znanych CVE
Streszczenie
W wersjach 10.25.7 i poniżej silnik szablonów LiquidJS nieprawidłowo propaguje wartość ownPropertyOnly z kontekstu nadrzędnego, co prowadzi do cichego obejścia zabezpieczeń. W rezultacie, deweloperzy mogą nieświadomie ujawniać właściwości z łańcucha prototypów w niebezpiecznych renderach.
Ocena ryzyka
Organizacje mogą być narażone na wycieki danych z łańcucha prototypów, co może prowadzić do ujawnienia wrażliwych informacji. To stwarza ryzyko dla bezpieczeństwa aplikacji korzystających z LiquidJS.
Rekomendacja
Zaleca się aktualizację do wersji 10.26.0 lub nowszej, aby usunąć tę podatność. Dodatkowo, należy przeanalizować istniejące implementacje w celu zminimalizowania ryzyka wycieków danych.
Inne podatności w LiquidJS
Zobacz wszystkie- CVE-2026-45618Krytyczne
LiquidJS to silnik szablonów zgodny z Shopify/GitHub Pages. Przed wersją 10.26.0 możliwe jest wykonanie dowolnego kodu za pomocą spreparowanych szablonów. Wersja 10.26.0 naprawia ten problem.
- CVE-2026-69222Wysokie
W LiquidJS przed wersją 10.27.2 filtr join w src/filters/array.ts oblicza złożoność na podstawie długości tablicy i separatora, a nie całkowitej długości wygenerowanego ciągu. Filtr concat może tanio podwajać tablice referencji, a następnie join materializuje treść, obciążając tylko liczbę elementów, co pozwala przekroczyć skonfigurowany memoryLimit. Podobny problem ma filtr array_to_sentence_string, co może prowadzić do awarii procesu.
- CVE-2026-61556Wysokie
W LiquidJS od wersji 10.26.0 do 10.27.1 filtr strip_html w src/filters/html.ts może wejść w nieskończoną pętlę, gdy wejściowy ciąg zawiera '<', ma co najmniej jeden poprzedzający znak i nie ma późniejszego '>'. Powoduje to zablokowanie renderowania szablonu i może prowadzić do odmowy usługi przy bardzo krótkim wejściu, np. 'a<'.
- CVE-2026-55575Wysokie
W bibliotece LiquidJS przed wersją 10.27.1 filtr 'pop' alokuje pełną kopię tablicy wejściowej bez uwzględniania limitu pamięci (memoryLimit). Pozwala to na wykonanie szablonu, który alokuje poza budżetem pamięci, np. przez {{ huge_array | pop }}.
- CVE-2026-45617Wysokie
LiquidJS to silnik szablonów kompatybilny z Shopify/GitHub Pages, który w wersjach 10.25.7 i poniżej zawiera filtr strip_html z błędnym wyrażeniem regularnym. To prowadzi do ataku ReDoS poprzez kwadratowe cofanie, co blokuje pętlę zdarzeń Node.js.
- CVE-2026-45357Wysokie
W wersjach 10.25.7 i poniżej silnika szablonów LiquidJS występuje podatność związana z filtrem daty, który nieprawidłowo przetwarza specyfikatory szerokości, co prowadzi do nieograniczonego łączenia ciągów i omijania limitów pamięci oraz renderowania.
- CVE-2026-44645Średnie
W wersjach 10.25.7 i poniżej silnika szablonów LiquidJS istnieje możliwość całkowitego obejścia opcji renderLimit poprzez użycie pustego tagu {% for %} lub {% tablerow %}. To pozwala na nieograniczone zużycie czasu renderowania, co może prowadzić do ataków typu DoS.
- CVE-2026-44644Średnie
LiquidJS, silnik szablonów kompatybilny z Shopify/GitHub Pages, ma podatność na XSS w wersjach 10.25.7 i poniżej z powodu błędu w logice filtru strip_html. Błąd ten pozwala na ominięcie sanitizacji HTML, co umożliwia atakującym wstrzykiwanie złośliwego kodu.
- CVE-2026-41311Wysokie
LiquidJS przed wersją 10.25.7 zawiera podatność na atak DoS poprzez cykliczne odwołania bloków w {% layout %} / {% block %}, co powoduje wyczerpanie pamięci i awarię procesu Node.js.
- CVE-2026-39859Wysokie
LiquidJS przed wersją 10.25.3 ma podatność, która pozwala na odczyt dowolnych plików. Mimo że root jest ustawiony na ograniczenie dostępu, ładowanie plików najwyższego poziomu nie egzekwuje tego ograniczenia. Instancja Liquid skonfigurowana z pustym katalogiem tymczasowym jako root może zwrócić zawartość dowolnych plików.
Oryginalny opis (angielski, źródło NVD)
LiquidJS is a Shopify/GitHub Pages compatible template engine written in pure JavaScript. In versions 10.25.7 and below, Context.spawn() creates a child Context for the {% render %} tag but does not propagate the parent context's resolved ownPropertyOnly value, resulting in a silent bypass. The new context re-derives ownPropertyOnly from opts.ownPropertyOnly (the instance-level option), silently discarding any RenderOptions.ownPropertyOnly override that was supplied to parseAndRender(). As a result, a developer who runs a Liquid instance with the backwards-compatible ownPropertyOnly:false and then locks down an untrusted render with parseAndRender(..., { ownPropertyOnly: true }) still leaks prototype-chain properties from inside any {% render %} partial. This is a distinct exploit surface from the previously identified array-filter variants (where, reject, group_by, find, find_index, has) — the underlying root cause in Context.spawn() is shared, but {% render %} is a separately reachable sink that needs no filter usage. This issue has been fixed in version 10.26.0.

