Уязвимость CVE-2026-107373 в ExtUtils::Typemaps::STL::String для Perl: чтение длины SV до строкового преобразования аргумента
В модуле ExtUtils::Typemaps::STL::String для Perl (версии до 1.06) обнаружена уязвимость в typemap T_STD_STRING. Из-за неопределённого порядка вычисления аргументов C++ некоторые компиляторы могут вызвать SvCUR до строкового преобразования, что приводит к аварийному завершению или segfault программы. Проблема касается разработчиков и сборщиков Perl-модулей, использующих данный typemap.
Подробности
Уязвимость затрагивает ExtUtils::Typemaps::STL::String версий ранее 1.06. В основе проблемы лежит фрагмент кода typemap:$var = std::string( SvPV_nolen($arg), SvCUR($arg) )
Стандарт C++ не определяет порядок вычисления аргументов функции. Это означает, что компилятор вправе вычислить SvCUR($arg) раньше, чем SvPV_nolen($arg). Функция SvPV_nolen выполняет строковое преобразование аргумента и возвращает указатель на строку, тогда как SvCUR возвращает текущую длину скаляра в байтах, предполагая, что скаляр уже является строкой.
Если $arg не является строкой — например, это целое число, число с плавающей точкой или ссылка — вызов SvCUR до строкового преобразования возвращает некорректное значение длины. В результате программа может аварийно завершиться или получить ошибку сегментации (segfault). Уязвимость классифицируется как проблема неопределённого поведения при вычислениях; значение CVSS в записи CVE не указано.
Стоит отметить, что проявление дефекта зависит от конкретного компилятора и уровня оптимизации: одни сборки могут работать корректно, другие — падать при передаче нестроковых аргументов. Это затрудняет диагностику и делает проблему особенно коварной для проектов, распространяемых в виде исходного кода.
Что делать
Основная рекомендация — обновить ExtUtils::Typemaps::STL::String до версии 1.06 или более поздней, в которой порядок вычисления аргументов приведён к корректному виду. Обновление доступно через стандартные каналы распространения Perl-модулей (CPAN). Если обновление невозможно в короткие сроки, можно рассмотреть следующие митигации:- Убедиться, что во все вызовы с typemap T_STD_STRING передаются исключительно строковые значения Perl, избегая целых чисел, чисел с плавающей точкой и ссылок.
- Провести проверку входных данных на стороне XS-кода перед вызовом typemap, чтобы гарантировать строковый тип аргумента.
- Пересобрать зависимые модули после обновления библиотеки, так как исправление затрагивает этап компиляции.
Итог
CVE-2026-107373 — неприятный пример уязвимости, связанной с неопределённым порядком вычислений в C++. Она не позволяет удалённо выполнить код, но способна вызвать отказ в обслуживании приложения при обработке нестроковых аргументов. Разработчикам Perl-расширений, использующим ExtUtils::Typemaps::STL::String, следует как можно скорее обновиться до версии 1.06 и пересобрать свои модули, чтобы исключить вероятность аварийного завершения на отдельных компиляторах.Источник: CVE Project (cvelistV5)
