В PHP обнаружены две уязвимости высокой степени опасности, затрагивающие компоненты pgsql и bcmath. Первая из них приводит к SQL-инъекции через неправильное экранирование обратной косой черты, вторая - к записи за пределами буфера при выполнении операции сравнения чисел. Разработчики выпустили исправления в версиях 8.2.33, 8.3.33, 8.4.24 и 8.5.9.
Детали уязвимостей
Проблема в расширении pgsql (CVE-2026-17543) связана с функциями pg_insert(), pg_update(), pg_select() и pg_delete(), которые преобразуют пользовательские параметры с помощью вспомогательной функции php_pgsql_convert(). Эта функция экранирует специальные символы через PQescapeStringConn(), после чего оборачивает результат в так называемую escape-строковую константу E'...'. При стандартном поведении PostgreSQL (параметр standard_conforming_strings включён по умолчанию с версии 9.1) функция PQescapeStringConn() не экранирует обратную косую черту. В результате злоумышленник может завершить строковую константу, вставив в параметр специально сформированную последовательность символов.
Например, при передаче значения "zzz\' OR 1=1 --" (с удвоенной обратной косой чертой в синтаксисе PHP) функция экранирует лишь апостроф (удваивая его), но оставляет обратную косую черту неизменной. После сборки строки получается запрос, в котором первый апостроф оказывается экранирован (воспринимается как литерал), а второй завершает строку. Всё, что следует далее, интерпретируется как часть SQL-запроса, что открывает возможность для SQL-инъекции. Атакующий, контролирующий один из параметров, может выполнить произвольный SQL-код в контексте приложения.
Исправление в коде меняет способ экранирования: теперь php_pgsql_convert() оборачивает параметры в неэкранирующие строковые константы, что исключает описанную проблему. Уязвимость затрагивает все версии PHP до выхода соответствующих патчей: ниже 8.2.33, 8.3.33, 8.4.24 и 8.5.9.
Вторая уязвимость (CVE-2026-17544) обнаружена в расширении bcmath, отвечающем за арифметику чисел произвольной точности. Ошибка происходит в функции bccomp() при вызове с подконтрольными злоумышленнику операндами и параметром масштаба (scale). Внутренняя функция bc_str2num() сначала вычисляет количество цифр после десятичной точки, а затем выделяет буфер для результирующей строки. Если при усечении дробной части (пользователь указал масштаб меньше, чем вычисленное число знаков) удаляются завершающие нули, коррекция значения длины выполняется некорректно: переменная str_scale уменьшается, а указатель на конец дробной части (fractional_end) остаётся прежним. После этого функция копирования данных bc_copy_and_toggle_bcd() считывает исходное количество цифр - большее, чем размер выделенного буфера. Это приводит к записи за пределами выделенной памяти как в стеке, так и в куче, в зависимости от того, где находится буфер.
Такая ошибка может быть использована для повреждения памяти приложения. В худшем случае она способна привести к выполнению произвольного кода или отказу в обслуживании. Уязвимость затрагивает версии PHP ниже 8.4.24 и 8.5.9 - более ранние ветки (8.2, 8.3) не подвержены, так как расширение bcmath претерпело изменения. Разработчики исправили проблему, добавив в код строку, обновляющую указатель fractional_end после удаления завершающих нулей.
Обе уязвимости были выявлены исследователем iluuu1994, который также опубликовал соответствующие уведомления на платформе GitHub Security Advisory. Разработчики PHP оперативно выпустили исправления, и пользователям рекомендуется установить их в кратчайшие сроки. Администраторам серверов следует обновить интерпретатор PHP до указанных версий, особенно если в приложениях используются функции для работы с базами данных PostgreSQL или вычисления с числами произвольной точности.
Эти уязвимости привлекают внимание к двум аспектам безопасности в PHP: корректной обработке экранирования строк при взаимодействии с базами данных и управлению памятью в числовых операциях. SQL-инъекция остаётся одной из самых распространённых атак на веб-приложения, а повреждение памяти может открыть путь к удалённому выполнению кода даже при отсутствии других уязвимостей. Выход обновлений подчёркивает необходимость своевременного обновления критически важных компонентов инфраструктуры, особенно в проектах, активно использующих расширения pgsql и bcmath.
Ссылки
- https://github.com/php/php-src/security/advisories/GHSA-x692-q9x7-8c3f
- https://github.com/php/php-src/security/advisories/GHSA-7qpv-r5mr-78m4