CVE-2026-70395
NiskieCVSS 2.1Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 4 - wyżej niż 4% wszystkich znanych CVE
Streszczenie
Podatność nieprawidłowej neutralizacji specjalnych elementów w logice zapytań danych w ash-project ash pozwala atakującemu sfałszować relację do rekordu, którego nie zna, oraz odzyskać sekretną wartość używaną do jego wyszukania. Gdy manage_relationship jest używane z on_lookup: :relate na relacji belongs_to, wartość lookup dostarczona przez klienta jest przekazywana do Ash.Query.filter/2 bez rzutowania na typ atrybutu. Zagnieżdżona mapa przesłana tam, gdzie oczekiwany jest skalar, jest interpretowana jako predykat filtra, a nie literał, więc wyszukiwanie konkretnego rekordu staje się zapytaniem o dowolny rekord spełniający warunek. Ta sama ścieżka pomija Ash.Query.limit(1), pozostawiając Ash.read_one/2 zdolnym do rozróżnienia braku dopasowania od jednego dopasowania od kilku, co zamienia predykaty porównawcze w wyrocznię dla wartości lookup. Autoryzacja nie jest naruszona; polityka odczytu docelowego nadal obowiązuje.
Ocena ryzyka
Atakujący może manipulować zapytaniami, aby uzyskać dostęp do rekordów, do których nie powinien mieć dostępu, oraz odzyskać sekretne wartości, co może prowadzić do naruszenia poufności danych.
Rekomendacja
Zaktualizuj bibliotekę ash do wersji 3.31.1 lub nowszej, która zawiera poprawkę. Upewnij się, że wartości lookup są rzutowane na odpowiednie typy atrybutów.
Oryginalny opis (angielski, źródło NVD)
Improper Neutralization of Special Elements in Data Query Logic vulnerability in ash-project ash allows an attacker to forge a relationship to a record they cannot name, and to recover the secret value used to look it up. When manage_relationship is used with on_lookup: :relate on a belongs_to relationship, the client-supplied lookup value is passed to Ash.Query.filter/2 without being cast to the attribute type. A nested map submitted where a scalar is expected is therefore interpreted as a filter predicate rather than a literal, so a lookup for a specific record becomes a query for any record matching a condition. The same path omits Ash.Query.limit(1), leaving Ash.read_one/2 able to distinguish no match from one match from several, which turns comparison predicates into an oracle for the lookup value. Authorization is unaffected; the destination read policy still applies. This issue affects ash: from 1.52.0-rc.11 before 3.31.1.

