← Wszystkie CVE
CVE-2026-40455 PUBLISHED HIGH 8.6
Opublikowano: 18 czerwca 2026

Zgłaszający według advisory CERT Polska: Tymoteusz Dominik

Authenticated SQL Injection in LMS tarifflist.php via tg[]

Podsumowanie

W module tarifflist.php lista tagów taryfowych z parametru POST tg[] była używana jako lista identyfikatorów w zapytaniach SQL. Brak wymuszenia typu integer przed złożeniem listy przez implode() pozwalał uwierzytelnionemu użytkownikowi z dostępem do LMS wstrzyknąć fragment zapytania w miejscu klauzuli IN (...).

Szczegóły techniczne

CWE CWE-89: SQL Injection
Wektor CVSS CVSS:4.0/AV:A/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:L/SC:N/SI:N/SA:N
Wynik CVSS 8.6 HIGH
Uprawnienia atakującego (PR) Wymagane
Warunki eksploatacji Wymagane niskie uprawnienia w LMS (PR:L), dostęp do właściwego interfejsu oraz osiągalność komponentu zgodna z AV:A; brak wymaganej interakcji użytkownika (UI:N).
Podatne wersje LMS przed commitem 4cb30a7
Poprawka dostępna od commit 4cb30a7

Przepływ danych i poprawka

Source
POST tg[] / zapamiętana lista tagów
Transformacja
przekazanie listy tagów do GetTariffList(...)
Sink
implode(',', $tags) użyte przy składaniu SQL IN (...)
Fix
Utils::filterIntegers($tags) przed dalszym użyciem listy
Ograniczenie CVSS
AV:A, PR:L, UI:N - wymagane niskie uprawnienia i osiągalność właściwego komponentu

Oś czasu

przed publikacją Zgłoszenie podatności do CERT Polska
18 czerwca 2026 Publikacja advisory CERT Polska
18 czerwca 2026 Publikacja rekordu CVE-2026-40455 i danych CVSS v4

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.