
Воспроизводимая демонстрация на основе Docker повышения привилегий PostgreSQL через неконтролируемый путь поиска (CVE-2018-1058) с сравнением уязвимой и исправленной сред.
Этот репозиторий содержит итоговый отчет и артефакты воспроизводимости для:
CVE-2018-1058: Повышение привилегий в PostgreSQL через неконтролируемый путь поиска
Цель — продемонстрировать ошибку доверия к пути поиска, лежащую в основе CVE-2018-1058, используя безопасное локальное окружение Docker.
Демонстрация не воспроизводит точный исторический путь выполнения pg_dump. Вместо этого она воспроизводит ту же корневую причину, описанную в рекомендациях PostgreSQL: схема, доступная для записи атакующему, содержит похожий объект, и другой сеанс разрешает неквалифицированное имя в этот объект.
.
├── report.pdf
├── docker-compose.yml
├── README.md
└── scripts/
├── init.sql
├── init_safe.sql
├── exploit.sql
├── victim_query.sql
├── verify_qualify.sql
└── fix.sql
Итоговый отчет находится в файле report.pdf. Он включает письменный анализ и скриншоты, соответствующие ожидаемым выводам ниже.
Файл Dockerfile не требуется. Проект использует официальные образы postgres.
Скриншоты встроены непосредственно в report.pdf, поэтому они не предоставляются в виде отдельных файлов изображений.
Установите:
psql, опционально, но рекомендуетсяДемонстрация использует два контейнера PostgreSQL:
Убедитесь, что порты 15432 и 15433 свободны.
Ожидаемый порядок выполнения:
exploit.sql от имени attacker.victim_query.sql от имени victim и наблюдайте префикс CVE-2018-1058 DEMO:.verify_qualify.sql от имени victim и наблюдайте обычный вывод в нижнем регистре.fix.sql от имени postgres.victim_query.sql и наблюдайте обычный вывод в нижнем регистре.exploit.sql на порту 15433 и наблюдайте permission denied for schema public.docker compose up -d pg_vulnerable
docker compose ps
Ожидаемый результат: сервис pg_vulnerable должен быть запущен и привязан к порту 15432.
Проверьте версию PostgreSQL:
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "SELECT version();"
Ожидаемый результат: PostgreSQL 10.2.
docker exec -it cve1058_pg_vulnerable psql -U postgres -d demo_cve1058 -c "\du"
Ожидаемые роли:
postgresattackervictimЗлоумышленник не является суперпользователем PostgreSQL.
Запустите скрипт злоумышленника:
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
Ожидаемый вывод:
CREATE TABLE
GRANT
GRANT
CREATE FUNCTION
Это создает:
public.exploit_log;public.lower(varchar).PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
Ожидаемый вывод:
CVE-2018-1058 DEMO: Alice Demo
CVE-2018-1058 DEMO: Bob Demo
Это показывает, что обычный запрос жертвы разрешил lower(...) в функцию, контролируемую злоумышленником.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U attacker -d demo_cve1058 \
-c "TABLE public.exploit_log;"
Ожидаемый результат: как минимум две строки в public.exploit_log, по одной на каждую строку, обработанную запросом жертвы.
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/verify_qualify.sql
Ожидаемый вывод:
alice demo
bob demo
Это работает, потому что pg_catalog.lower(...) заставляет PostgreSQL использовать встроенную функцию.
PGPASSWORD='postgres' \
psql -h 127.0.0.1 -p 15432 -U postgres -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/fix.sql
Ожидаемый вывод может включать:
DROP FUNCTION
DROP TABLE
REVOKE
REVOKE
Затем повторно выполните запрос жертвы:
PGPASSWORD='VictimPw!ChangeMe' \
psql -h 127.0.0.1 -p 15432 -U victim -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/victim_query.sql
Ожидаемый вывод:
alice demo
bob demo
Функция, контролируемая злоумышленником, удалена, и запрос возвращает обычные строки в нижнем регистре.
docker compose up -d pg_fixed
docker compose ps
Проверьте версию:
docker exec -it cve1058_pg_fixed psql -U postgres -d demo_cve1058 -c "SELECT version();"
Ожидаемый результат: PostgreSQL 10.3.
PGPASSWORD='AttackerPw!ChangeMe' \
psql -h 127.0.0.1 -p 15433 -U attacker -d demo_cve1058 \
-v ON_ERROR_STOP=1 -f scripts/exploit.sql
Ожидаемый вывод:
ERROR: permission denied for schema public
Это означает, что злоумышленник не может создать поддельную функцию в public, поэтому цепочка атаки останавливается до разрешения имени.
Для остановки контейнеров:
docker compose down
Для удаления томов и полного сброса проекта:
docker compose down -v
Эта демонстрация намеренно безвредна. Она не крадет данные, не получает доступ к файлам и не выполняет команды операционной системы.
Эксплойт использует видимый префикс строки и таблицу журнала, чтобы доказать, что PostgreSQL разрешил неквалифицированное имя функции в объект, контролируемый злоумышленником.
Официальный CVE касается pg_dump и других клиентских приложений. Этот репозиторий демонстрирует ту же ошибку доверия к пути поиска в безопасной и воспроизводимой учебной среде.
Если порт уже используется, остановите любой локальный сервис PostgreSQL или измените порты хоста в docker-compose.yml.
Если вывод не соответствует ожидаемым результатам, сбросьте окружение командой:
docker compose down -v
docker compose up -d pg_vulnerable
Если psql не установлен локально, команды проверки версии и ролей все еще можно выполнить с помощью docker exec внутри контейнеров.
Если эксплойт не срабатывает на pg_vulnerable, убедитесь, что база данных была сброшена и что scripts/exploit.sql выполняется до scripts/fix.sql.
| Сервис | Версия | Имя контейнера | Порт хоста | Назначение |
|---|
pg_vulnerable | PostgreSQL 10.2 | cve1058_pg_vulnerable | 15432 | уязвимая демонстрация |
pg_fixed | PostgreSQL 10.3 | cve1058_pg_fixed | 15433 | исправленное/укрепленное сравнение |