Эмуляция и анализ proof-of-concept для CVE-2025-1094, критической уязвимости SQL-инъекций в PostgreSQL. Включает Docker-лабораторию, эксплойт-скрипт, анализ первопричины и пошаговую демонстрацию для тестирования безопасности и обучения.
Этот детальный анализ, проведенный 14 марта 2025 года, исследует CVE-2025-1094 — гипотетическую уязвимость SQL-инъекции высокой степени серьезности в PostgreSQL, основанную на предоставленной настройке эмуляции и выполнении доказательства концепции (PoC). Анализ охватывает введение в уязвимость, первопричину, вклад файлов, шаги PoC и меры смягчения, включая все сложные детали процесса эмуляции.
CVE-2025-1094 описывается как критическая ошибка SQL-инъекции в PostgreSQL, затрагивающая версии до 17.3, 16.7, 15.11, 14.16 и 13.19, с базовой оценкой CVSS 3.1 равной 8.1, что указывает на значительное влияние на конфиденциальность, целостность и доступность. Она позволяет злоумышленникам получать доступ к конфиденциальным данным или выполнять удаленный код (RCE) и была использована в реальных атаках, таких как инцидент с BeyondTrust, затронувший 17 корпоративных клиентов, о котором сообщалось на BleepingComputer, и утечка в Казначействе США, описанная в The Register. Эмуляция, проведенная 14 марта 2025 года, использовала Docker с server_encoding=EUC_TW и client_encoding=BIG5, что было критически важно для активации эксплойта. PoC включал внедрение блока DO для создания большого объекта, чтение /etc/passwd через , запись его в большой объект с помощью и экспорт в с использованием , что подтверждает роль несоответствия кодировок в обеспечении несанкционированного доступа к файлам.
pg_read_filelo_put/tmp/payloadlo_exportПервопричина классифицируется как CWE-149: Improper Neutralization of Quoting Syntax (неправильная нейтрализация синтаксиса кавычек), что связано с некорректной обработкой в функциях libpq PostgreSQL — PQescapeLiteral(), PQescapeIdentifier(), PQescapeString() и PQescapeStringConn() — которые не нейтрализуют синтаксис кавычек, когда результаты используются для построения ввода для инструмента командной строки psql. Это усугубляется, когда client_encoding установлен в BIG5, а server_encoding — в EUC_TW, как в нашей настройке, что позволяет SQL-инъекцию. Для эмуляции требовались EUC_TW и zh_TW.EUC_TW для создания несоответствия, при этом проблемы, такие как отсутствие поддержки EUC_TW в psycopg2, решались подключением через UTF8 с последующим переключением на BIG5. Успех эксплойта зависел от выполнения необработанного SQL через subprocess.run(["psql", ...]), что обходило безопасную обработку запросов, как подробно описано в журналах.
Каждый файл в настройке играет решающую роль в эмуляции CVE-2025-1094. Ниже приведен подробный разбор в табличной форме:
| Файл | Что он делает | Вклад в PoC | Зачем он нужен |
|---|---|---|---|
exploit.py | Отправляет POST-запрос с блоком DO для создания и экспорта большого объекта, читая /etc/passwd. | Запускает SQL-инъекцию, использует несоответствие кодировок для выполнения произвольных SQL-команд. | Обеспечивает выполнение эксплойта, критично для воздействия PoC. |
app.py | Flask-приложение, предоставляющее /vuln-endpoint, выполняет необработанный SQL через psql. | Предоставляет уязвимую конечную точку для эксплойта. | Точка входа для эксплойта, необходима для демонстрации уязвимости. |
init.sql | Создает тестовую таблицу с id VARCHAR(255) для строковых входных данных. | Настраивает схему для инъекции, обеспечивает выполнение полезной нагрузки без ошибок типов. | Настройка базы данных для эксплойта, необходима для SQL-инъекции. |
Dockerfile | Создает контейнер Flask-приложения с необходимыми зависимостями. | Создает изолированный сервис приложения для развертывания конечной точки. | Развертывает уязвимое приложение, критично для воспроизводимости PoC. |
docker-compose.yml | Определяет и связывает сервисы db и app с определенными конфигурациями. | Оркестрирует настройку, обеспечивает несоответствие кодировок и зависимости сервисов. | Связывает сервисы, необходим для настройки среды и изоляции. |
Dockerfile.db | Создает контейнер PostgreSQL с кодировкой EUC_TW. | Создает уязвимую базу данных с требуемой кодировкой. | Настраивает базу данных с требуемой кодировкой, критично для активации уязвимости. |
PoC, выполненный 14 марта 2025 года, демонстрирует воздействие эксплойта с помощью следующих шагов, каждый с подробным объяснением:
sudo docker compose up --build
db и app), создавая контейнеры с обновленными образами при необходимости, и связывает их в сети postgre_default. Обеспечивает настройку уязвимой среды, где db использует кодировку EUC_TW, а app предоставляет /vuln-endpoint на порту 5000, что критически важно для несоответствия кодировок эксплойта и доступа к конечной точке.curl -X POST http://localhost:5000/vuln-endpoint -d "input=test"
input=test, проверяя связь и базовую функциональность, ожидая ответ "Executed". Подтверждает, что приложение запущено и может подключаться к базе данных, гарантируя готовность настройки к эксплойту.
python3 cve-2025-1094-exploit.py
/etc/passwd и экспорта в /tmp/payload, выводя статус выполнения. Запускает SQL-инъекцию, используя уязвимость для чтения /etc/passwd, что критически важно для демонстрации воздействия CVE-2025-1094, как видно из журналов с успешным экспортом файла.
sudo docker ps
postgre-app-1 и postgre-db-1 работают. Подтверждает настройку перед запуском эксплойта, гарантируя активность обоих сервисов, что критически важно для надежности PoC. Предоставляет пользователю идентификатор контейнера, необходимый для последующих команд.sudo docker exec -it bash -c "LC_ALL=C ls -l /tmp/payload && LC_ALL=C cat /tmp/payload"
postgre-db-1, выводя список и содержимое /tmp/payload на английском языке, проверяя результат эксплойта (должен отображать /etc/passwd). Подтверждает, что эксплойт сработал, проверяя файл, гарантируя, что /tmp/payload содержит конфиденциальные данные, что соответствует проверке PoC, и избегает искажения локали с помощью LC_ALL=C.
sudo docker exec -it psql -U postgres -d postgres -c "SELECT * FROM test;"
test, проверяя INSERT из эксплойта (должен показывать "Exploit ran with loid ..."). Подтверждает модификацию базы данных эксплойтом, гарантируя выполнение блока DO, что соответствует проверке PoC и валидирует журналирование loid.sudo docker compose down
Demonstration Video on Vimeo
Нажмите, чтобы посмотреть демонстрацию PoC на Vimeo.
Для смягчения CVE-2025-1094 рекомендуются следующие меры, основанные на результатах эмуляции и отраслевых рекомендациях:
psql только доверенными пользователями, уменьшая поверхность атаки.