
maltrail v3.2
Echtzeit-Erkennungssystem für schädlichen Datenverkehr unter Verwendung öffentlicher Blacklists, statischer Malware-Spuren und heuristischer Analysen zur Identifizierung von Bedrohungen im DNS-, HTTP- und IP-Datenverkehr.

Maltrail
Maltrail ist ein System zur Erkennung von Netzwerkverkehr, das die Kommunikation mit bekannter
bösartiger Infrastruktur identifiziert und ausgewählte Verkehrsanomalien meldet. Es gleicht
Domains, URLs, IP-Adressen, IP:port-Paare und User-Agent-Werte, die im Netzwerk beobachtet
werden, mit einer Reihe von Indikatoren ab, die als Trails bezeichnet werden.
Eine Erkennung wird als einzelnes Ereignis aufgezeichnet, das Quelle, Ziel, Protokoll, den übereinstimmenden Trail, die Klassifizierung und die Trail-Quelle enthält:```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 ist für indikatorbasiertes Netzwerk-Monitoring konzipiert. Seine heuristischen Erkennungen ergänzen
das Trail-Matching, sind jedoch kein Ersatz für Endpoint-Telemetrie oder ein universelles
Intrusion-Prevention-System.
## Funktionen
- Ein vollständiger Trail-Build, der mehr als 3.000 mitgelieferte statische Dateien, 42 Integrationen öffentlicher Feeds
und optionale, vom Betreiber bereitgestellte Trails kombiniert.
- Ein multithreaded Rust-Sensor unter Verwendung von libpcap, mit optionalen Linux-`PACKET_FANOUT`-Capture-Workern.
- Ein Python-Server, der die Reporting-Oberfläche, die Event-Aufnahme und die HTTP-API bereitstellt.
- Benutzerdefinierte Trails und Whitelists im Klartextformat, die überprüft und versioniert werden können.
- Heuristiken für Scanning, DNS-Erschöpfung, DGA-ähnliche Lookups, verdächtige Downloads, Proxy-Probes,
verdächtige User-Agent-Werte und verwandte Netzwerkaktivitäten.
- Lokales Event-Logging, Remote-Maltrail-Logging, CEF über syslog und Logstash-JSON-Ausgabe.
- Deployment-Validierung mit `maltrail-sensor -T` und optionalen Prometheus-Metriken.
## Inhalt
- [Architektur](#architecture)
- [Reporting-Oberfläche](#reporting-interface)
- [Leistung](#performance)
- [Installation](#installation)
- [Installer](#installer)
- [Aus dem Quellcode bauen](#building-from-source)
- [Systemd](#systemd)
- [Docker](#docker)
- [Konfiguration](#configuration)
- [Trails](#trails)
- [Events und API](#events-and-api)
- [Betrieb](#operations)
- [Monitoring](#monitoring)
- [Event-Aufbewahrung](#event-retention)
- [Dokumentation](#documentation)
- [Mitwirken](#contributing)
- [Projekt](#project)
- [Lizenz](#license)
- [Maintainer](#maintainers)
- [Sponsoren](#sponsors)
- [Präsentationen und Veröffentlichungen](#presentations-and-publications)
- [Abgeleitete Blacklist](#derived-blacklist)
- [Integrationen von Drittanbietern](#third-party-integrations)
- [Danksagungen](#acknowledgements)
## Architektur
Maltrail besteht aus zwei unabhängigen Prozessen, die auf demselben Host oder auf getrennten Hosts ausgeführt werden können:```text
┌──────────┐ events (UDP or file) ┌──────────┐
│ sensor │ ───────────────────────► │ server │ ◄── browser
└──────────┘ └──────────┘
Rust Python
libpcap + PACKET_FANOUT reporting UI + API
trail matching + heuristics
Der Sensor erfasst Datenverkehr, führt Trail-Matching und heuristische Analysen durch und erzeugt Ereignisse.
Er kann Ereignisse lokal schreiben (LOG_DIR), sie an einen entfernten Maltrail-Server senden (LOG_SERVER) oder
beides tun. Er kann außerdem CEF über Syslog (SYSLOG_SERVER) und JSON an Logstash
(LOGSTASH_SERVER) ausgeben.
Der Server empfängt und speichert entfernte Ereignisse, stellt lokal verfügbare Ereignisprotokolle bereit und bietet die Weboberfläche und API.
Berichtsoberfläche
Maltrail enthält eine browserbasierte Berichtsoberfläche zum Erkunden erkannten Datenverkehrs, mit Live-Aktualisierungen, feldbezogener Suche, Retro-Hunting, geografischen Ansichten, Triage, gespeicherten Ansichten und Export.

Die Oberfläche wird von server.py unter HTTP_ADDRESS:HTTP_PORT bereitgestellt. Sie ist reines JavaScript mit einer
einzigen Laufzeitabhängigkeit von Drittanbietern (PapaParse, für CSV-Parsing) und ohne Build-Schritt. Es wird jeweils ein Tag
angezeigt, ausgewählt über eine Datumsauswahl, die zugleich als Ereignisdichte-Raster über die
verfügbaren Tagesprotokolle dient. Ereignisse werden von /events gestreamt und im Browser zu
Bedrohungen aggregiert — eine Zeile pro unterschiedlichem (source, trail) — dargestellt in einem sortierbaren Raster mit Detailbereich.
| Funktion | Hinweise |
|---|---|
| Live-Modus | Angehängte Ereignisse werden über Server-Sent Events (/live) übertragen und in die aktuelle Ansicht eingefügt. Fällt auf Polling von Byte-Bereichen des Tagesprotokolls zurück, wenn SSE nicht verfügbar ist oder für Sitzungen, die der Stream nicht bedienen kann. Neue Bedrohungen hoher Schwere können eine Desktop-Benachrichtigung und einen hörbaren Alarm auslösen; beide können stummgeschaltet werden |
| Suche | Feldbezogene Tokens (src: dst: port: proto: type: trail: info: family: tag: uid: sev: dir: status:; family:interlock zieht interlock-1/-2 mit ein, die Shards, in die ein Feed-Dump aufgeteilt ankommt) kombiniert mit Leerzeichen als UND, - zum Ausschließen, *-Platzhalter, CIDR (src:10.0.0.0/8) sowie numerische Bereiche und Vergleiche (port:>1024, count:>=100). Aktive Filter erscheinen als entfernbare Chips |
| Retro-Hunt | Durchsucht alle aufbewahrten Tagesprotokolle nach einem Indikator (/hunt), nicht nur den angezeigten Tag. Begrenzt durch ein Tageslimit, ein Wall-Clock-Budget und eine Stichprobenobergrenze; ein Tag, den das Budget vorzeitig abgeschnitten hat, wird getrennt von den abgeschlossenen Tagen gemeldet, statt als fertige Gesamtsumme gezählt zu werden. Ein tagesbezogener Sidecar-Index (LOG_DIR/index/, USE_EVENT_INDEX) ermöglicht es dem Durchlauf, jede nicht passende Zeile zu überspringen, und macht /counts exakt |
| Weltkarte | Ereignisdichte pro Land für den ausgewählten Tag (/geo), wobei der externe Endpunkt jedes Ereignisses platziert wird. Ereignisse, die keiner externen Adresse zugeordnet werden können, werden als nicht zugeordnet gemeldet, statt geraten zu werden. Setzen Sie HOME_LAT / HOME_LON, um Ursprungsbögen zu zeichnen |
| Triage | Status pro Bedrohung (neu / in Untersuchung / gelöst / falsch positiv), Freitextnotizen, Tags und Ausblenden. Whitelist-Regeln und OSINT-Pivots sind über das Kontextmenü der Zeile verfügbar |
| Gespeicherte Ansichten | Benannte Filter-Voreinstellungen |
| Export | Die aktuelle gefilterte Ansicht als CSV, JSON oder entschärfte Indikatoren |
| Erscheinungsbild | Dunkle und helle Themes sowie diskrete Textgrößenstufen |
Triage-Status, gespeicherte Ansichten, Tags und Erscheinungsbild-Einstellungen werden im Browser
(localStorage) gespeichert, nicht auf dem Server: Sie sind pro Browser und pro Origin und werden nicht
zwischen Analysten geteilt.
Sitzungen, die mit einem Netzwerkfilter eingeschränkt sind, sehen nur Ereignisse aus ihren eigenen Netzwerken, und diese Einschränkung gilt auch für die Zähl-, Karten- und Blacklist-Endpunkte sowie für die Ereignisliste.
Länder- und ASN-Anreicherung für einzelne Adressen wird bei stat.ripe.net vom
Server nachgeschlagen, der die Ergebnisse zwischenspeichert und sie der Oberfläche über seinen eigenen /ripe-
Endpunkt bereitstellt; der Browser kommuniziert mit nichts außer Maltrail. Setzen Sie DISABLE_RIPE_LOOKUPS, um die
ausgehenden Abfragen vollständig abzuschalten. Ohne sie — oder auf einem Host ohne Internetzugang — stammen die Flaggen
stattdessen aus der lokalen RIR-Tabelle, und alles andere in der Oberfläche funktioniert offline.
Leistung
Die Leistung hängt von Prozessor, Datenverkehrszusammensetzung, Größe des Trail-Sets, Capture-Treiber und Netzwerk- schnittstelle ab. Die folgenden Zahlen messen den Paketverarbeitungspfad des Sensors isoliert; sie sind keine End-to-End-Live-Capture-Messungen.
Repräsentative Messungen auf einem AMD Ryzen 7 PRO 4750U mit aktivierten Heuristiken und einem Trail-Set mit 1,5 Millionen Zeilen:
| Datenverkehr | Zeit pro Paket |
|---|---|
| ICMP Echo, 58 Bytes | 101 ns |
| TCP SYN, 70 Bytes | 302 ns |
| Bulk TLS, 1.473 Bytes | 402 ns |
| DNS-Abfrage mit warmem Cache, 93 Bytes | 452 ns |
| Gemischter Datenverkehr, 866 Bytes Durchschnitt | 552 ns |
| HTTP-Anfrage, 169 Bytes | 602 ns |
| DNS-Abfrage mit eindeutigem Namen, 93 Bytes | 1.102 ns |
Offline-Vergleichsläufe mit derselben generierten Aufzeichnung, Konfiguration und demselben Trail-Set maßen einen
um 14–37× niedrigeren stationären Aufwand pro Paket als der ausgemusterte Python-Sensor über die getesteten Systeme.
Diese Zahlen trennen die Gesamtprozesszeit vom stationären Zustand, da das Laden der Trails ein kurzes Replay dominiert. Die
Erkennung selbst wird separat durch den Korpus mit 42 Fällen in
sensor/tests/replay.rs überprüft.
Messen Sie es auf dem Zielsystem mit:```bash cargo bench --manifest-path sensor/Cargo.toml --bench hotpath
Ein Capture-Worker wird standardmäßig verwendet. Zusätzliche Worker können die Erfassungskapazität erhöhen, aber das Linux-Flow-Hashing verteilt den Zustand pro Quelle auf die Worker und verringert dadurch die Empfindlichkeit einiger Scan-Heuristiken. Im dokumentierten Test blieben 91 % der Heuristik-Warnungen bei einem einzelnen Worker erhalten, 86 % bei zwei Workern, 86 % bei vier und 65 % bei acht. Der exakte Trail-Abgleich blieb unverändert. Erhöhen Sie `CAPTURE_FANOUT` nur, wenn die Capture-Drop-Metriken zeigen, dass dies erforderlich ist.
Benchmark-Methodik, Hardware-Ergebnisse, Profiler-Ausgabe, Speichermessungen und Live-Fanout-Prüfungen sind in [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/REPORT.md) dokumentiert.
## Installation
### Installer
Der Installer wird auf zwölf Linux-Distributionen verifiziert — Debian, Ubuntu, Fedora, Rocky, AlmaLinux, Arch, openSUSE Leap und Tumbleweed sowie Alpine — plus FreeBSD und macOS, bei jedem Release, wobei das vollständige Ergebnis in [`docs/compat`](https://github.com/stamparm/maltrail/blob/master/docs/compat) aufgezeichnet wird. Raspberry Pi OS und andere 64-Bit-ARM-Systeme verwenden den `aarch64`-Build; 32-Bit-ARM hat keinen vorgefertigten Sensor und muss ihn aus dem Quellcode erstellen.```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh
Es installiert Abhängigkeiten, erstellt einen verwalteten Checkout unter /opt/maltrail, verifiziert die Prüfsumme
des vorgefertigten Sensors, erstellt ein unprivilegiertes maltrail-Konto, installiert systemd-Units, bereitet
die Log- und State-Verzeichnisse vor und startet den Sensor und den Server. Ein erneutes Ausführen des Installers aktualisiert
den verwalteten Checkout.
Überprüfe das Skript, bevor du es mit erhöhten Rechten ausführst. Von einem vorhandenen Checkout aus zeigt der Dry Run die Befehle an, ohne das System zu verändern:```bash sh install.sh --dry-run
Allgemeine Installationsoptionen:```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
Das Dashboard ist nach der Installation unter http://127.0.0.1:8338 erreichbar. Beachten Sie, dass die mitgelieferte
HTTP_ADDRESS 0.0.0.0 ist, sodass es auf jeder Schnittstelle erreichbar ist, nicht nur auf Loopback — und
die Standard-Anmeldedaten sind admin / changeme!. Ändern Sie USERS und setzen Sie HTTP_ADDRESS auf
127.0.0.1 (oder platzieren Sie den Server hinter einem Reverse-Proxy mit TLS), bevor der Host sich in einem
nicht vertrauenswürdigen Netzwerk befindet.
Der anfängliche Trail-Aufbau kann mehrere Minuten dauern. Der Sensor erkennt keine Trail-Übereinstimmungen, bis ein
gültiger Trail-Satz verfügbar ist. Die systemd-Unit führt die -T-Validierung des Sensors vor dem Start aus, sodass
fehlende Berechtigungen, ein nicht beschreibbares Log-Verzeichnis oder ein ungültiger Trail-Satz einen sichtbaren
Startfehler verursachen.
Die Installer-Testumgebung deckt zwölf Distributionen ab, und „es wurde installiert“ ist nicht die Behauptung: In
jeder wird der Server gestartet und nach /ping gefragt, der Sensor wird aufgefordert, sich mit -T selbst zu
validieren, die Units werden auf auflösbare Pfade geprüft, der Installer wird erneut ausgeführt, um zu belegen, dass
ein Upgrade die Betreiberkonfiguration beibehält, und --uninstall wird ausgeführt. Jedes Ergebnis wird pro Plattform
in docs/compat festgehalten, und die Seite dort wird aus diesen Zeilen generiert statt von Hand
geschrieben.
Alpine und andere musl-Systeme erhalten einen -musl-Sensor-Build. Ihnen wurde früher gesagt, dass das vorgebaute
Binary glibc-gelinkt sei und sie es selbst kompilieren müssten; der Sensor baut und läuft nativ auf musl, sodass dies
ein fehlendes Artefakt und keine Plattformbeschränkung war.
Aus dem Quellcode bauen
Der Sensor erfordert Rust 1.74 oder neuer, libpcap-Entwicklungsheader und die Capability-Tools des Systems. Der Server und der Trail-Updater erfordern Python 3.6 oder neuer.
Installieren Sie die Distributionspakete:```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
Dann den Sensor bauen und validieren:```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
Starten Sie den Server in einem anderen Terminal oder auf einem anderen Host:```bash python3 server.py
Vorkompilierte Sensor-Binärdateien sind den aktuellen Releases mit SHA-256-Prüfsummen beigefügt: Linux `x86_64`
und `aarch64` sowohl gegen glibc als auch musl, macOS auf Apple Silicon und Intel, FreeBSD `amd64` und
Windows `x86_64`.
Die glibc-Builds linken libpcap statisch und zielen auf glibc 2.28 ab, sodass die C-Bibliothek das Einzige ist, was sie
benötigen — nichts zu installieren, auf RHEL 8+, Debian 10+, Ubuntu 18.04+ und Leap 15.x gleichermaßen. Die musl-
Builds sind vollständig statisch, sodass Alpine überhaupt nichts benötigt. Der Windows-Build ist 64-Bit und benötigt Windows 10 oder später sowie
[Npcap](https://npcap.com), das installiert sein muss, bevor er startet — `wpcap.dll` ist eine Ladezeit-Abhängigkeit,
sodass der Loader ohne sie die ausführbare Datei verweigert, anstatt bei der Erfassung fehlzuschlagen. Das Archiv sagt das
ebenfalls.
Binärdateien aus **3.1.1 und früher** taten das nicht: Sie linkten libpcap dynamisch und fragten sie unter
dem Namen an, den ihr AlmaLinux-Build-Host verwendet. Debian und Ubuntu liefern die identische Bibliothek unter dem
älteren Namen `libpcap.so.0.8`, sodass diese Binärdateien stoppen, bevor sie starten —```
./maltrail-sensor: error while loading shared libraries: libpcap.so.1: cannot open shared object file
— auf einer Maschine, auf der libpcap installiert ist. install.sh verlinkt den fehlenden Namen für dich. Manuell:```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
Die mitgelieferten Units unter `packaging/systemd/` führen beide Prozesse als
unprivilegierten Benutzer `maltrail` aus. Systemd erstellt `/var/log/maltrail` und `/var/lib/maltrail`, schränkt
den Dateisystemzugriff ein und gewährt dem Sensor `CAP_NET_RAW` und `CAP_NET_ADMIN`.
Der Installer konfiguriert diese Units automatisch. Bei einer bestehenden Quellinstallation folgen Sie
dem manuellen Dienstverfahren in [`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/master/sensor/docs/INSTALL.md).
Prüfen Sie den Dienststatus und die Logs mit:```bash
systemctl status maltrail-sensor maltrail-server
journalctl -u maltrail-sensor -f
Docker
Starten Sie die bereitgestellte Compose-Bereitstellung mit:```bash docker compose -f docker/docker-compose.yml up -d
Container-Konfiguration, Speicher, Berechtigungen und Health-Checks sind dokumentiert in
[`docker/README.md`](https://github.com/stamparm/maltrail/blob/master/docker/README.md).
## Konfiguration
Maltrail liest `maltrail.conf`, das separate `[Sensor]`- und `[Server]`-Einstellungen enthält. Der
Installer legt die verwaltete Konfiguration unter `/etc/maltrail.conf` ab.
Häufig verwendete Sensor-Optionen sind:
| Option | Zweck |
| --- | --- |
| `MONITOR_INTERFACE` | Capture-Schnittstelle oder -Schnittstellen; `any` wählt alle unterstützten Schnittstellen aus |
| `CAPTURE_FILTER` | BPF-Capture-Filter |
| `CAPTURE_FANOUT` | Anzahl der Linux-Capture-Sockets; standardmäßig eins |
| `CAPTURE_WORKERS` | Capture-Worker, jeweils ein Socket; standardmäßig `CAPTURE_FANOUT`, also eins, sofern nicht eine der beiden Optionen gesetzt ist |
| `LOG_DIR` | Lokales Ereignisprotokoll-Verzeichnis |
| `TRAILS_FILE` | Generierte Trail-Datenbank |
| `LOG_SERVER` | Remote-Maltrail-Ereignisserver |
| `SYSLOG_SERVER` | CEF-Syslog-Ziel oder -Ziele |
| `LOGSTASH_SERVER` | Logstash-JSON-Ziel oder -Ziele |
| `STATS_ADDRESS` | Prometheus-Metriken-Listener; deaktiviert, sofern nicht konfiguriert |
| `UPDATE_PERIOD` | Aktualisierungsintervall für Trails |
| `STATIC_TRAILS_URL` | Quelle, von der das zusammengestellte statische Trail-Set abgerufen wird; binden Sie sie an ein datiertes Release, um zu steuern, wann neue Inhalte eintreffen |
| `USER_WHITELIST` | Vom Betreiber verwaltete Indikatoren, die keinen Alarm auslösen sollen |
| `CUSTOM_TRAILS_DIR` | Vom Betreiber verwaltetes Trail-Verzeichnis |
| `STATIC_TRAILS_DIR` | Optionaler Checkout des Trail-Repositories; wird nur verwendet, um die Quellenangabe eines Trails in der UI anzuzeigen |
`PROCESS_COUNT` gilt für den ausgemusterten Python-Sensor und für die Legacy-Ereignisprotokoll-Drosselung; es
legt **nicht** die Worker-Anzahl des Rust-Sensors fest. Konfigurieren Sie Capture-Worker stattdessen mit `CAPTURE_FANOUT` oder
`CAPTURE_WORKERS`.
Führen Sie die Deployment-Prüfung nach Änderungen an der Konfiguration aus:```bash
sensor/target/release/maltrail-sensor -T
Die Prüfung validiert Konfiguration, Trails, Whitelist-Einträge, Capture-Filter, Berechtigungen, Log-Speicherung, Update-Unterstützung und Worker-Einstellungen. Eine erfolgreiche Prüfung enthält positive Trail- und Whitelist-Anzahlen, anstatt nur zu bestätigen, dass Dateien existieren.
Trails
Ein Trail ist ein Indikator — eine Domain, URL, IP-Adresse, ein IP:port-Paar, User-Agent, JA3/JA4-Fingerabdruck oder Zertifikats-Hash — zusammen mit seiner Bedeutung und seiner Herkunft. Der Updater führt vier Quellen in TRAILS_FILE zusammen, in dieser Reihenfolge:
| Quelle | Herkunft |
|---|---|
| Feeds | feeds/*.py, direkt von Ihrer Deployment-Umgebung von jedem Publisher abgerufen |
| Custom | CUSTOM_TRAILS_DIR und CUSTOM_TRAILS_URL, Ihre eigenen Indikatoren |
| Static | die zusammengestellte Menge aus stamparm/trails, abgerufen von STATIC_TRAILS_URL; separat lizenziert |
| Engine-Listen | data/mass_scanner*.txt, hier mitgeliefert, da sie sich selten ändern |
Die statischen Trails befinden sich in ihrem eigenen Repository. Erkennungsinhalte ändern sich dutzende Male pro Tag; die Engine nicht, und sie zusammenzuhalten bedeutete, dass eine Aktualisierung der Erkennung das Abrufen von Code erforderte und die Historie dieses Repositorys unbrauchbar machte. STATIC_TRAILS_URL verweist auf die neueste veröffentlichte Menge:```text
STATIC_TRAILS_URL https://github.com/stamparm/trails/releases/latest/download/trails.csv.gz
Richte es stattdessen auf ein bestimmtes `content-YYYYMMDD-HHMM`-Release aus, um eine Version festzuzurren, damit eine fehlerhafte Veröffentlichung nicht sofort global wird. Das Set wird neben `TRAILS_FILE` zwischengespeichert, was einen Offline- oder Air-Gapped-Rebuild ermöglicht; die veröffentlichte `sha256` wird vor dem Herunterladen geprüft, sodass ein Deployment, das häufiger aktualisiert als sich der Inhalt ändert, 65 Bytes statt 11 MB überträgt, und eine Payload, die nicht zu ihrem Digest passt, zugunsten des Caches abgelehnt wird.
`update_trails()` veröffentlicht eine neue `TRAILS_FILE` atomar und erst nach einem erfolgreichen Build. Feeds, die nichts zurückgeben, werden namentlich gemeldet, damit ein Deployment nicht stillschweigend von einer Quelle abhängt, die still und leise eingestellt wurde.
Füge deine eigenen Indikatoren unter `CUSTOM_TRAILS_DIR` hinzu und alles, was niemals ein Event auslösen darf, unter `USER_WHITELIST`. Halte beides außerhalb des Installationsverzeichnisses, damit ein Upgrade sie nicht überschreiben kann.
Statische Trail-Beiträge gehen an [stamparm/trails](https://github.com/stamparm/trails); neue Feeds gehören hierher. In beiden Fällen benötigt ein Indikator eine Klassifizierung und eine Quelle, die jemand überprüfen kann — siehe [Contributing](#contributing).
## Events und API
Maltrail zeichnet ein durch Leerzeichen getrenntes Event pro Erkennung auf und verwendet CSV-Quoting, wenn ein Wert Leerzeichen enthält:```text
"<time>" <sensor> <src_ip> <src_port> <dst_ip> <dst_port> <proto> <type> <trail> "<info>" <reference>
Das type-Feld gibt an, was übereinstimmte, einschließlich DNS, IP, IPORT, URL, PATH, HTTP,
UA, PORT, CERT, JA3 und JA4. Das info-Feld enthält die Trail-Klassifizierung, und
reference gibt die statische Liste, den Feed, die benutzerdefinierte Quelle oder die Heuristik an, die sie erzeugt hat. Die
Typen JA3/JA4 werden bei TLS-Client-Fingerabdrücken ausgelöst: Der TLS-Stack eines Implantats überlebt jede
Adress- und Domain-Rotation, sodass sein Hello-Hash weiterhin übereinstimmt, nachdem alles andere verbrannt ist
(veröffentlicht durch den abuse.ch SSLBL JA3-Feed).
Indikator-Lookup
Verwenden Sie /check, um eine Domain, eine IP-Adresse oder eine URL abzufragen:```bash
curl 'http://127.0.0.1:8338/check?q=www.sub.evil.example'
| `-s` | `--server` | Server-Modus aktivieren |
| `-c` | `--client` | Client-Modus aktivieren |
| `-p` | `--port` | Port-Nummer angeben |
| `-h` | `--help` | Hilfe-Nachricht anzeigen |
| `-v` | `--version` | Versionsinformationen anzeigen |
### Beispiele
```bash
# Server-Modus starten
./tool -s -p 8080
# Client-Modus starten
./tool -c -p 8080
Konfiguration
Die Konfigurationsdatei befindet sich unter /etc/tool/config.yml.```json
{
"query": "www.sub.evil.example",
"found": true,
"trail": "evil.example",
"info": "asyncrat (malware)",
"reference": "(static)",
"confidence": 100
}
Das `confidence`-Feld (0-100 oder `null`, wenn nicht verfügbar) gibt an, wie stark die Quellen den
Eintrag stützen: 40 für einen einzelnen Feed, +15 pro zusätzlichem, unabhängig übereinstimmendem Feed bis maximal 100, und
volle Punktzahl für die eigenen benutzerdefinierten und statischen Einträge des Betreibers. Es wird zum Zeitpunkt der Trail-Aktualisierung aus
der Feed-Übereinstimmung in eine `trails.confidence`-Sidecar-Datei neben `trails.csv` berechnet; ein Server, der Trails
von einem `UPDATE_SERVER` bezieht, hat keine Herkunftsdaten zum Bewerten und meldet `null`. Verwenden Sie es zur Priorisierung
der Triage – ein Eintrag aus einem einzelnen Feed mit 40 verdient einen zweiten Blick, bevor er eine Firewall-Regel erhält.
Eine Subdomain-Suche kann auf ihr gelistetes Parent-Verzeichnis passen. URL-Suchen prüfen `host/path`, bevor sie den
Host allein prüfen. Der Server liest die speichergemappte Trail-Datenbank und beobachtet Trail-Aktualisierungen ohne
Neustart.
Öffentliche statische und Feed-Trails sind ohne Authentifizierung verfügbar, konsistent mit dem `/trails`-
Endpunkt, der von Remote-Sensoren verwendet wird. Benutzerdefinierte Trails erfordern eine autorisierte Sitzung; eine nicht autorisierte
Suche nur nach benutzerdefinierten Trails wird als Fehltreffer gemeldet. Ereignisdaten bleiben authentifiziert.
## Betrieb
### Überwachung
Verwenden Sie `maltrail-sensor -T` als Bereitstellungs- und Konfigurationsprüfung. Die mitgelieferte systemd-Unit führt es
als `ExecStartPre` aus.
Um zu bestätigen, dass die Erkennung selbst funktioniert – nicht nur, dass die Prozesse starten –, führen Sie aus:```bash
python3 server.py --detect-test
Er spielt einen präparierten pcap mit emuliertem bösartigem Datenverkehr (Trail-Treffer auf eine DNS-Abfrage, eine IP, einen
IP:port, einen URL-Pfad und einen Host-Header, plus die SQL-Injection-, Traversal-, RCE-, XSS-, Proxy-Probe-,
Sinkhole-, fehlender-Host- und Port-/Web-/Infektions-Scanning-Heuristiken) durch den installierten Sensor
und stellt sicher, dass jede erwartete Erkennung ausgelöst wird. Er benötigt kein Root, kein Interface und keinen eigenen Trail-Satz.
Eine gesunde Installation gibt 20/20 detection(s) fired aus.
Wenn STATS_ADDRESS konfiguriert ist, überwachen Sie mindestens diese Prometheus-Metriken:
| Metrik | Operative Bedeutung |
|---|---|
maltrail_up == 0 | Es läuft kein Capture-Worker |
Steigendes maltrail_capture_dropped_total | Der Capture-Ring verwirft Pakete |
Steigendes maltrail_local_log_errors_total | Ereignisse wurden erzeugt, konnten aber nicht lokal geschrieben werden |
Steigendes maltrail_remote_log_errors_total | Ereignisse konnten nicht an eine Remote-Senke zugestellt werden; mit DISABLE_LOCAL_LOG_STORAGE gehen sie verloren |
maltrail_trail_generation steigt nicht | Der aktive Trail-Satz wird nicht aktualisiert |
maltrail_log_dir_free_bytes | Verbleibende Kapazität für lokale Ereignisspeicherung |
Steigendes maltrail_state_saturations_total | Ein Heuristik-Zustandslimit wurde erreicht |
Steigendes maltrail_throttle_evictions_total | Die Ereignis-Drosseltabelle ist an ihrem Limit, sodass Ereignisse früher als konfiguriert aggregiert werden |
Zustandssättigung beeinträchtigt die entsprechende Heuristik; exaktes Trail-Matching bleibt aktiv.
Senden Sie SIGHUP oder verwenden Sie systemctl reload maltrail-sensor, um ein Trail-Reload anzufordern. Trail-Dateien,
die von einem anderen Prozess aktualisiert werden, werden automatisch erkannt und ohne Neustart des Sensors an die Worker
veröffentlicht.
Der kondensierte observable Store (USE_CONDENSED_STORAGE, meta.sqlite) unterstützt die Novelty- und Retro-Hunt-Ansichten
des Servers. Der tagesweise Event-Log-Sidecar-Index (USE_EVENT_INDEX, LOG_DIR/index/*.sqlite, etwa doppelt so groß wie
das Log auf der Festplatte) ist das, was /counts exakt und /hunt schnell macht; er wird inkrementell aus den Logs selbst
gepflegt und kann mit server.py --rebuild-index neu aufgebaut werden. Die Kompatibilität mit dem ausgemusterten Sensor ist
in sensor/docs/COMPATIBILITY.md dokumentiert.
Ereignisaufbewahrung
Maltrail rotiert oder löscht Ereignis-Logs nicht. Betreiber sind dafür verantwortlich, Aufbewahrung, Archivierung und Löschung gemäß den Speicheranforderungen und der organisatorischen Richtlinie festzulegen.
Empfohlene Vorgehensweisen:
- Senden Sie die dauerhafte Ereigniskopie mit
LOG_SERVER,SYSLOG_SERVERoderLOGSTASH_SERVERan einen Remote-Maltrail-Server oder ein SIEM. - Alarmieren Sie bei
maltrail_log_dir_free_bytesmit ausreichendem Puffer für die erwartete Ereignisrate. - Rotieren, archivieren oder entfernen Sie lokale Tages-Logs mit externen Tools.
- Halten Sie Dateien, die von der Reporting-Oberfläche benötigt werden, unkomprimiert in
LOG_DIR; archivieren Sie komprimierte Dateien an anderer Stelle.
Wenn das Log-Dateisystem voll ist, kann der Sensor keine Ereignisse anhängen. Ereignis-Logs können auch IP-Adressen und Domains enthalten, die in einigen Jurisdiktionen als personenbezogene Daten reguliert sind; die Aufbewahrungsrichtlinie sollte die anwendbaren Anforderungen berücksichtigen.
Synthetischer Datenverkehr
Um zu prüfen, ob Erkennung und Dashboard noch funktionieren, ohne auf echten Datenverkehr zu warten:```bash python3 server.py --detect-test # assert every detection fires, then exit python3 server.py --detect-test --keep DIR --serve # ...and keep the events, serving them on :8338
`--keep` spielt außerdem `sensor/tests/corpus/` in dasselbe Log ein und gibt aus, hinter welchen der Formen, die das Dashboard anders darstellt, ein Event steht, sodass ein fehlendes Icon, eine fehlende Farbe oder ein fehlendes Glyph sichtbar wird statt angenommen zu werden. Zeitstempel werden so verschoben, dass der neueste Tag heute ist. Eine Sensor-Binary ist erforderlich (`cargo build --release --manifest-path sensor/Cargo.toml`).
Die Daten der öffentlichen Demo werden aus einem solchen Lauf neu generiert:```bash
python3 sensor/tools/gen_demo_js.py --from DIR/logs # tops up html/js/demo.js
Dokumentation
| Dokument | Inhalt |
|---|---|
sensor/docs/INSTALL.md | Installation, Berechtigungen, Konfiguration und Fehlerbehebung |
sensor/docs/ARCHITECTURE.md | Sensor-Interna und Datenfluss |
sensor/docs/COMPATIBILITY.md | Bewusste Unterschiede zum eingestellten Python-Sensor |
sensor/docs/REPORT.md | Messungen, Profile und Testergebnisse |
sensor/docs/ROADMAP.md | Offene Sensor-Arbeiten |
SekuriPy Labs | Engineering-Notizen, Benchmarks und Berichte |
Mitwirken
Ergänzungen von Trails, Pflege von Feeds, Fehlerberichte, Dokumentation und Sensor-Verbesserungen sind willkommen. Trail-Einreichungen sollten eine zuverlässige Quelle enthalten und die engste passende Klassifizierung verwenden.
Führen Sie die relevanten Prüfungen aus, bevor Sie Code einreichen. Das vollständige Sensor-Gate ist:```bash bash sensor/tools/check.sh
Es führt Formatierung, Clippy mit verweigerten Warnungen sowie die Debug- und Release-Testsuiten aus. Führe die Python-Server-Suite aus mit:```bash
bash tests/run.sh python3
Der Windows-Build kann von Linux aus ausgeführt werden, wo seine Fehler gefunden wurden:```bash sh sensor/tools/check_windows.sh
Es kompiliert den Sensor mit mingw-w64 cross, extrahiert Npcaps Userspace-Bibliothek aus dessen Installer
(ein NSIS-Archiv, sodass nichts installiert wird) und führt das Ergebnis unter Wine aus — die gesamte Unit-Suite,
`-T` gegen die mitgelieferte Konfiguration, das pcap-Korpus Byte für Byte gegen die native
Binärdatei verglichen, und der Server, der unter einem Windows-Python auf `/ping` antwortet. Live-Capture ist das Einzige, was es nicht abdecken kann; das benötigt Npcaps Kernel-Treiber und eine echte Windows-Maschine. Voraussetzungen sind
`gcc-mingw-w64-x86-64`, `wine` und `p7zip-full`.
## Projekt
### Lizenz
**TL;DR:** Maltrail ist MIT-lizenziert, aber das Maltrail Trails-Dataset hat separate Bedingungen. Unabhängige IOC-Lookup/Referenz ist in Ordnung; die systematische Nutzung von Trails als Intelligence-Quelle in einem kommerziellen Produkt oder Dienst erfordert Erlaubnis/Lizenzierung.
Maltrail wird unter der MIT-Lizenz vertrieben. Siehe [`LICENSE`](https://github.com/stamparm/maltrail/blob/master/LICENSE).
Das ist die Engine. Das statische Trail-Set ist separate Arbeit unter separaten Bedingungen: kostenlos für interne
defensive Nutzung, Forschung und Lehre, aber ein kommerzielles Produkt, ein Dienst, ein MSSP- oder MDR-Angebot oder ein
weiterverteilter Feed benötigt eine Lizenz. Eine MIT-Engine macht den Inhalt nicht frei verkäuflich — siehe
[`LICENSE.md`](https://github.com/stamparm/trails/blob/main/LICENSE.md) in
[stamparm/trails](https://github.com/stamparm/trails), bevor du es in etwas auslieferst, für das du Geld
verlangst.
### Maintainer
- Miroslav Stampar ([@stamparm](https://github.com/stamparm))
- Mikhail Kasimov ([@MikhailKasimov](https://github.com/MikhailKasimov))
### Sponsoren
- [Sansec](https://sansec.io/) (2024–2025)
- [Sansec](https://sansec.io/) (2020–2021)
### Präsentationen und Publikationen
- 47. TF-CSIRT Meeting, Prag, 2016
([Folien](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
([Artikel](https://www.linux-magazine.com/Issues/2022/258/Maltrail))
- _Best Cyber Threat Intelligence Feeds_, Silent Push, 2022
([Rezension](https://www.silentpush.com/blog/best-cyber-threat-intelligence-feeds))
- _Research on Network Malicious Traffic Detection System Based on Maltrail_, Nanotechnology
Perceptions, 2024
([Paper](https://nano-ntp.com/index.php/nano/article/view/1915/1497))
### Integrationen von Drittanbietern
- [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) (nur Trails)
- [MalwareWorld](https://www.malwareworld.com/) (nur Trails)
- [oisd domain blocklist](https://oisd.nl/?p=inc) (nur Trails)
- [NextDNS](https://github.com/nextdns/metadata/blob/e0c9c7e908f5d10823b517ad230df214a7251b13/security/threat-intelligence-feeds.json) (nur Trails)
- [NoTracking](https://github.com/notracking/hosts-blocklists/blob/master/SOURCES.md) (nur Trails)
- [OWASP Mobile Audit](https://github.com/mpast/mobileAudit#environment-variables) (nur Trails)
- [Mobile Security Framework MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF/commit/12b07370674238fa4281fc7989b34decc2e08876) (nur Trails)
- [pfBlockerNG-devel](https://github.com/pfsense/FreeBSD-ports/blob/devel/net/pfSense-pkg-pfBlockerNG-devel/files/usr/local/www/pfblockerng/pfblockerng_feeds.json) (nur Trails)
- [Sansec eComscan](https://sansec.io/kb/about-ecomscan/ecomscan-license) (nur Trails)
- [Palo Alto Networks Cortex XSOAR](https://xsoar.pan.dev/docs/reference/integrations/github-maltrail-feed) (Trail-Connector)
### Danksagungen
- Thomas Kristner
- Eduardo Arcusa Les
- James Lay
- Ladislav Baco (@laciKE)
- John Kristoff (@jtkdpu)
- Michael Münz (@mimugmail)
- David Brush
- @Godwottery
- Chris Wild (@briskets)
- Keith Irwin (@ki9us)
- Simon Szustkowski (@simonszu)