Zurück zu den Updates
New releaseAug 28, 2026

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.

Teilen

Maltrail

License Sensor Server Trails X

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.

Maltrail-Berichtsoberfläche

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.

FunktionHinweise
Live-ModusAngehä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
SucheFeldbezogene 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-HuntDurchsucht 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
WeltkarteEreignisdichte 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
TriageStatus 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 AnsichtenBenannte Filter-Voreinstellungen
ExportDie aktuelle gefilterte Ansicht als CSV, JSON oder entschärfte Indikatoren
ErscheinungsbildDunkle 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:

DatenverkehrZeit pro Paket
ICMP Echo, 58 Bytes101 ns
TCP SYN, 70 Bytes302 ns
Bulk TLS, 1.473 Bytes402 ns
DNS-Abfrage mit warmem Cache, 93 Bytes452 ns
Gemischter Datenverkehr, 866 Bytes Durchschnitt552 ns
HTTP-Anfrage, 169 Bytes602 ns
DNS-Abfrage mit eindeutigem Namen, 93 Bytes1.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:

QuelleHerkunft
Feedsfeeds/*.py, direkt von Ihrer Deployment-Umgebung von jedem Publisher abgerufen
CustomCUSTOM_TRAILS_DIR und CUSTOM_TRAILS_URL, Ihre eigenen Indikatoren
Staticdie zusammengestellte Menge aus stamparm/trails, abgerufen von STATIC_TRAILS_URL; separat lizenziert
Engine-Listendata/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:

MetrikOperative Bedeutung
maltrail_up == 0Es läuft kein Capture-Worker
Steigendes maltrail_capture_dropped_totalDer Capture-Ring verwirft Pakete
Steigendes maltrail_local_log_errors_totalEreignisse wurden erzeugt, konnten aber nicht lokal geschrieben werden
Steigendes maltrail_remote_log_errors_totalEreignisse konnten nicht an eine Remote-Senke zugestellt werden; mit DISABLE_LOCAL_LOG_STORAGE gehen sie verloren
maltrail_trail_generation steigt nichtDer aktive Trail-Satz wird nicht aktualisiert
maltrail_log_dir_free_bytesVerbleibende Kapazität für lokale Ereignisspeicherung
Steigendes maltrail_state_saturations_totalEin Heuristik-Zustandslimit wurde erreicht
Steigendes maltrail_throttle_evictions_totalDie 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_SERVER oder LOGSTASH_SERVER an einen Remote-Maltrail-Server oder ein SIEM.
  • Alarmieren Sie bei maltrail_log_dir_free_bytes mit 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

DokumentInhalt
sensor/docs/INSTALL.mdInstallation, Berechtigungen, Konfiguration und Fehlerbehebung
sensor/docs/ARCHITECTURE.mdSensor-Interna und Datenfluss
sensor/docs/COMPATIBILITY.mdBewusste Unterschiede zum eingestellten Python-Sensor
sensor/docs/REPORT.mdMessungen, Profile und Testergebnisse
sensor/docs/ROADMAP.mdOffene Sensor-Arbeiten
SekuriPy LabsEngineering-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&uuml;nz (@mimugmail)
- David Brush
- @Godwottery
- Chris Wild (@briskets)
- Keith Irwin (@ki9us)
- Simon Szustkowski (@simonszu)

Kategorien