CVE-2026-67579
WysokieCVSS 7.4Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 49 - wyżej niż 49% wszystkich znanych CVE
Streszczenie
Podatność na deserializację niezaufanych danych w ash-project ash pozwala nieuwierzytelnionemu atakującemu wstrzyknąć wyrażenie filtru przez sfałszowany kursor paginacji keyset, co może prowadzić do wstrzyknięcia SQL lub wykonania kodu w zależności od warstwy danych. Akcje odczytu z paginacją keyset dekodują kursor dostarczony przez klienta w decode_values/2 w lib/ash/page/keyset.ex przy użyciu non_executable_binary_to_term/2 z [:safe], co blokuje nowe atomy, funy i porty, ale nie struktury zbudowane z atomów już zainternowanych w działającej aplikacji Ash, więc zdekodowane wyrażenie %Ash.Query.Call{} przetrwa i jest wstawiane do filtra keyset jako wartość porównania w do_filters/4 i oceniane. Ponieważ kursor omija makro Ash.Expr, środowisko wykonawcze nigdy nie stosuje bramki private?/public?, która mogłaby je odrzucić. Na AshPostgres wstrzyknięty fragment jest wstawiany do zapytania SQL; na warstwach danych ETS i Simple jest oceniany w procesie jako dowolne wywołanie funkcji. Problem dotyczy ash od 1.17.0 przed 3.31.3.
Ocena ryzyka
Ryzyko wstrzyknięcia SQL lub zdalnego wykonania kodu, co może prowadzić do naruszenia integralności danych i przejęcia systemu.
Rekomendacja
Zaktualizuj bibliotekę ash do wersji 3.31.3 lub nowszej, która zawiera poprawkę zabezpieczającą deserializację kursorów.
Inne podatności w ash
Zobacz wszystkie- CVE-2026-96581Wysokie
W bibliotece Ash (projekt ash-project) występuje obejście autoryzacji przez klucz kontrolowany przez użytkownika. W ramach multitenancy atrybutowej akcje create z upsert? true mogły aktualizować rekordy innego tenanta i zwracać ich atrybuty, a domyślne pola upsert przenosiły rekord do tenanta wywołującego. Problem dotyczy wersji od 1.22.0 przed 3.37.2.
- CVE-2026-114214Średnie
Podatność nieprawidłowej autoryzacji w bibliotece ash pozwala klientowi odczytać rekordy docelowe niezwiązane z rekordem źródłowym poprzez relację through. Przy ładowaniu relacji has_many z through: dla pojedynczego rekordu z limitem 1 lub nieposortowanej relacji has_one through z limitem 1, wybierana jest ścieżka odczytu celu bez filtra łączącego go ze źródłem, co zwraca pierwszy rekord docelowy według sortowania lub inny rekord z offsetem.
- CVE-2026-101028Średnie
Biblioteka ash (wersje od 2.6.0 przed 3.34.6) zawiera podatność typu nieprawidłowa autoryzacja, która pozwala aktorowi wywnioskować dane z powiązanych rekordów, których nie może odczytać, poprzez Ash.count/2, Ash.exists/2 i Ash.aggregate/3. Ścieżka agregacji stosowała tylko politykę odczytu zasobu głównego, pomijając polityki odczytu zasobów powiązanych, co umożliwia testowanie warunków na ukrytych wierszach i odzyskiwanie ich istnienia oraz wartości atrybutów.
- CVE-2026-94201Wysokie
Ash przechowuje atrybuty typu :atom jako ciągi znaków i porównuje je jako ciągi. Gdy taki atrybut jest używany w filtrze, wartość porównania jest przekształcana przez Ash.Type.Atom. Ponieważ typ nie definiował wywołania zwrotnego coerce/2, przekształcenie spadało do domyślnego (cast_input/2), które wywołuje String.to_atom/1, gdy atrybut jest skonfigurowany z ograniczeniem unsafe_to_atom?: true. Filtrowanie takiego atrybutu za pomocą ciągów kontrolowanych przez atakującego powodowało internowanie nowego, trwałego atomu dla każdej odrębnej wartości. Atomy nigdy nie są usuwane przez garbage collector, a BEAM ogranicza tabelę atomów, więc aktor mogący dostarczać wartości filtrów dla publicznego, filtrowalnego atrybutu :atom zadeklarowanego z unsafe_to_atom?: true może wyczerpać tabelę atomów i spowodować awarię węzła (odmowa usługi). AshPaperTrail jest godnym uwagi przykładem: jego zasoby wersji domyślnie udostępniają publiczny, filtrowalny atrybut atomowy version_action_name z unsafe_to_atom?: true. Poprawka dodaje coerce/2 do Ash.Type.Atom, które nigdy nie internowuje atomów — wartość porównania pozostaje ciągiem, ponieważ typ jest przechowywany i porównywany jako ciąg. Ustawianie atrybutu z danych wejściowych akcji (cast_input/2, które nadal respektuje unsafe_to_atom?) pozostaje bez zmian. Problem dotyczy ash: od 3.5.1 przed 3.34.3.
- CVE-2026-93477Średnie
Podatność w bibliotece Ash pozwala użytkownikowi ustawić wartość prywatnego argumentu akcji na ścieżkach masowego usuwania i masowej aktualizacji. Argumenty zadeklarowane jako public?: false powinny być ustawiane tylko przez zaufany kod serwerowy, ale brak sprawdzenia public? w tych ścieżkach umożliwia ich modyfikację z danych wejściowych użytkownika.
- CVE-2026-86338Średnie
W Ash przed wersją 3.33.4, polityki pól (field_policies) mają chronić przed ujawnianiem informacji przez filtry, ale nilling (zastępowanie wartością nil) był stosowany tylko do atrybutów, nie do obliczeń (calculations) ani agregatów (aggregates). Użytkownik może odwołać się w filtrze do obliczenia lub agregatu, którego nie może zobaczyć, i użyć filtra jako wyroczni do odczytania chronionej wartości (np. filter(secret_calc == "x")).
- CVE-2026-82752Średnie
Nieprawidłowa walidacja określonej ilości w danych wejściowych w ash-project ash pozwala atakującemu na przechowywanie wartości o dowolnym rozmiarze w atrybucie, którego ograniczenie długości powinno ją ograniczać. Ash mierzy długość stringa za pomocą String.length/1 z Elixira, która liczy grafy Unicode, w ograniczeniach max_length i min_length Ash.Type.String, w Ash.Resource.Validation.StringLength oraz w funkcji wyrażenia string_length. Graf może zawierać nieograniczoną liczbę znaków łączących, więc podstawowy znak z milionem akcentów ostrych to jeden graf i megabajty danych, spełniający max_length: 2. Tam, gdzie warstwa danych nie nakłada niezależnego limitu (ETS, Mnesia lub kolumna text w Postgresie), cała wartość jest zapisywana, więc atakujący może zapisać całe ciało żądania do atrybutu z małym maksimum i nieograniczenie zwiększać pamięć. Jednostka liczenia różni się również od warstwy przechowywania, która liczy punkty kodowe, a nie grafy, więc wartość zaakceptowana przez ograniczenie może zostać odrzucona lub obcięta przez kolumnę. Kolumna varchar(n) w Postgresie ogranicza samą wartość i nie jest narażona. Problem dotyczy ash: od 0.10.0 przed 3.33.0.
- CVE-2026-82747Średnie
Podatność nieprawidłowej autoryzacji w ash-project ash zwraca rekordy, które polityka odczytu w czasie wykonania (runtime read policy) odmawia każdemu aktorowi. Gdy zasób ma politykę odczytu typu :runtime (sprawdzaną per rekord, a nie kompilowaną do filtra), Ash.Policy.Authorizer decyduje o każdym rekordzie w check_result/1, odrzucając niemożliwe scenariusze polityki i sprawdzając, co pozostaje. Gdy każdy scenariusz dla rekordu był niemożliwy, co oznacza, że żadna polityka nie może go autoryzować i musi być zabroniony, gałąź pustego scenariusza zamiast tego zachowywała rekord i zwracała go jako autoryzowany. Poprawka zabrania rekordu, którego wszystkie scenariusze są niemożliwe. Problem dotyczy ash od 3.4.44 przed 3.32.2.
- CVE-2026-82749Średnie
W bibliotece ash występuje podatność nieprawidłowej autoryzacji, która poszerza filtr zakresu relacji parent(...) tak, że dopasowuje niezamierzone rekordy, gdy nie można rozwiązać odwołania do pola nadrzędnego. W takich przypadkach odwołanie jest rozwiązywane do nil, co powoduje, że predykaty takie jak org_id == parent(org_id) stają się dopasowaniem IS NULL, a warunki typu is_nil(parent(org_id)) aktywują nieograniczoną gałąź, przez co relacja zwraca rekordy, które powinny być wykluczone. Poprawka powoduje błąd odczytu, gdy odwołanie parent(...) nie może być rozwiązane.
- CVE-2026-82748Niskie
Podatność na nieprawidłową autoryzację w ash pozwala na autoryzację agregatu pod jednym działaniem odczytu, a obliczenie go pod innym, co może prowadzić do uruchomienia agregatu z politykami niezgodnymi z działaniem, dla którego był autoryzowany. Może to umożliwić ujawnienie informacji o rekordach, których aktor nie powinien czytać.
Oryginalny opis (angielski, źródło NVD)
Deserialization of Untrusted Data vulnerability in ash-project ash allows an unauthenticated attacker to inject a filter expression through a forged keyset pagination cursor, resulting in SQL injection or code execution depending on the data layer. Read actions with keyset pagination decode the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex using non_executable_binary_to_term/2 with [:safe]. That guard blocks new atoms, funs, and ports, but not a struct built from atoms already interned in a running Ash application, so a decoded %Ash.Query.Call{} expression survives and is spliced into the keyset filter as a comparison value in do_filters/4 and evaluated. Because the cursor bypasses the Ash.Expr macro, the runtime never applies the private?/public? gate that would otherwise reject it. On AshPostgres the injected fragment is inlined into the SQL query; on the ETS and Simple data layers it is evaluated in-process as an arbitrary function call. This issue affects ash: from 1.17.0 before 3.31.3.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

