Переполнение буфера в Perl, связанное с обработкой символов

Опубликованы корректирующие обновления интерпретатора Perl 5.40.2 и 5.38.4, в которых устранена уязвимость (CVE-2024-56406), приводящая к переполнению буфера при транслитерации специально оформленных не-ASCII символов при помощи оператора «tr/../../«. Не исключается возможность эксплуатации уязвимости для организации выполнения своего кода в системе. Проблема проявляется в релизах Perl, начиная с 2021 года и затрагивает стабильные ветки Perl 5.34, 5.36, 5.38 и 5.40. Проследить за устранением уязвимости в дистрибутивах можно на следующих страницах: Debian, Ubuntu, SUSE/openSUSE, Fedora, Arch, FreeBSD. Дистрибутивы на основе RHEL 9 уязвимости не подвержены, так как включают версию Perl 5.32.

Уязвимость затрагивает программы, использующие непроверенные внешние данные во левой части оператора «tr», в которой указывается переменная с данными для замены символов (например, «$external_string =~ tr/a/b/»). В обеспечивающей работу оператора функции S_do_trans_invmap() при обработке некоторых не-ASCII байтов происходит обращение к памяти вне выделенного буфера. Переполнение возникает из-за того, что некоторые последовательности байтов в исходном наборе данных могут быть преобразованы в последовательности UTF-8, для которых требуется два байта вместо одного.

Примечательно, что уязвимость возникла после добавленного в 2020 году изменения, убирающего дополнительную проверку достаточного выделения памяти под предлогом того, что при расчёте размера достаточно округления размера в большую сторону. Для проверки наличия уязвимости можно выполнить код:

   
   perl -e '$_ = "x{FF}" x 1000000; tr/xFF/x{100}/;'

   Segmentation fault (core dumped)

Источник: http://www.opennet.ru/opennews/art.shtml?num=63068