← Wszystkie artykuły
2026-06-18

CVE-2026-40455: SQL injection w filtrze taryf LMS

Opis podatności

Po publikacji wspólnego advisory CERT Polska dla trzech podatności w LMS (LAN Management System) poniżej znajduje się opis przyczyny CVE-2026-40455 bez publikowania payloadów. W tym przypadku istotne były: źródło danych, brak wymuszenia typu oraz miejsce, w którym lista identyfikatorów została użyta przy budowie zapytania SQL.

CVE-2026-40455 dotyczy modułu tarifflist.php. Wejściem była lista tagów taryfowych tg[]. Aplikacja traktowała tę listę jak zbiór identyfikatorów, ale przed dalszym użyciem nie wymuszała, aby każdy element był liczbą całkowitą.

Przepływ danych

Istotny przepływ wyglądał następująco:

  • tg[] z POST albo zapamiętanej sesji
  • przekazanie listy do logiki GetTariffList(...)
  • złożenie listy przez implode(',', $tags)
  • użycie wyniku w zapytaniu, w miejscu oczekującym identyfikatorów tagów

Źródłem problemu był brak walidacji typu dla elementów listy. Aplikacja oczekiwała identyfikatorów liczbowych, ale przed złożeniem klauzuli IN (...) nie wymuszała, aby każdy element listy był liczbą całkowitą.

CVSS v4 opublikowany przez CNA to 8.6 HIGH z AV:A/PR:L/UI:N. Nie jest to scenariusz AV:N/PR:N: atakujący potrzebuje niskich uprawnień w LMS oraz osiągalności komponentu zgodnej z AV:A. Wpływ dotyczy danych w podatnym systemie (VC:H/VI:H/VA:L), bez wpływu na kolejne systemy (SC/SI/SA:N).

Co zmienił patch

Commit 4cb30a7 dodaje wymuszenie liczb całkowitych przez Utils::filterIntegers($tags). Poprawka znajduje się przed dalszym użyciem listy tagów, czyli przed miejscem, w którym dane wejściowe mogą trafić do składania warunku SQL.

Wniosek z tego przypadku jest prosty: wartości poprawne w interfejsie użytkownika nie są gwarancją poprawnych danych po stronie backendu. Jeżeli backend oczekuje listy identyfikatorów, musi sam wymusić typ danych przed przekazaniem ich do warstwy SQL.

Źródła