
macnoise v0.2.1
Erweiterbarer MacOS-Systemtelemetrie-Generator.
MacNoise
MacNoise erzeugt echte macOS-Telemetrie: Netzwerkverbindungen, Dateischreibvorgänge, Prozessstarts, Plist-Mutationen, TCC-Probes und mehr. Richte es auf einen Rechner mit deinem EDR-, SIEM- oder Firewall-Stack und sieh, was tatsächlich ausgelöst wird – nicht, was das Datenblatt des Herstellers behauptet.
Hintergrund zu Motivation und Design findest du im Release-Blogbeitrag.
Schnellstart
# Build (add build-amd64 / build-arm64 to cross-compile for Darwin, or release for both)
make build
# List available modules
./macnoise list
# Run a single module
./macnoise run net_connect --param target=127.0.0.1 --param port=8080
# Preview without executing
./macnoise run svc_launch_agent --dry-run
# Run all network modules
./macnoise run --category network
# Run a scenario
./macnoise scenario configs/scenarios/edr_validation.yaml
# Emit structured JSONL output
./macnoise scenario configs/scenarios/file_flow.yaml --format jsonl --output /tmp/events.jsonl
Telemetriekategorien
| Kategorie | Beschreibung |
|---|---|
network | TCP-Verbindungen, HTTP, Listener, Reverse Shells, DNS und TLS |
process | Exakte Ausführung, Signalzustellung, Dylib-Injection, Gatekeeper-Bypass und osascript |
file | Begrenzte Discovery, literale Lese-/Kopiervorgänge, Erstellung, Änderung, Archivierung, Verbergen und Decoy-Verschlüsselung |
tcc | TCC-Berechtigungsprüfungen mit exakten Anforderungen an Full Disk Access, Kontakte, Bedienungshilfen oder Bildschirmaufnahme |
credential | Nativer Zugriff auf den Credential-Store |
volume | Erstellung von Disk-Images und Lebenszyklus gemounteter Volumes |
service | Launchd-Enumeration, LaunchAgent/Daemon-Persistenz, Cron, Shell-Profil und Login Items |
plist | Erstellung und Änderung von Plists |
evasion | Log-Löschung, Timestomping, Entfernung des Verlaufs und Maskerade |
Siehe den generierten Modulkatalog für jedes Modul, jeden Parameter, jede Ausgabe, jeden Ereignistyp, jede Berechtigung und jede ATT&CK-Zuordnung.
Befehle
macnoise run <module> [--param key=val ...] Run a specific module
macnoise run --category <cat> Run all modules in a category
macnoise run --all Run all modules
macnoise list [--category <cat>] List modules
macnoise info <module> Show module details, params, MITRE
macnoise scenario <file.yaml> [--input key=val] [--report report.json]
Run a YAML scenario
macnoise categories List categories with counts
macnoise version Print version
Globale Flags
| Flag | Standard | Beschreibung |
|---|---|---|
--format | human | Ausgabeformat: human oder jsonl |
--output | (keine) | Ausgabe in Datei schreiben (zusätzlich zu stdout) |
--verbose | false | Ausführliche Ausgabe einschließlich Bereinigungsfehlern |
--dry-run | false | Aktionen in der Vorschau anzeigen, ohne sie auszuführen |
--no-cleanup | false | Modulartefakte an Ort und Stelle belassen (siehe unten) |
--timeout | 30 | Timeout pro Modul in Sekunden |
--audit-log | (keine) | OCSF 1.7.0-Auditdatensätze in eine JSONL-Datei schreiben |
--config | (keine) | Standardwerte aus einer YAML-Konfigurationsdatei laden |
--run-id | generiert | Korrelationskennung für diesen Lauf festlegen |
Szenario-Datenfluss
Szenariodateien verwenden version: 1. Eingaben und Modulausgaben sind typisiert, und ein
späterer Schritt referenziert sie mit expliziten Zuordnungen statt String-
Interpolation:
version: 1
name: Archive one generated artifact
on_error: stop
inputs:
content:
type: string
required: true
steps:
# Custom modules declare these outputs through OutputSpecs.
- id: create
module: custom_create
params:
content:
input: content
- id: archive
module: custom_archive
params:
source:
output: create.path
outputs:
archive:
output: archive.path
Nur Ausgaben, die von einem Modul deklariert wurden, können referenziert werden. Lokale Szenarien können
mit einem include-Schritt wiederverwendet werden; Includes sind relativ, können nicht über
das Wurzelverzeichnis des Szenarios hinausgehen, werden auf Zyklen geprüft und sind auf acht Ebenen begrenzt.
MacNoise validiert den vollständigen Graphen vor der Ausführung, gibt dem Lauf einen
privaten Arbeitsbereich und bereinigt aufgerufene Module in umgekehrter Reihenfolge. Verwenden Sie
--input content=value, um Eingaben bereitzustellen, und --report report.json für den
versionierten Ausführungsbericht.
Artefakte an Ort und Stelle belassen
Standardmäßig macht sich jedes Modul selbst rückgängig, wenn es fertig ist. Das ist normalerweise das, was Sie wollen, aber es bedeutet, dass eine Erkennung immer nur das Installations-Ereignis sieht. Um zu validieren, dass Ihr Stack die Persistenz selbst erkennt – ein LaunchAgent, der in ~/Library/LaunchAgents liegt, ein Cron-Eintrag, ein modifiziertes Shell-Profil –, muss das Artefakt noch vorhanden sein, wenn der Scan läuft:
./macnoise run svc_launch_agent --no-cleanup
Jedes Modul, das die Bereinigung überspringt, gibt eine Zeile aus, in der es sich selbst benennt, und das Audit-Log verzeichnet cleanup_result: skipped statt ok, sodass ein Lauf, der Persistenz hinterlassen hat, niemals mit einem verwechselt wird, der aufgeräumt hat. Verwende macnoise info <module>, um zu sehen, was ein bestimmtes Modul erzeugt.
Du bist selbst dafür verantwortlich, diese zu entfernen. Ein erneutes Ausführen desselben Moduls ohne das Flag bereinigt nur das, was dieser Lauf erzeugt hat, nicht das, was ein vorheriger --no-cleanup-Lauf hinterlassen hat.
Audit-Logging
MacNoise schreibt zwei getrennte Streams. Telemetrie-Ereignisse – das, was dein EDR/SIEM tatsächlich sieht – gehen nach stdout oder --output. Ein zweiter, optionaler Stream zeichnet auf, was MacNoise selbst getan hat: welche Module ausgeführt wurden, Ergebnisse von Voraussetzungen/Bereinigung und MITRE-Zuordnungen, im OCSF 1.7.0-JSONL-Format.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Jedes Telemetrie-Ereignis trägt genau ein verbindliches outcome und genau ein typisiertes subject (Schema 2.0). Das Outcome sagt aus, was mit der von MacNoise versuchten Aktion geschehen ist, während das Subject die beteiligte Datei, den Prozess, den Netzwerk-Endpunkt, den Dienst oder die Ressource identifiziert:
outcome | Bedeutung | Menschlicher Marker |
|---|---|---|
executed | Die Aktion wurde ausgeführt und hat das getan, was das Modul behauptet | [+] |
denied | Die Aktion wurde ausgeführt und die Umgebung hat sie verweigert | [-] |
indeterminate | Die Aktion wurde ausgeführt, aber es lässt sich nichts daraus schließen | [?] |
error | MacNoise selbst konnte die Aktion nicht ausführen | [!] |