CVE-2026-82752
ŚrednieCVSS 5.9Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 3 - wyżej niż 3% wszystkich znanych CVE
Streszczenie
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.
Ocena ryzyka
Atakujący może nieograniczenie zwiększać zużycie pamięci lub dysku, co prowadzi do wyczerpania zasobów i potencjalnej niedostępności usługi (DoS). Ponadto niespójność w liczeniu może powodować błędy w zapisie danych.
Rekomendacja
Zaktualizuj bibliotekę ash do wersji 3.33.0 lub nowszej, która zawiera poprawkę.
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-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ć.
- CVE-2026-82746Średnie
W bibliotece ash występuje podatność braku autoryzacji, która pozwala aktorowi na aktualizację rekordów zabronionych przez polityki zasobów poprzez ścieżkę atomową Ash.update_many/4. Gdy używana jest strategia atomowa, zapytanie aktualizuje wszystkie wiersze pasujące do klucza głównego bez stosowania polityk, co pozwala na modyfikację rekordów należących do innych aktorów lub tenantów. Poprawka ogranicza ścieżkę atomową do warstw danych wspierających filtry changeset, autoryzuje każdy changeset i scala filtr polityki.
Oryginalny opis (angielski, źródło NVD)
Improper Validation of Specified Quantity in Input vulnerability in ash-project ash allows an attacker to store a value of arbitrary size in an attribute whose length constraint should bound it. Ash measures string length with Elixir's String.length/1, which counts Unicode graphemes, in the max_length and min_length constraints of Ash.Type.String (apply_constraints/2 in lib/ash/type/string.ex), in Ash.Resource.Validation.StringLength, and in the string_length expression function. A grapheme carries an unbounded number of combining marks, so a base character followed by a million combining acute accents is one grapheme and megabytes of data, and satisfies max_length: 2. Where the data layer imposes no independent limit (ETS, Mnesia, or a Postgres text column) the whole value is persisted, so an attacker can write an entire request body into an attribute declared with a small maximum and grow storage without bound. The counting unit also disagrees with the storage layer, which counts codepoints rather than graphemes, so a value accepted by the constraint can still be rejected or truncated by the column. A Postgres varchar(n) column bounds the value itself and is not exposed. This issue affects ash: from 0.10.0 before 3.33.0.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

