Уязвимость PDO Firebird в PHP (CVE-2025-14179)
Введение
В PHP обнаружена критическая уязвимость CVE-2025-14179, затрагивающая драйвер PDO Firebird.
Из-за ошибки обработки строк при подготовке SQL-запросов злоумышленник может обойти механизм экранирования PDO::quote() и внедрить собственные SQL-команды в запрос приложения. При успешной эксплуатации это позволяет читать, изменять или удалять данные базы данных.
Что произошло
Причина уязвимости связана с некорректной обработкой нулевого байта (NUL, \0) внутри строк.
Во время формирования SQL-запроса драйвер PDO Firebird собирает запрос по частям. Если одна из строк содержит символ NUL, внутренняя функция strncat() прекращает копирование данных раньше времени.
В результате завершающая кавычка строки не попадает в итоговый SQL-запрос, а последующие фрагменты запроса начинают интерпретироваться как SQL-код.
Из-за этого значение, которое должно было безопасно восприниматься как обычная строка, превращается в часть SQL-запроса, что открывает возможность для SQL-инъекции.
Пример эксплуатации
Предположим, приложение использует следующий код:
$name = PDO::quote($userInput);
$sql = "SELECT * FROM users WHERE name = $name";
Разработчик рассчитывает, что PDO::quote() полностью защитит запрос.
Однако злоумышленник может передать строку, содержащую символ NUL, например:
admin\0' OR 1=1 --
Из-за ошибки драйвера закрывающая кавычка теряется, и часть пользовательского ввода начинает восприниматься как SQL-код.
В результате условие запроса может превратиться в:
WHERE name='admin' OR 1=1 --
Такой запрос возвращает все записи таблицы либо позволяет внедрить произвольные SQL-конструкции, в зависимости от логики приложения.
Почему это опасно
На первый взгляд проблема затрагивает только драйвер PDO Firebird, однако многие разработчики полностью доверяют функции PDO::quote() как средству защиты от SQL-инъекций.
Если приложение самостоятельно формирует SQL-запросы с использованием PDO::quote() вместо подготовленных выражений, ошибка драйвера фактически делает такую защиту неэффективной.
Последствия эксплуатации могут включать:
- чтение конфиденциальных данных;
- изменение содержимого базы данных;
- удаление информации;
- обход механизмов авторизации;
- выполнение дополнительных SQL-запросов при наличии соответствующих возможностей СУБД.
Разработчики PHP уже устранили проблему. Исправление включено в следующие версии:
- PHP 8.2.31 и новее;
- PHP 8.3.31 и новее;
- PHP 8.4.21 и новее;
- PHP 8.5.6 и новее.
Также рекомендуется:
- отказаться от использования
PDO::quote()для защиты пользовательского ввода; - использовать подготовленные выражения (
Prepared Statements) с параметризованными запросами; - проверить приложения, использующие драйвер PDO Firebird;
- как можно скорее установить обновления PHP.
Дополнительно
Несмотря на то что уязвимость затрагивает только драйвер PDO Firebird, её причиной стала ошибка в базовом механизме формирования SQL-запросов. Она наглядно показывает, что даже встроенные функции экранирования не всегда могут гарантировать защиту от SQL-инъекций.
Разработчики PHP рекомендуют использовать подготовленные выражения вместо ручного формирования SQL-запросов, поскольку такой подход исключает подобные ошибки независимо от особенностей реализации конкретного драйвера.