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