Opublikowano poprawki do interpreterów Perl 5.40.2 i 5.38.4, które eliminują lukę (CVE-2024-56406) prowadzącą do przepełnienia bufora podczas transliteracji specjalnie sformatowanych znaków nie-ASCII przy użyciu operatora „tr/.../...”. Nie wyklucza się możliwości wykorzystania tej luki do uruchomienia własnego kodu w systemie. Problem występuje w stabilnych wydaniach Perla od 2021 roku i dotyczy gałęzi Perl 5.34, 5.36, 5.38 oraz 5.40. Można śledzić eliminację luki w dystrybucjach na następujących stronach: Debian, Ubuntu, Fedora, Arch, FreeBSD. Dystrybucje oparte na RHEL 9, SUSE 15 oraz openSUSE Leap 15.6 nie są narażone na tę lukę, ponieważ zawierają wersje Perl 5.32 i 5.26.
Luka dotyczy programów, które używają niesprawdzonych zewnętrznych danych w lewej części operatora „tr”, w którym wskazywana jest zmienna z danymi do zamiany znaków (np. „$external_string =~ tr/a/b/”). W funkcji S_do_trans_invmap(), która zapewnia działanie operatora, podczas przetwarzania niektórych bajtów nie-ASCII dochodzi do odwołania do pamięci poza przydzielonym buforem. Przepełnienie występuje, ponieważ niektóre ciągi bajtów w zestawie danych źródłowych mogą być konwertowane na sekwencje UTF-8, które wymagają dwóch bajtów zamiast jednego.
Ciekawe, że luka powstała po wprowadzonym w 2020 roku zmianie, która usunęła dodatkową kontrolę wystarczającego przydziału pamięci pod pretekstem, że przy obliczaniu rozmiaru wystarczające jest zaokrąglenie w górę. Aby sprawdzić, czy luka występuje, można wykonać kod: perl -e ‘$_ = „\x{FF}” x 1000000; tr/\xFF/\x{100};’ Segmentation fault (core dumped)
Źródło: opennet.ru
