
Эксплойт и тестовый стенд для CVE-2025-2945
Это моё исследование по CVE-2025-2945. Этот репозиторий содержит тестовый стенд с PostgreSQL и уязвимым pgAdmin, а также эксплойт.
Полезные ссылки:
В бэкенде pgAdmin, написанном на python, есть две конечные точки, в которых отсутствует должная санитизация. Конечные точки:
/sqleditor/query_tool/download — параметр query_commited/cloud/deploy — параметр high_availabilityПосмотрим на код sqleditor:
for key, value in data.items():
if key == 'query':
sql = value
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
Что мы здесь видим: значение query_commited напрямую передаётся функции eval(). Вы можете посмотреть документацию по eval.
Также посмотрите на код pgacloud:
def _create_google_postgresql_instance(self, args):
credentials = self._get_credentials(self._scopes)
service = discovery.build('sqladmin', 'v1beta4',
credentials=credentials)
high_availability = \
'REGIONAL' if eval(args.high_availability) else 'ZONAL'
Та же проблема здесь.
Тем не менее, для доступа к этим конечным точкам требуются действительные учётные данные и доступ к pgAdmin. Но любой злоумышленник, имеющий к ним доступ, также может передать любое значение в eval. Это равносильно выполнению произвольного однострочного кода на Python.
Эксплуатация довольно прямолинейна. Смотрите exploit/src/main.py. Не забудьте обновить конфигурацию, чтобы получить обратную оболочку.
Чтобы настроить стенд, выполните:
cd stand
docker compose up -d
И всё. pgAdmin теперь доступен по адресу http://localhost:8080. Учётные данные по умолчанию:
[email protected]
admin
Не стесняйтесь редактировать файл .env и stand/init-db/01-init.sql.
создано I3r1h0n.