Сценарий 16: Обнаружение точки входа

Сценарий 16: Обнаружение точки входа

Инженер по безопасности, осуществляющий картирование поверхности атаки и границ API.

Содержание

Быстрый старт

# Выберите сценарий точек входа
/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