# Алгоритмы обнаружения угроз ## Общие принципы Все детекторы реализуют **сигнатурный метод** обнаружения на основе скользящего временного окна (sliding window). Каждый детектор: - Потокобезопасен (`sync.Mutex` на внутреннее состояние) - Поддерживает дедупликацию — повторный алерт от одного источника не генерируется чаще заданного интервала - Настраивается через `configs/config.yaml` без перекомпиляции --- ## 1. Port Scan (Сканирование портов) ### Метод обнаружения Злоумышленник обычно последовательно обращается к множеству портов на одном или нескольких хостах для выявления открытых сервисов. Детектор отслеживает количество **уникальных портов назначения**, к которым обращается один источник за фиксированное время. ### Алгоритм ``` Для каждого TCP SYN-пакета (SYN=1, ACK=0): key = srcIP ports[key][dstPort] += timestamp Удалить записи старше window_seconds uniquePorts = count(ports[key]) if uniquePorts >= threshold: если последний алерт был > 30 сек назад: создать Alert(type=port_scan, severity=high) ``` ### Параметры | Параметр | По умолчанию | Описание | |----------|-------------|----------| | `threshold` | 15 | Уникальных портов за период | | `window_seconds` | 10 | Длина окна в секундах | ### Пример (Nmap): ``` Nmap SYN scan (-sS) → пакеты SYN к портам 22, 80, 443, 3389... После 15-го уникального порта за 10 секунд → алерт ``` --- ## 2. Brute Force (Перебор паролей) ### Метод обнаружения При переборе паролей атакующий многократно устанавливает TCP-соединение на один и тот же порт аутентификации. Детектор считает количество SYN-пакетов от одного источника к одному порту/хосту назначения. ### Мониторируемые порты | Порт | Сервис | |------|--------| | 22 | SSH | | 21 | FTP | | 23 | Telnet | | 3389 | RDP (Windows Remote Desktop) | | 5900 | VNC | | 25 | SMTP | | 110 | POP3 | | 143 | IMAP | ### Алгоритм ``` Для каждого TCP SYN-пакета на порт из списка: key = srcIP + ":" + dstIP + ":" + dstPort timestamps[key] += now Удалить записи старше window_seconds count = len(timestamps[key]) if count >= threshold: если последний алерт был > 30 сек назад: создать Alert(type=brute_force, severity=critical) ``` ### Параметры | Параметр | По умолчанию | Описание | |----------|-------------|----------| | `threshold` | 10 | Попыток подключения за период | | `window_seconds` | 30 | Длина окна в секундах | --- ## 3. DoS / DDoS ### Метод обнаружения Атака отказа в обслуживании характеризуется аномально высоким потоком пакетов от одного (DoS) или множества (DDoS) источников. Детектор измеряет скорость пакетов (PPS — Packets Per Second) от каждого IP в скользящем окне. ### Алгоритм ``` Для каждого IP-пакета: timestamps[srcIP] += now Удалить записи старше window_seconds (1 сек по умолчанию) pps = len(timestamps[srcIP]) / window_seconds if pps >= pps_threshold: если последний алерт был > 10 сек назад: создать Alert(type=dos, severity=critical) ``` ### Параметры | Параметр | По умолчанию | Описание | |----------|-------------|----------| | `pps_threshold` | 1000 | Пакетов в секунду | | `window_seconds` | 1 | Длина окна измерения | ### Ограничение Детектор срабатывает на отдельные источники. Для распределённого DDoS с тысячами источников необходим дополнительный анализ суммарного трафика к жертве (не реализован в текущей версии). --- ## 4. ARP Spoofing (Подмена ARP) ### Метод обнаружения Протокол ARP не предусматривает аутентификации, что позволяет злоумышленнику отправить поддельные ARP Reply и связать чужой IP с собственным MAC-адресом (Man-in-the-Middle атака). Детектор ведёт доверенную таблицу соответствия `IP → MAC`. При получении ARP Reply проверяется, не изменился ли MAC для уже известного IP. ### Алгоритм ``` Для каждого ARP Reply (operation=2): srcIP = arp.SourceProtAddress srcMAC = arp.SourceHwAddress if srcIP in table: if table[srcIP] != srcMAC: создать Alert(type=arp_spoof, severity=critical, desc="IP X сменил MAC с A на B") table[srcIP] = srcMAC // обновляем else: table[srcIP] = srcMAC // первичная запись ``` ### Ограничения - Таблица очищается при `Reset()` (смене сессии). При долгом мониторинге DHCP-обновления MAC не вызывают ложных срабатываний только если DHCP lease истёк. - Не различает легитимное изменение MAC (замена сетевой карты) от атаки. --- ## 5. DNS Anomaly (Аномалии DNS) ### Сценарий A: DNS-туннелирование DNS-туннелирование — метод передачи данных через DNS-запросы для обхода фаерволов. Данные кодируются в имени запроса, что приводит к аномально длинным меткам. Нормальная метка (label): `www`, `mail`, `api` — 3–15 символов. Подозрительная метка: `aGVsbG8gd29ybGQhIHRoaXMgaXMgYSB0ZXN0` — 38+ символов (base64-данные). ``` Для каждого DNS запроса (QR=0): for label in split(queryName, "."): if len(label) > max_label_length (50): создать Alert(type=dns_anomaly, desc="DNS tunneling: label length N") ``` ### Сценарий B: Высокая частота запросов Аномально высокое число DNS-запросов от одного хоста может указывать на: - DNS-туннелирование с разбивкой данных на короткие запросы - Активность вредоносного ПО (C2 beacon через DNS) - DGA (Domain Generation Algorithm) — малварь генерирует случайные домены ``` Для каждого DNS запроса: timestamps[srcIP] += now Удалить записи старше window_seconds if len(timestamps[srcIP]) >= query_threshold: создать Alert(type=dns_anomaly, desc="High DNS query rate: N queries/Xs") ``` ### Параметры | Параметр | По умолчанию | Описание | |----------|-------------|----------| | `max_label_length` | 50 | Максимальная длина DNS-метки | | `query_threshold` | 200 | Запросов за период | | `window_seconds` | 60 | Длина окна | --- ## Сводная таблица детекторов | Детектор | Протокол | Метод | Ключ дедупл. | Severity | |----------|----------|-------|--------------|----------| | Port Scan | TCP | Sliding window, уникальные порты | srcIP | high | | Brute Force | TCP | Sliding window, частота SYN | srcIP:dstIP:dstPort | critical | | DoS | IP | Sliding window, PPS | srcIP | critical | | ARP Spoof | ARP | Таблица IP→MAC | srcIP | critical | | DNS Anomaly | DNS/UDP | Длина метки + частота | srcIP | medium |