Сценарий 16: Обнаружение точки входа¶
Инженер по безопасности, осуществляющий картирование поверхности атаки и границ API.
Содержание¶
- Быстрый старт
- Картографирование поверхности атаки
- Сетевые точки входа
- Точки входа в файловой системе
- Анализ границ API
- Публичные функции API
- Внутренние границы API
- Анализ границ доверия
- Пути повышения привилегий
- Обработчики недоверенных входных данных
- Примеры вопросов
- Команды CLI
- Связанные сценарии
Быстрый старт¶
# Выберите сценарий точек входа
/select 16
Карта поверхности атаки¶
Точки сетевого доступа¶
> Найти все точки входа, доступные через сеть
╭─────────────── Точки сетевого доступа ───────────────────────╮
│ │
│ Точки входа, доступные через сеть: │
│ │
│ Уровень сетевого протокола: │
│ ProcessStartupPacket() - Установление соединения │
│ ProcessClientRead() - Основной приём данных │
│ pq_getmsgstring() - Чтение строки от клиента │
│ pq_getmsgint() - Чтение целого числа от клиента │
│ │
│ Обработка запросов: │
│ exec_simple_query() - Прямое выполнение SQL │
│ exec_parse_message() - Подготовленный запрос │
│ exec_bind_message() - Привязка параметров │
│ exec_execute_message() - Выполнение подготовленного │
│ │
│ Репликация: │
│ WalSndWaitForWal() - Потоковая передача WAL │
│ ProcessWalRcvInterrupts() - Приём WAL │
│ │
│ Общее количество сетевых точек входа: 23 │
│ │
╰──────────────────────────────────────────────────────────────╯
Точки доступа к файловой системе¶
> Найти точки доступа к файловой системе
╭─────────────── Точки доступа к файловой системе ─────────────╮
│ │
│ Точки доступа к файловой системе: │
│ │
│ Вызываемые через SQL функции: │
│ pg_read_file() - Чтение произвольного файла │
│ pg_read_binary_file() - Чтение бинарного файла │
│ pg_ls_dir() - Список содержимого каталога │
│ pg_stat_file() - Получение статистики файла │
│ │
│ Команда COPY: │
│ DoCopy() → CopyFrom() - Чтение из файла │
│ DoCopy() → CopyTo() - Запись в файл │
│ │
│ Загрузка расширений: │
│ load_external_function() - Загрузка разделяемой библиотеки │
│ pg_dlopen() - Динамическая загрузка библиотек │
│ │
│ Уровень риска: ВЫСОКИЙ │
│ Требуется: Права суперпользователя для большинства операций │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ границ API¶
Публичные функции API¶
> Перечислить все точки входа публичного API
╭─────────────── Публичный API ──────────────────────────────────╮
│ │
│ API расширения PostgreSQL: │
│ │
│ Экспортированные функции PG_FUNCTION_INFO_V1: 1234 │
│ │
│ Категории: │
│ Типы данных: 234 функции │
│ Операторы: 189 функций │
│ Агрегатные: 67 функций │
│ Оконные: 23 функции │
│ Процедурные: 45 функций │
│ │
│ Интерфейс SPI (внутренний API расширений): │
│ SPI_connect() - Подключение к SPI │
│ SPI_execute() - Выполнение SQL │
│ SPI_prepare() - Подготовка запроса │
│ SPI_finish() - Отключение от SPI │
│ │
│ Точки перехвата (Hook Points): │
│ ProcessUtility_hook - Обработка служебных команд │
│ ExecutorRun_hook - Выполнение запросов │
│ planner_hook - Планирование запросов │
│ │
╰────────────────────────────────────────────────────────────────╯
Внутренние границы API¶
> Показать границы внутренних модулей
╭─────────────── Границы модулей ───────────────────────────────╮
│ │
│ Внутренние границы API: │
│ │
│ Исполнитель → Хранилище: │
│ heap_insert() - Вставка кортежа │
│ heap_update() - Обновление кортежа │
│ heap_delete() - Удаление кортежа │
│ index_insert() - Обслуживание индекса │
│ │
│ Парсер → Каталог: │
│ SearchSysCache() - Поиск в кэше │
│ ScanPgRelation() - Сканирование отношения │
│ GetRelationIds() - Разрешение OID │
│ │
│ Планировщик → Статистика: │
│ get_relation_stats() - Статистика по таблице │
│ estimate_num_groups() - Оценка мощности (cardinality) │
│ │
│ Всего внутренних API: 456 функций │
│ │
╰───────────────────────────────────────────────────────────────╯
Анализ границ доверия¶
Пути повышения привилегий¶
> Найти функции, изменяющие уровень привилегий
╭─────────────── Переходы привилегий ─────────────────────────╮
│ │
│ Точки повышения привилегий: │
│ │
│ Функции SECURITY DEFINER: │
│ Всего: 23 функции │
│ Риск: Выполняются с привилегиями владельца │
│ │
│ Функции, доступные только суперпользователям, │
│ но вызываемые не-суперпользователями: │
│ pg_reload_conf() через обёртку reload_conf │
│ pg_terminate_backend() через обёртку admin │
│ │
│ Переходы с помощью SET ROLE: │
│ SetRole() - Переключение ролей │
│ check_role_grantor() - Проверка прав доступа │
│ │
│ Обход проверки безопасности на уровне строк (RLS): │
│ check_enable_rls() - Точка проверки RLS │
│ ExecCheckRTPerms() - Проверка прав доступа │
│ │
│ Точки аудита: 45 местоположений │
│ │
╰──────────────────────────────────────────────────────────────╯
Обработчики недоверенных данных¶
> Найти функции, обрабатывающие недоверенные входные данные
╭─────────────── Обработчики недоверенных данных ──────────────╮
│ │
│ Прямая обработка входных данных от клиента: │
│ │
│ Строковый ввод: │
│ pq_getmsgstring() - Сырая строка от клиента │
│ pq_getmsgtext() - Текст с указанием кодировки │
│ pg_client_to_server() - Преобразование кодировки │
│ │
│ Бинарный ввод: │
│ pq_getmsgbyte() - Один байт │
│ pq_getmsgint() - Целое число (разных размеров) │
│ pq_getmsgbytes() - Сырые байты │
│ │
│ Ввод SQL: │
│ pg_parse_query() - Разбор SQL │
│ eval_const_expressions() - Вычисление выражений │
│ │
│ Точки проверки: │
│ check_object_ownership() - Проверка ACL │
│ has_table_privilege() - Доступ к таблице │
│ pg_aclcheck() - Общая проверка ACL │
│ │
╰──────────────────────────────────────────────────────────────╯
Примеры вопросов¶
- «Найти все точки входа в сеть»
- «Перечислить функции доступа к файловой системе»
- «Показать функции публичного API»
- «Найти пути повышения привилегий»
- «Определить обработчики недоверенного ввода»
- «Отобразить границы доверия»
Команды CLI¶
# Анализ точек входа
python -m src.cli.security entry-points --type network
python -m src.cli.security entry-points --type file
python -m src.cli.security entry-points --type api
python -m src.cli.security trust-boundaries
Связанные сценарии¶
- Аудит безопасности — Анализ уязвимостей
- Реагирование на инциденты — Расследование атак
- Архитектура — Границы системы