Автоматизированное картирование поверхности атаки и анализ границ API с использованием CPG-запросов и интеграции с доменным плагином.
Обзор¶
Обработчик точек входа (EntryPointsHandler) обнаруживает и категоризирует все точки входа в кодовой базе — сетевые слушатели, функции доступа к файлам, проверки аутентификации, границы доверия и другие. Обработчик доменно-агностичен — все имена функций и шаблоны загружаются динамически из активного доменного плагина через DomainRegistry.get_security_entry_points() и get_security_entry_point_patterns().
Метод обнаружения:
- CPG-запросы — SQL LIKE-шаблоны по базе данных графа свойств кода
- Доменный плагин — списки функций по категориям из YAML-конфигурации
security_entry_points - Определение типа вопроса — 40+ типов вопросов (EN + RU) через
_detect_entry_point_question_type(), маршрутизация по релевантным категориям - Ранжирование по релевантности —
_rank_by_query_relevance()оценивает и сортирует результаты по близости к запросу
Категории точек входа (15 всего):
| Категория | Описание |
|---|---|
network |
Сетевые слушатели, обработчики соединений |
query |
Точки входа обработки запросов |
auth |
Проверки аутентификации и авторизации |
file_access |
Функции файлового ввода-вывода (чтение, запись, список) |
trust_boundary |
Переходы привилегий, переключение ролей |
connection |
Обработчики установки соединений |
protocol |
Обработчики сообщений протокола |
replication |
Точки входа репликации |
copy |
Импорт/экспорт данных (COPY-подобные команды) |
spi |
Внутреннее API расширений |
extension |
Загрузка расширений/плагинов |
external |
Интерфейс вызова внешних функций |
socket |
Низкоуровневые обработчики сокетов |
exec |
Точки входа выполнения кода |
bgworker |
Точки входа фоновых процессов |
Быстрый старт¶
# Выберите сценарий точек входа через CLI или MCP
/select 16
REST API¶
curl -X POST http://localhost:8000/api/v1/query \
-H "Content-Type: application/json" \
-d '{"query": "Найти все сетевые точки входа", "scenario_id": "16"}'
Карта поверхности атаки¶
Точки сетевого доступа¶
> Найти все точки входа, доступные через сеть
╭─────────────── Точки сетевого доступа ───────────────────────╮
│ │
│ Точки входа, доступные через сеть: │
│ │
│ Уровень сетевого протокола: │
│ accept_connection() - Установление соединения │
│ handle_client_read() - Основной приём данных │
│ read_message_string() - Чтение строки от клиента │
│ read_message_int() - Чтение целого числа от клиента │
│ │
│ Обработка запросов: │
│ handle_query() - Прямое выполнение запроса │
│ handle_parse_message() - Подготовленный запрос │
│ handle_bind_message() - Привязка параметров │
│ handle_execute() - Выполнение подготовленного │
│ │
│ Репликация: │
│ replication_sender() - Потоковая передача данных │
│ replication_receiver() - Приём данных │
│ │
│ Общее количество сетевых точек входа: 23 │
│ │
╰──────────────────────────────────────────────────────────────╯
Точки доступа к файловой системе¶
> Найти точки доступа к файловой системе
╭─────────────── Точки доступа к файловой системе ─────────────╮
│ │
│ Точки доступа к файловой системе: │
│ │
│ Вызываемые через SQL функции: │
│ read_file() - Чтение произвольного файла │
│ read_binary_file() - Чтение бинарного файла │
│ list_directory() - Список содержимого каталога │
│ stat_file() - Получение статистики файла │
│ │
│ Импорт/экспорт данных: │
│ do_copy() → copy_from() - Чтение из файла │
│ do_copy() → copy_to() - Запись в файл │
│ │
│ Загрузка расширений: │
│ load_external_function() - Загрузка разделяемой библиотеки │
│ dynamic_load() - Динамическая загрузка библиотек │
│ │
│ Уровень риска: ВЫСОКИЙ │
│ Требуется: Повышенные привилегии для большинства операций │
│ │
╰──────────────────────────────────────────────────────────────╯
Анализ границ API¶
Публичные функции API¶
> Перечислить все точки входа публичного API
╭─────────────── Публичный API ──────────────────────────────────╮
│ │
│ Экспортированные функции расширений: 1234 │
│ │
│ Категории: │
│ Типы данных: 234 функции │
│ Операторы: 189 функций │
│ Агрегатные: 67 функций │
│ Оконные: 23 функции │
│ Процедурные: 45 функций │
│ │
│ Внутреннее API расширений: │
│ spi_connect() - Подключение к внутреннему API │
│ spi_execute() - Выполнение запроса │
│ spi_prepare() - Подготовка запроса │
│ spi_finish() - Отключение │
│ │
│ Точки перехвата (Hook Points): │
│ utility_hook - Обработка служебных команд │
│ executor_hook - Выполнение запросов │
│ planner_hook - Планирование запросов │
│ │
╰────────────────────────────────────────────────────────────────╯
Внутренние границы API¶
> Показать границы внутренних модулей
╭─────────────── Границы модулей ───────────────────────────────╮
│ │
│ Внутренние границы API: │
│ │
│ Исполнитель → Хранилище: │
│ table_insert() - Вставка записи │
│ table_update() - Обновление записи │
│ table_delete() - Удаление записи │
│ index_insert() - Обслуживание индекса │
│ │
│ Парсер → Каталог: │
│ cache_lookup() - Поиск в системном кеше │
│ scan_relation() - Сканирование отношения │
│ resolve_oid() - Разрешение OID │
│ │
│ Планировщик → Статистика: │
│ get_relation_stats() - Статистика по таблице │
│ estimate_groups() - Оценка мощности (cardinality) │
│ │
│ Всего внутренних API: 456 функций │
│ │
╰───────────────────────────────────────────────────────────────╯
Анализ границ доверия¶
Пути повышения привилегий¶
> Найти функции, изменяющие уровень привилегий
╭─────────────── Переходы привилегий ─────────────────────────╮
│ │
│ Точки повышения привилегий: │
│ │
│ Функции SECURITY DEFINER: │
│ Всего: 23 функции │
│ Риск: Выполняются с привилегиями владельца │
│ │
│ Функции повышенных привилегий, вызываемые │
│ обычными пользователями: │
│ reload_config() через обёртку admin │
│ terminate_backend() через обёртку admin │
│ │
│ Переходы ролей: │
│ set_role() - Переключение ролей │
│ check_role_grantor() - Проверка прав доступа │
│ │
│ Обход проверки безопасности на уровне строк (RLS): │
│ check_rls_enabled() - Точка проверки RLS │
│ check_permissions() - Проверка прав доступа │
│ │
│ Точки аудита: 45 местоположений │
│ │
╰──────────────────────────────────────────────────────────────╯
Точки входа аутентификации¶
> Найти точки проверки аутентификации и авторизации
╭─────────────── Точки входа аутентификации ──────────────────╮
│ │
│ Проверки аутентификации: │
│ │
│ check_password() - Проверка пароля │
│ verify_client_cert() - TLS-сертификат клиента │
│ auth_handler() - Основной диспетчер авторизации │
│ │
│ Проверки авторизации: │
│ │
│ acl_check() - Общая проверка ACL │
│ check_table_privilege() - Доступ на уровне таблицы │
│ check_object_ownership() - Владение объектом │
│ │
│ Управление сессиями: │
│ │
│ create_session() - Инициализация сессии │
│ validate_token() - Проверка токена │
│ │
╰──────────────────────────────────────────────────────────────╯
Обработчики недоверенных данных¶
> Найти функции, обрабатывающие недоверенные входные данные
╭─────────────── Обработчики недоверенных данных ──────────────╮
│ │
│ Прямая обработка входных данных от клиента: │
│ │
│ Строковый ввод: │
│ read_message_string() - Сырая строка от клиента │
│ read_message_text() - Текст с указанием кодировки │
│ convert_encoding() - Преобразование кодировки │
│ │
│ Бинарный ввод: │
│ read_message_byte() - Один байт │
│ read_message_int() - Целое число (разных размеров) │
│ read_message_bytes() - Сырые байты │
│ │
│ Ввод запросов: │
│ parse_query() - Разбор SQL │
│ eval_expressions() - Вычисление выражений │
│ │
╰──────────────────────────────────────────────────────────────╯
Примеры вопросов¶
- «Найти все точки входа в сеть»
- «Перечислить функции доступа к файловой системе»
- «Показать функции публичного API»
- «Найти пути повышения привилегий»
- «Определить обработчики недоверенного ввода»
- «Отобразить границы доверия»
- «Найти точки проверки аутентификации»
- «Показать полную поверхность атаки»
- «Найти точки входа фоновых процессов»
- «Перечислить точки входа репликации»
Связанные сценарии¶
- Аудит безопасности — Анализ уязвимостей
- Реагирование на инциденты — Расследование атак
- Архитектура — Границы системы