8.9 KiB
Алгоритмы обнаружения угроз
Общие принципы
Все детекторы реализуют сигнатурный метод обнаружения на основе скользящего временного окна (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 |