Files
2026-04-12 22:26:26 +04:00

8.9 KiB
Raw Permalink Blame History

Алгоритмы обнаружения угроз

Общие принципы

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