Новоразкрита двойка уязвимости в слоя на драйвера за бази данни на PHP показва, че дори добре тестваният код може да крие опасни изненади.

Грешките се намират в PHP Data Objects (PDO) – абстракционния слой, който уеб приложенията използват за комуникация с бази данни като Firebird и PostgreSQL. Нискоуровневи особености в тези драйвери позволяват на атакуващите да прокарат зловреден вход покрай защитните механизми.

Първият проблем засяга драйвера pdo_firebird и отваря вратата за SQL инжекция чрез NUL байтове, скрити в правилно екранирани низове. Вторият дефект засяга pdo_pgsql, PostgreSQL драйвера на PHP, и може да срине процеса на приложението, предизвиквайки отказ от услуга (DoS). И двете грешки са допуснати, тъй като слоят на драйвера се е предоверил на предположения за обработката на C-низове, които невинаги са верни.

Изследователите Алексей Соловев и Никита Свешников от PT Swarm идентифицираха проблемите по време на одит на PDO и поддържащите го драйвери. Техният преглед надхвърли собствената кодова база на PHP и обхвана клиентски библиотеки на трети страни, от които PDO зависи, разкривайки слабости, останали незабелязани с години. От PT Swarm посочват, че сигурността на базите данни в PHP зависи толкова от вътрешната структура на драйверите, колкото и от кода на самото приложение.

Въздействието е значително, тъй като Firebird и PostgreSQL се използват широко в производствени среди – от вътрешни инструменти до платформи за електронна търговия. Успешна SQL инжекция може да разкрие чувствителни данни или напълно да заобиколи удостоверяването на идентичността. Грешката за отказ от услуга може да бъде задействана чрез изпращане на деформиран вход, което срива PHP процеса по средата на трансакция и оставя базите данни в несъгласувано състояние.

Първата уязвимост, проследявана като CVE-2026-25289 и класифицирана с висока степен на сериозност (High), се дължи на начина, по който драйверът pdo_firebird възстановява SQL заявките, след като те вече са били екранирани. Разработчиците често приемат, че извикването на PDO::quote преди PDO::prepare е напълно безопасно, но проучването показва обратното. Екранирането работи правилно, но последващ етап на предварителна обработка мълчаливо нарушава границите на низа.

Коренът на проблема е в използването на C функцията strncat, която спира копирането на данни в момента, в който срещне NUL байт, игнорирайки дължината, която е инструктирана да копира. Ако екранираната стойност съдържа NUL байт, затварящата кавичка се изпуска при реконструкцията и контролираните от атакуващия данни попадат в изпълнимия SQL код. Разработчиците на PHP отстраниха проблема в редовна актуализация на сигурността, пренаписвайки логиката на Firebird драйвера за използване на двоично безопасен метод.

Втората уязвимост, CVE-2026-25290 (оценена с moderate/средна степен на сериозност и CVSS резултат около 7.3), засяга драйвера pdo_pgsql, когато са изрично активирани емулирани подготвени заявки (emulated prepared statements). При тази настройка, ако даден параметър съдържа невалидна последователност от мултибайтови знаци за текущото кодиране на връзката, библиотеката libpq се проваля без предупреждение и връща NULL стойност. Парсерът на PDO се опитва да прочете дължината на тази NULL стойност, което води до разименуване на нулев указател (null pointer dereference) и незабавна грешка при сегментиране (segmentation fault).

Фиксът, пуснат в същата координирана актуализация, гарантира, че драйверът проверява за екранирана NULL стойност преди разименуване, превръщайки фаталния срив в уловима грешка на приложението. Разработчиците се съветват да обновят PHP версиите си, да избягват емулирани подготвени заявки, когато не са нужни, и да обвиват критичните работни процеси в атомни трансакции.