Planetahost VPS
Перейти к основному контенту

Уязвимость PDO Firebird в PHP (CVE-2025-14179)

Информация об уязвимости
Дата публикации 10 мая 2026
CVE CVE-2025-14179
Продукт PHP (драйвер PDO Firebird)
Тип уязвимости SQL-инъекция (CWE-89)
Уровень опасности Критический
Вектор атаки Удалённо через веб-приложение
Требуется аутентификация Зависит от логики приложения
Уязвимые версии PHP 8.2 < 8.2.31
PHP 8.3 < 8.3.31
PHP 8.4 < 8.4.21
PHP 8.5 < 8.5.6
Исправлено в PHP 8.2.31, 8.3.31, 8.4.21 и 8.5.6

Введение

В 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-запросов, поскольку такой подход исключает подобные ошибки независимо от особенностей реализации конкретного драйвера.