Назад к обновлениям
New releaseAug 1, 2026

maltrail v2.2

Система обнаружения вредоносного трафика в реальном времени, использующая публичные черные списки, статические следы вредоносных программ и эвристический анализ для выявления угроз в DNS, HTTP и IP-трафике.

Поделиться

Maltrail

License Sensor Server Trails X

Maltrail

Maltrail — это система обнаружения сетевого трафика, которая выявляет взаимодействие с известной вредоносной инфраструктурой и сообщает о выбранных аномалиях трафика. Она сопоставляет домены, URL-адреса, IP-адреса, пары IP:port и значения User-Agent, наблюдаемые в сети, с набором индикаторов, называемых trails.

Обнаружение фиксируется как единое событие, содержащее источник, назначение, протокол, совпавший trail, классификацию и источник trail:```text "2026-08-07 09:14:22.117034" gw 10.13.13.2 57809 1.1.1.1 53 UDP DNS malware.bakewithdavid.com "asyncrat (malware)" (static)

Maltrail предназначен для индикаторного мониторинга сети. Его эвристические детекции дополняют
сопоставление по трейлам, но он не заменяет телеметрию конечных точек или универсальную систему
предотвращения вторжений.

## Возможности

- Полная сборка трейлов, объединяющая более 3 000 встроенных статических файлов, 42 интеграции с публичными фидами
  и опциональные трейлы, предоставляемые оператором.
- Многопоточный сенсор на Rust с использованием libpcap, с опциональными рабочими процессами захвата `PACKET_FANOUT` для Linux.
- Python-сервер, предоставляющий интерфейс отчетности, приём событий и HTTP API.
- Пользовательские трейлы и списки исключений в виде обычного текста, которые можно просматривать и версионировать.
- Эвристики для сканирования, исчерпания DNS, DGA-подобных запросов, подозрительных загрузок, проверок прокси,
  подозрительных значений User-Agent и связанной сетевой активности.
- Локальное журналирование событий, удалённое журналирование Maltrail, CEF через syslog и вывод JSON для Logstash.
- Проверка развёртывания с помощью `maltrail-sensor -T` и опциональные метрики Prometheus.

## Содержание

- [Архитектура](#architecture)
- [Интерфейс отчетности](#reporting-interface)
- [Производительность](#performance)
- [Установка](#installation)
  - [Установщик](#installer)
  - [Сборка из исходного кода](#building-from-source)
  - [Systemd](#systemd)
  - [Docker](#docker)
- [Конфигурация](#configuration)
- [Трейлы](#trails)
- [События и API](#events-and-api)
- [Эксплуатация](#operations)
  - [Мониторинг](#monitoring)
  - [Хранение событий](#event-retention)
- [Документация](#documentation)
- [Участие](#contributing)
- [Проект](#project)
  - [Лицензия](#license)
  - [Сопровождающие](#maintainers)
  - [Спонсоры](#sponsors)
  - [Презентации и публикации](#presentations-and-publications)
  - [Производный чёрный список](#derived-blacklist)
  - [Сторонние интеграции](#third-party-integrations)
  - [Благодарности](#acknowledgements)

## Архитектура

Maltrail состоит из двух независимых процессов, которые могут работать на одном хосте или на разных хостах:```text
   ┌──────────┐   events (UDP or file)   ┌──────────┐
   │  sensor  │ ───────────────────────► │  server  │ ◄── browser
   └──────────┘                          └──────────┘
    Rust                                  Python
    libpcap + PACKET_FANOUT               reporting UI + API
    trail matching + heuristics

Датчик захватывает трафик, выполняет сопоставление следов и эвристический анализ, а также генерирует события. Он может записывать события локально (LOG_DIR), отправлять их на удалённый сервер Maltrail (LOG_SERVER) или делать и то, и другое. Он также может отправлять CEF через syslog (SYSLOG_SERVER) и JSON в Logstash (LOGSTASH_SERVER).

Сервер принимает и хранит удалённые события, обслуживает локально доступные журналы событий и предоставляет веб-интерфейс и API.

Интерфейс отчётности

Maltrail включает браузерный интерфейс отчётности для изучения обнаруженного трафика с обновлениями в реальном времени, поиском по полям, ретро-охотой, географическими представлениями, триажем, сохранёнными представлениями и экспортом.

Интерфейс отчётности Maltrail

Интерфейс обслуживается server.py по адресу HTTP_ADDRESS:HTTP_PORT. Это чистый JavaScript с одной сторонней зависимостью времени выполнения (PapaParse, для разбора CSV) и без этапа сборки. За один раз просматривается один день, выбранный с помощью средства выбора даты, которое также служит сеткой плотности событий по доступным ежедневным журналам. События передаются потоком из /events и агрегируются в браузере в угрозы — по одной строке на каждый отдельный (source, trail) — отображаемые в сортируемой сетке с панелью деталей.

ФункцияПримечания
Живой режимДобавляемые события передаются через Server-Sent Events (/live) и объединяются в текущее представление. При недоступности SSE переключается на опрос диапазонов байтов ежедневного журнала или на сеансы, которые поток не может обслуживать. Новые угрозы высокой серьёзности могут вызывать уведомление на рабочем столе и звуковой сигнал; оба можно отключить
ПоискТокены с областью действия по полям (src: dst: port: proto: type: trail: info: family: tag: uid: sev: dir: status:; family:interlock подтягивает interlock-1/-2, сегменты, на которые разбивается одна порция данных фида), объединяемые пробелом как И, - для исключения, подстановочные знаки *, CIDR (src:10.0.0.0/8), а также числовые диапазоны и сравнения (port:>1024, count:>=100). Активные фильтры отображаются как удаляемые чипы
Ретро-охотаИщет по всем сохранённым ежедневным журналам один индикатор (/hunt), а не только по дню в представлении. Ограничена лимитом дней, бюджетом реального времени и пределом выборки; день, обрезанный бюджетом, сообщается отдельно от завершённых дней, а не учитывается как итоговое завершённое число. Побочный индекс на день (LOG_DIR/index/, USE_EVENT_INDEX) позволяет обходу пропускать каждую несоответствующую строку и делает /counts точным
Карта мираПлотность событий по странам за выбранный день (/geo) с размещением внешней конечной точки каждого события. События, которые нельзя отнести к внешнему адресу, сообщаются как неотображённые, а не угадываются. Задайте HOME_LAT / HOME_LON, чтобы рисовать дуги происхождения
ТриажСтатус по каждой угрозе (новая / расследуется / решена / ложное срабатывание), текстовые заметки, теги и скрытие. Правила белого списка и переходы по OSINT доступны из контекстного меню строки
Сохранённые представленияИменованные пресеты фильтров
ЭкспортТекущее отфильтрованное представление в виде CSV, JSON или обезвреженных индикаторов
Внешний видТёмная и светлая темы, а также дискретные шаги размера текста

Состояние триажа, сохранённые представления, теги и настройки внешнего вида хранятся в браузере (localStorage), а не на сервере: они привязаны к браузеру и источнику и не используются совместно между аналитиками.

Сеансы, ограниченные сетевым фильтром, видят только события из своих собственных сетей, и это ограничение применяется к счётчикам, карте и конечным точкам чёрного списка, а также к списку событий.

Обогащение по стране и ASN для отдельных адресов запрашивается на stat.ripe.net сервером, который кэширует результаты и обслуживает их для интерфейса через собственную конечную точку /ripe; браузер взаимодействует только с Maltrail. Задайте DISABLE_RIPE_LOOKUPS, чтобы полностью отключить исходящие запросы. Без них — или на хосте без доступа в интернет — флаги берутся из локальной таблицы RIR, а всё остальное в интерфейсе работает офлайн.

Производительность

Производительность зависит от процессора, состава трафика, размера набора следов, драйвера захвата и сетевого интерфейса. Приведённые ниже показатели измеряют путь обработки пакетов датчика изолированно; это не сквозные измерения захвата в реальном времени.

Репрезентативные измерения на AMD Ryzen 7 PRO 4750U с включёнными эвристиками и набором следов в 1,5 миллиона строк:

ТрафикВремя на пакет
ICMP echo, 58 байт101 нс
TCP SYN, 70 байт302 нс
Массовый TLS, 1 473 байта402 нс
DNS-запрос с тёплым кэшем, 93 байта452 нс
Смешанный трафик, средний размер 866 байт552 нс
HTTP-запрос, 169 байт602 нс
DNS-запрос с уникальным именем, 93 байта1 102 нс

Офлайн-сравнительные прогоны с использованием того же сгенерированного захвата, конфигурации и набора следов показали в 14–37 раз меньшую установившуюся стоимость на пакет, чем у прежнего датчика на Python, на протестированных системах. Эти показатели отделяют время всего процесса от установившегося состояния, поскольку загрузка следов доминирует при коротком воспроизведении. Само обнаружение проверяется отдельно, корпусом из 42 случаев в sensor/tests/replay.rs.

Измерьте его на целевой системе с помощью:```bash cargo bench --manifest-path sensor/Cargo.toml --bench hotpath

Один рабочий процесс захвата используется по умолчанию. Дополнительные рабочие процессы могут увеличить ёмкость захвата, но хеширование потоков в Linux распределяет состояние по источникам между рабочими процессами и поэтому снижает чувствительность некоторых эвристик сканирования. В задокументированном тесте 91% эвристических предупреждений с одним рабочим процессом сохранялись при двух рабочих процессах, 86% — при четырёх и 65% — при восьми. Точное сопоставление следов не изменилось. Увеличивайте `CAPTURE_FANOUT` только тогда, когда метрики потерь при захвате показывают, что это необходимо.

Методология бенчмарков, результаты аппаратного тестирования, вывод профилировщика, измерения памяти и проверки живого fanout задокументированы в [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md).

## Установка

### Установщик

Установщик поддерживает Debian, Ubuntu, Raspberry Pi OS, RHEL, Fedora и openSUSE:```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh

Устанавливает зависимости, создаёт управляемую рабочую копию в /opt/maltrail, проверяет контрольную сумму предварительно собранного сенсора, создаёт непривилегированную учётную запись maltrail, устанавливает systemd-юниты, подготавливает каталоги журналов и состояния, а также запускает сенсор и сервер. Повторный запуск установщика обновляет управляемую рабочую копию.

Просмотрите скрипт перед запуском с повышенными привилегиями. Из существующей рабочей копии пробный запуск показывает команды без изменения системы:```bash sh install.sh --dry-run

Общие параметры установщика:```bash
sh install.sh --role sensor      # Install only the sensor
sh install.sh --ref 3.1.2        # Install a release tag instead of master
sh install.sh --no-service       # Install without changing systemd
sh install.sh --dry-run          # Print commands without applying them
sh install.sh --uninstall        # Remove the managed installation; keep logs and state

Панель управления доступна по адресу http://127.0.0.1:8338 после установки. Обратите внимание, что в комплекте поставляется HTTP_ADDRESS со значением 0.0.0.0, поэтому она доступна на каждом интерфейсе, а не только на loopback — и учётные данные по умолчанию: admin / changeme!. Измените USERS и установите HTTP_ADDRESS на 127.0.0.1 (или разместите сервер за обратным прокси с TLS), прежде чем хост окажется в недоверенной сети.

Первоначальная сборка набора trail-правил может занять несколько минут. Сенсор не обнаруживает совпадения trail-правил, пока не будет доступен корректный набор trail-правил. Модуль systemd запускает проверку -T сенсора перед запуском, чтобы отсутствующие привилегии, каталог журналов без права записи или некорректный набор trail-правил приводили к видимому сбою запуска.

Тестовый стенд установщика охватывает контейнеры Ubuntu, Debian, Fedora, openSUSE и Alpine. Alpine использует musl и не использует предварительно собранный бинарный файл сенсора для glibc; там соберите сенсор из исходного кода.

Сборка из исходного кода

Для сенсора требуется Rust 1.74 или новее, заголовки разработки libpcap и системные инструменты capability. Сервер и обновлятель trail-правил требуют Python 3.6 или новее.

Установите пакеты дистрибутива:```bash

Debian / Ubuntu / Raspberry Pi OS

sudo apt-get install cargo libpcap-dev libcap2-bin python3

RHEL / Fedora

sudo dnf install cargo libpcap-devel libcap python3

openSUSE / SLES

sudo zypper install cargo rust libpcap-devel libcap-progs python311

Затем соберите и проверьте сенсор:```bash
git clone --depth 1 https://github.com/stamparm/maltrail.git
cd maltrail

cargo build --release --manifest-path sensor/Cargo.toml

sudo setcap cap_net_raw,cap_net_admin=eip \
  sensor/target/release/maltrail-sensor

sudo install -d -o "$USER" -g "$(id -gn)" -m 750 /var/log/maltrail

sensor/target/release/maltrail-sensor -T
sensor/target/release/maltrail-sensor

Запустите сервер в другом терминале или на другом хосте:```bash python3 server.py

Предварительно собранные бинарники сенсора для `x86_64` и `aarch64` прикреплены к текущим релизам с контрольными суммами SHA-256.
Они статически линкуются с libpcap и рассчитаны на glibc 2.28, так что единственное, что им нужно, — это библиотека C: ничего устанавливать не требуется, будь то RHEL 8+, Debian 10+, Ubuntu 18.04+ или Leap 15.x. На системах на основе musl, таких как Alpine Linux, собирайте из исходников.

Бинарники из **3.1.1 и более ранних версий** — нет: они динамически линковались с libpcap и запрашивали её по имени, которое использует их сборочный хост AlmaLinux. Debian и Ubuntu поставляют ту же библиотеку под более старым именем `libpcap.so.0.8`, поэтому эти бинарники останавливаются, не успев начать, —```
./maltrail-sensor: error while loading shared libraries: libpcap.so.1: cannot open shared object file

— на машине, где установлен libpcap. install.sh создаёт недостающую ссылку за вас. Вручную:```bash

adjust the directory for your architecture: aarch64-linux-gnu, or /usr/lib64 on RPM distributions

sudo ln -sf /usr/lib/x86_64-linux-gnu/libpcap.so.0.8 /usr/lib/x86_64-linux-gnu/libpcap.so.1 sudo ldconfig

### Systemd

Поставляемые модули `packaging/systemd/` запускают оба процесса от имени
непривилегированного пользователя `maltrail`. Systemd создаёт `/var/log/maltrail` и `/var/lib/maltrail`, ограничивает
доступ к файловой системе и предоставляет сенсору `CAP_NET_RAW` и `CAP_NET_ADMIN`.

Установщик настраивает эти модули автоматически. Для существующей установки из исходников следуйте
процедуре ручной настройки службы в [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md).

Проверьте состояние службы и журналы с помощью:```bash
systemctl status maltrail-sensor maltrail-server
journalctl -u maltrail-sensor -f

Docker

Запустите предоставленное развёртывание Compose с помощью:```bash docker compose -f docker/docker-compose.yml up -d

Конфигурация контейнера, хранилище, привилегии и проверки работоспособности описаны в
[`docker/README.md`](https://github.com/stamparm/maltrail/blob/master/docker/README.md).

## Конфигурация

Maltrail читает `maltrail.conf`, который содержит отдельные настройки `[Sensor]` и `[Server]`. Установщик размещает управляемую конфигурацию в `/etc/maltrail.conf`.

Часто используемые параметры сенсора включают:

| Параметр | Назначение |
| --- | --- |
| `MONITOR_INTERFACE` | Интерфейс или интерфейсы захвата; `any` выбирает все поддерживаемые интерфейсы |
| `CAPTURE_FILTER` | Фильтр захвата BPF |
| `CAPTURE_FANOUT` | Количество сокетов захвата Linux; по умолчанию один |
| `CAPTURE_WORKERS` | Рабочие процессы захвата, по одному сокету на каждый; по умолчанию равно `CAPTURE_FANOUT`, то есть один, если ни один из них не задан |
| `LOG_DIR` | Локальный каталог журнала событий |
| `TRAILS_FILE` | Сгенерированная база данных следов |
| `LOG_SERVER` | Удалённый сервер событий Maltrail |
| `SYSLOG_SERVER` | Назначение или назначения CEF syslog |
| `LOGSTASH_SERVER` | Назначение или назначения JSON Logstash |
| `STATS_ADDRESS` | Слушатель метрик Prometheus; отключён, если не настроен |
| `UPDATE_PERIOD` | Интервал обновления следов |
| `STATIC_TRAILS_URL` | Откуда загружается собранный набор статических следов; закрепите его за датированным релизом, чтобы контролировать появление нового контента |
| `USER_WHITELIST` | Управляемые оператором индикаторы, которые не должны вызывать оповещения |
| `CUSTOM_TRAILS_DIR` | Управляемый оператором каталог следов |
| `STATIC_TRAILS_DIR` | Необязательная копия репозитория следов; используется только для отображения источника цитирования следа в интерфейсе |

`PROCESS_COUNT` применяется к устаревшему сенсору Python и к устаревшему ограничителю журнала событий; он **не** задаёт количество рабочих процессов сенсора Rust. Вместо этого настройте рабочие процессы захвата с помощью `CAPTURE_FANOUT` или `CAPTURE_WORKERS`.

Запустите проверку развёртывания после изменения конфигурации:```bash
sensor/target/release/maltrail-sensor -T

Проверка подтверждает конфигурацию, трейлы, записи белого списка, фильтр захвата, привилегии, хранение журналов, поддержку обновлений и настройки воркеров. Успешная проверка включает положительные значения количества трейлов и записей белого списка, а не только подтверждение существования файлов.

Трейлы

Трейл — это один индикатор: домен, URL, IP-адрес, пара IP:port, User-Agent, отпечаток JA3/JA4 или хэш сертификата — вместе с тем, что он означает и откуда он взялся. Апдейтер объединяет четыре источника в TRAILS_FILE в следующем порядке:

источникоткуда он берётся
Фидыfeeds/*.py, получаемые вашим развёртыванием напрямую от каждого издателя
ПользовательскиеCUSTOM_TRAILS_DIR и CUSTOM_TRAILS_URL, ваши собственные индикаторы
Статическиесобранный набор из stamparm/trails, получаемый из STATIC_TRAILS_URL
Списки движкаdata/mass_scanner*.txt, включённые сюда, потому что они редко меняются

Статические трейлы находятся в отдельном репозитории. Контент обнаружения меняется десятки раз в день; движок — нет, и их совместное хранение означало, что обновление обнаружения требовало подтягивания кода и делало историю этого репозитория непригодной для использования. STATIC_TRAILS_URL указывает на новейший опубликованный набор:```text STATIC_TRAILS_URL https://github.com/stamparm/trails/releases/latest/download/trails.csv.gz

Укажите конкретный релиз `content-YYYYMMDD-HHMM`, чтобы закрепить версию, — тогда неудачная публикация не станет мгновенно глобальной. Набор кэшируется рядом с `TRAILS_FILE`, что и обеспечивает работу офлайн- или изолированной пересборки; опубликованный `sha256` проверяется перед загрузкой, поэтому развёртывание, которое обновляется чаще, чем меняется контент, передаёт 65 байт вместо 11 МБ, а полезная нагрузка, не совпадающая с дайджестом, отклоняется в пользу кэша.

`update_trails()` публикует новый `TRAILS_FILE` атомарно и только после успешной сборки. Каналы, которые ничего не возвращают, сообщаются по имени, чтобы развёртывание не зависело молча от источника, который тихо прекратил работу.

Добавляйте собственные индикаторы в `CUSTOM_TRAILS_DIR`, а всё, что никогда не должно вызывать событие, — в `USER_WHITELIST`. Держите оба вне каталога установки, чтобы обновление не могло их перезаписать.

Статические вклады в трейлы направляются в [stamparm/trails](https://github.com/stamparm/trails); новые каналы — сюда. В любом случае индикатору нужны классификация и источник, который можно проверить, — см. [Contributing](#contributing).

## События и API

Maltrail записывает одно событие на обнаружение, разделяя значения пробелами, используя CSV-кавычки там, где значение содержит пробелы:```text
"<time>" <sensor> <src_ip> <src_port> <dst_ip> <dst_port> <proto> <type> <trail> "<info>" <reference>

Поле type определяет, что именно совпало, включая DNS, IP, IPORT, URL, PATH, HTTP, UA, PORT, CERT, JA3 и JA4. Поле info содержит классификацию следа, а reference указывает на статический список, фид, пользовательский источник или эвристику, которая это выдала. Типы JA3/JA4 срабатывают по TLS-клиентским отпечаткам: TLS-стек импланта переживает любую смену адреса и домена, поэтому его hello-хэш продолжает совпадать, даже когда всё остальное уже сгорело (опубликовано в фиде JA3 от abuse.ch SSLBL).

Поиск индикаторов

Используйте /check для запроса одного домена, IP-адреса или URL:```bash curl 'http://127.0.0.1:8338/check?q=www.sub.evil.example'

$ python3 -m pip install --upgrade pip $ python3 -m pip install --upgrade git+https://github.com/trailofbits/ariana.git


### Использование

$ ariana --help usage: ariana [-h] [--version] [-v] [-q] {analyze,compare} ...

Ariana — это инструмент для анализа и сравнения смарт-контрактов.

positional arguments: {analyze,compare} analyze Анализ одного смарт-контракта compare Сравнение двух смарт-контрактов

options: -h, --help Показать это справочное сообщение и выйти --version Показать номер версии программы и выйти -v, --verbose Включить подробный вывод -q, --quiet Отключить вывод


#### Анализ

$ ariana analyze --help usage: ariana analyze [-h] [-f {sol,vyper}] [-o OUTPUT] [-v] [-q] contract

positional arguments: contract Путь к файлу контракта для анализа

options: -h, --help Показать это справочное сообщение и выйти -f {sol,vyper}, --framework {sol,vyper} Язык смарт-контракта (по умолчанию: sol) -o OUTPUT, --output OUTPUT Путь к выходному файлу для сохранения результатов -v, --verbose Включить подробный вывод -q, --quiet Отключить вывод


#### Сравнение

$ ariana compare --help usage: ariana compare [-h] [-f {sol,vyper}] [-o OUTPUT] [-v] [-q] contract1 contract2

positional arguments: contract1 Путь к первому файлу контракта для сравнения contract2 Путь ко второму файлу контракта для сравнения

options: -h, --help Показать это справочное сообщение и выйти -f {sol,vyper}, --framework {sol,vyper} Язык смарт-контракта (по умолчанию: sol) -o OUTPUT, --output OUTPUT Путь к выходному файлу для сохранения результатов -v, --verbose Включить подробный вывод -q, --quiet Отключить вывод


### Примеры

#### Анализ контракта

$ ariana analyze examples/ERC20.sol


#### Сравнение двух контрактов

$ ariana compare examples/ERC20.sol examples/ERC721.sol


#### Сохранение результатов в файл

$ ariana analyze examples/ERC20.sol -o results.json


### Выходные данные

Ariana выводит результаты в формате JSON. Каждый результат содержит следующую информацию:

- **severity**: Уровень серьёзности проблемы (например, `high`, `medium`, `low`)
- **title**: Краткое описание проблемы
- **description**: Подробное описание проблемы
- **location**: Расположение проблемы в исходном коде (файл, строка, столбец)
- **recommendation**: Предлагаемое исправление или рекомендация

Пример выходных данных:

```json
{
  "results": [
    {
      "severity": "high",
      "title": "Уязвимость повторного входа",
      "description": "Функция `withdraw` вызывает внешний контракт перед обновлением состояния, что позволяет атакующему повторно войти в функцию.",
      "location": {
        "file": "examples/ERC20.sol",
        "line": 42,
        "column": 5
      },
      "recommendation": "Используйте паттерн checks-effects-interactions или добавьте модификатор для предотвращения повторного входа."
    }
  ]
}

Конфигурация

Ariana можно настроить с помощью файла конфигурации ariana.toml в корневом каталоге проекта. Пример конфигурации:

[analysis]
severity_threshold = "medium"
include_deprecated = false

[output]
format = "json"
pretty = true

Лицензия

Ariana распространяется под лицензией Apache License 2.0. Подробности см. в файле LICENSE.

Вклад

Мы приветствуем вклад в развитие Ariana! Пожалуйста, ознакомьтесь с CONTRIBUTING.md для получения инструкций по внесению изменений.

Благодарности

Ariana разработана и поддерживается командой Trail of Bits. Особая благодарность всем участникам и сообществу за их поддержку и отзывы.

{
  "query": "www.sub.evil.example",
  "found": true,
  "trail": "evil.example",
  "info": "asyncrat (malware)",
  "reference": "(static)",
  "confidence": 100
}
```
Поле `confidence` (0–100 или `null`, если недоступно) показывает, насколько сильно источники подтверждают
запись: 40 для одного фида, +15 за каждый дополнительный независимо согласующийся фид вплоть до 100, и полные
баллы для собственных пользовательских и статических записей оператора. Оно вычисляется при обновлении трейлов на основе
согласованности фидов в побочный файл `trails.confidence` рядом с `trails.csv`; сервер, получающий трейлы
с `UPDATE_SERVER`, не имеет данных о происхождении для оценки и сообщает `null`. Используйте его для приоритизации
триажа — запись из одного фида с оценкой 40 заслуживает повторного просмотра, прежде чем для неё будет создано правило файрвола.

Поиск поддомена может совпасть с его указанным родительским доменом. Поиск по URL проверяет `host/path` перед проверкой
только хоста. Сервер читает базу трейлов с отображением в память и наблюдает за обновлениями трейлов без
перезапуска.

Публичные статические и фидные трейлы доступны без аутентификации, что согласуется с конечной точкой `/trails`,
используемой удалёнными сенсорами. Пользовательские трейлы требуют авторизованной сессии; несанкционированный
поиск только по пользовательским трейлам сообщается как промах. Данные событий остаются аутентифицированными.

## Операции

### Мониторинг

Используйте `maltrail-sensor -T` как шлюз развёртывания и конфигурации. Поставляемый systemd-юнит запускает его
как `ExecStartPre`.

Чтобы подтвердить, что само обнаружение работает — а не только то, что процессы запускаются, — выполните:```bash
python3 server.py --detect-test
```
Он воспроизводит подготовленный pcap-файл эмулируемого вредоносного трафика (срабатывания по DNS-запросу, IP-адресу, `IP:port`, пути URL и заголовку `Host`, а также эвристики SQL-инъекций, обхода каталогов, RCE, XSS, прокси-зондирования, sinkhole, отсутствующего `Host` и сканирования портов/веб/инфекций) через установленный сенсор и проверяет, что каждое ожидаемое обнаружение срабатывает. Ему не нужны root-права, сетевой интерфейс или собственный набор следов. Исправная установка выводит `20/20 detection(s) fired`.

Когда настроен `STATS_ADDRESS`, отслеживайте как минимум следующие метрики Prometheus:

| Метрика | Операционное значение |
| --- | --- |
| `maltrail_up == 0` | Не запущен ни один рабочий процесс захвата |
| Увеличение `maltrail_capture_dropped_total` | Кольцевой буфер захвата теряет пакеты |
| Увеличение `maltrail_local_log_errors_total` | События созданы, но не могут быть записаны локально |
| Увеличение `maltrail_remote_log_errors_total` | События не могут быть доставлены в удалённый приёмник; при `DISABLE_LOCAL_LOG_STORAGE` они теряются |
| `maltrail_trail_generation` не увеличивается | Активный набор следов не обновляется |
| `maltrail_log_dir_free_bytes` | Оставшаяся ёмкость для локального хранения событий |
| Увеличение `maltrail_state_saturations_total` | Достигнут предел состояния эвристики |
| Увеличение `maltrail_throttle_evictions_total` | Таблица ограничения событий достигла своего предела, поэтому события агрегируются раньше, чем настроено |

Насыщение состояния влияет на соответствующую эвристику; точное сопоставление следов остаётся активным.

Отправьте `SIGHUP` или используйте `systemctl reload maltrail-sensor`, чтобы запросить перезагрузку следов. Файлы следов, обновлённые другим процессом, обнаруживаются автоматически и публикуются рабочим процессам без перезапуска сенсора.

Сжатое хранилище наблюдаемых данных (`USE_CONDENSED_STORAGE`, `meta.sqlite`) поддерживает представления новизны и ретро-охоты на сервере. Побочный индекс журнала событий за день (`USE_EVENT_INDEX`, `LOG_DIR/index/*.sqlite`, примерно вдвое больше размера журнала на диске) обеспечивает точность `/counts` и скорость `/hunt`; он поддерживается инкрементально из самих журналов и может быть пересобран с помощью `server.py --rebuild-index`. Совместимость с устаревшим сенсором описана в [`sensor/docs/COMPATIBILITY.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/COMPATIBILITY.md).

### Хранение событий

Maltrail не ротирует и не удаляет журналы событий. Операторы несут ответственность за определение политики хранения, архивирования и удаления в соответствии с требованиями к хранилищу и организационной политикой.

Рекомендуемые практики:

- Отправляйте долговременную копию событий на удалённый сервер Maltrail или SIEM с помощью `LOG_SERVER`, `SYSLOG_SERVER` или `LOGSTASH_SERVER`.
- Настройте оповещение по `maltrail_log_dir_free_bytes` с достаточным запасом для ожидаемой скорости событий.
- Ротируйте, архивируйте или удаляйте локальные ежедневные журналы с помощью внешних инструментов.
- Храните файлы, необходимые для интерфейса отчётности, несжатыми в `LOG_DIR`; архивируйте сжатые файлы в другом месте.

Когда файловая система журналов заполнена, сенсор не может добавлять события. Журналы событий также могут содержать IP-адреса и домены, которые в некоторых юрисдикциях регулируются как персональные данные; политика хранения должна учитывать применимые требования.

## Документация

| Документ | Содержание |
| --- | --- |
| [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md) | Установка, привилегии, конфигурация и устранение неполадок |
| [`sensor/docs/ARCHITECTURE.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/ARCHITECTURE.md) | Внутреннее устройство сенсора и поток данных |
| [`sensor/docs/COMPATIBILITY.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/COMPATIBILITY.md) | Осознанные отличия от устаревшего Python-сенсора |
| [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md) | Измерения, профили и результаты тестов |
| [`sensor/docs/ROADMAP.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/ROADMAP.md) | Открытые задачи по сенсору |
| [`SekuriPy Labs`](https://www.sekuripy.hr/labs/maltrail/) | Инженерные заметки, бенчмарки и статьи |

## Участие

Приветствуются дополнения следов, поддержка фидов, отчёты об ошибках, документация и улучшения сенсора. Предложения следов должны включать надёжный источник и использовать наиболее узкую подходящую классификацию.

Перед отправкой кода запустите соответствующие проверки. Полный набор проверок сенсора:```bash
bash sensor/tools/check.sh
```
Он запускает форматирование, Clippy с запретом предупреждений, а также наборы тестов в режимах debug и release. Запустите набор тестов Python-сервера с помощью:```bash
bash tests/run.sh python3
```
## Проект

### Лицензия

Maltrail распространяется под лицензией MIT. См. [`LICENSE`](https://github.com/stamparm/maltrail/blob/master/LICENSE).

### Сопровождающие

- Miroslav Stampar ([@stamparm](https://github.com/stamparm))
- Mikhail Kasimov ([@MikhailKasimov](https://github.com/MikhailKasimov))

### Спонсоры

- [Sansec](https://sansec.io/) (2024–2025)
- [Sansec](https://sansec.io/) (2020–2021)

### Презентации и публикации

- 47-я встреча TF-CSIRT, Прага, 2016
  ([слайды](https://web.archive.org/web/20161109135211/https://www.terena.org/activities/tf-csirt/meeting47/M.Stampar-Maltrail.pdf))
- _Detect attacks on your network with Maltrail_, Linux Magazine, 2022
  ([статья](https://www.linux-magazine.com/Issues/2022/258/Maltrail))
- _Best Cyber Threat Intelligence Feeds_, Silent Push, 2022
  ([обзор](https://www.silentpush.com/blog/best-cyber-threat-intelligence-feeds))
- _Research on Network Malicious Traffic Detection System Based on Maltrail_, Nanotechnology
  Perceptions, 2024
  ([статья](https://nano-ntp.com/index.php/nano/article/view/1915/1497))

### Производный список блокировки

Список, содержащий только домены, полученный из статических списков `malware/`, публикуется по адресу
[`maltrail-malware-domains.txt`](https://raw.githubusercontent.com/stamparm/aux/master/maltrail-malware-domains.txt).
Его можно использовать как входные данные для систем фильтрации DNS, но операторам следует проверить и протестировать его перед
включением блокировки. Списки угроз могут содержать ложные срабатывания или индикаторы, которые не
подходят для каждого окружения.

### Сторонние интеграции

- [FreeBSD Port](https://www.freshports.org/security/maltrail)
- [OPNsense Gateway Plugin](https://github.com/opnsense/plugins/pull/1257)
- [D4 Project](https://www.d4-project.org/2019/09/25/maltrail-integration.html)
- [BlackArch Linux](https://github.com/BlackArch/blackarch/blob/master/packages/maltrail/PKGBUILD)
- [Validin](https://x.com/ValidinLLC/status/1719666086390517762)
- [Maltrail Add-on for Splunk](https://splunkbase.splunk.com/app/7211)
- [Maltrail decoder and rules for Wazuh](https://github.com/MikhailKasimov/maltrail-wazuh-decoder-and-rules)
- [GScan](https://github.com/grayddq/GScan) (только списки)
- [MalwareWorld](https://www.malwareworld.com/) (только списки)
- [oisd domain blocklist](https://oisd.nl/?p=inc) (только списки)
- [NextDNS](https://github.com/nextdns/metadata/blob/e0c9c7e908f5d10823b517ad230df214a7251b13/security/threat-intelligence-feeds.json) (только списки)
- [NoTracking](https://github.com/notracking/hosts-blocklists/blob/master/SOURCES.md) (только списки)
- [OWASP Mobile Audit](https://github.com/mpast/mobileAudit#environment-variables) (только списки)
- [Mobile Security Framework MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF/commit/12b07370674238fa4281fc7989b34decc2e08876) (только списки)
- [pfBlockerNG-devel](https://github.com/pfsense/FreeBSD-ports/blob/devel/net/pfSense-pkg-pfBlockerNG-devel/files/usr/local/www/pfblockerng/pfblockerng_feeds.json) (только списки)
- [Sansec eComscan](https://sansec.io/kb/about-ecomscan/ecomscan-license) (только списки)
- [Palo Alto Networks Cortex XSOAR](https://xsoar.pan.dev/docs/reference/integrations/github-maltrail-feed) (коннектор списков)

### Благодарности

- Thomas Kristner
- Eduardo Arcusa Les
- James Lay
- Ladislav Baco (@laciKE)
- John Kristoff (@jtkdpu)
- Michael M&uuml;nz (@mimugmail)
- David Brush
- @Godwottery
- Chris Wild (@briskets)
- Keith Irwin (@ki9us)
- Simon Szustkowski (@simonszu)

Категории