
macnoise v0.2.1
Générateur de télémétrie système MacOS extensible.
MacNoise
MacNoise génère de la télémétrie macOS réelle : connexions réseau, écritures de fichiers, lancements de processus, mutations de plist, sondes TCC, et plus encore. Pointez-le vers une machine exécutant votre pile EDR, SIEM ou pare-feu et observez ce qui se déclenche réellement - et non ce que la fiche technique du fournisseur prétend qu'il déclenchera.
Pour en savoir plus sur la motivation et la conception, consultez l'article de blog de la version.
Démarrage rapide
# 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
Catégories de télémétrie
| Catégorie | Description |
|---|---|
network | Connexions TCP, HTTP, écouteurs, reverse shells, DNS et TLS |
process | Exécution exacte, livraison de signaux, injection de dylib, contournement de Gatekeeper et osascript |
file | Découverte bornée, lectures/copies littérales, création, modification, archivage, dissimulation et chiffrement leurre |
tcc | Sondes de permissions TCC avec exigences exactes d'Accès complet au disque, Contacts, Accessibilité ou Enregistrement de l'écran |
credential | Accès natif au magasin d'identifiants |
volume | Création d'images disque et cycle de vie des volumes montés |
service | Énumération Launchd, persistance LaunchAgent/Daemon, cron, profil shell et éléments de connexion |
plist | Création et modification de plist |
evasion | Effacement des journaux, timestomping, suppression de l'historique et usurpation d'identité |
Consultez le catalogue des modules généré pour chaque module, paramètre, sortie, type d'événement, privilège et mappage ATT&CK.
Commandes
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
Flags globaux
| Flag | Valeur par défaut | Description |
|---|---|---|
--format | human | Format de sortie : human ou jsonl |
--output | (aucun) | Écrire la sortie dans un fichier (en plus de stdout) |
--verbose | false | Sortie détaillée incluant les erreurs de nettoyage |
--dry-run | false | Prévisualiser les actions sans les exécuter |
--no-cleanup | false | Laisser les artefacts des modules en place (voir ci-dessous) |
--timeout | 30 | Délai d'expiration par module en secondes |
--audit-log | (aucun) | Écrire les enregistrements d'audit OCSF 1.7.0 dans un fichier JSONL |
--config | (aucun) | Charger les valeurs par défaut depuis un fichier de configuration YAML |
--run-id | généré | Définir l'identifiant de corrélation pour cette exécution |
Flux de données des scénarios
Les fichiers de scénario utilisent version: 1. Les entrées et les sorties des modules sont typées, et une
étape ultérieure y fait référence via des mappages explicites plutôt que par
interpolation de chaînes :
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
Seules les sorties déclarées par un module peuvent être référencées. Les scénarios locaux peuvent être réutilisés avec une étape include ; les inclusions sont relatives, ne peuvent pas remonter au-dessus du répertoire racine des scénarios, font l'objet d'une vérification de cycle et sont limitées à huit niveaux. MacNoise valide le graphe complet avant l'exécution, attribue à l'exécution un espace de travail privé et nettoie les modules invoqués dans l'ordre inverse. Utilisez --input content=value pour fournir des entrées et --report report.json pour le rapport d'exécution versionné.
Laisser les artefacts en place
Par défaut, chaque module s'inverse lui-même lorsqu'il se termine. C'est généralement ce que vous souhaitez, mais cela signifie qu'une détection ne voit jamais que l'événement d'installation. Pour valider que votre pile détecte la persistance elle-même — un LaunchAgent résidant dans ~/Library/LaunchAgents, une entrée cron, un profil shell modifié — l'artefact doit toujours être présent au moment où l'analyse s'exécute :
./macnoise run svc_launch_agent --no-cleanup
Chaque module qui ignore le nettoyage affiche une ligne portant son nom, et le journal d'audit enregistre cleanup_result: skipped plutôt que ok, afin qu'une exécution ayant laissé une persistance derrière elle ne soit jamais confondue avec une exécution ayant fait le ménage. Utilisez macnoise info <module> pour voir ce qu'un module donné crée.
Il vous incombe de les supprimer vous-même. Réexécuter le même module sans le drapeau ne nettoiera que ce que cette exécution a créé, et non ce qu'une exécution précédente avec --no-cleanup a laissé derrière elle.
Journalisation d'audit
MacNoise écrit deux flux distincts. Les événements de télémétrie — ce que votre EDR/SIEM voit réellement — vont vers stdout ou --output. Un second flux, facultatif, enregistre ce que MacNoise lui-même a fait : quels modules se sont exécutés, les résultats des prérequis/nettoyages et les correspondances MITRE, au format JSONL OCSF 1.7.0.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Chaque événement de télémétrie porte un outcome faisant autorité et un subject typé (schéma 2.0). L'outcome indique ce qui est advenu de l'action tentée par MacNoise, tandis que le subject identifie le fichier, le processus, le point de terminaison réseau, le service ou la ressource impliqués :
outcome | Signification | Marqueur humain |
|---|---|---|
executed | L'action s'est exécutée et a fait ce que le module prétend | [+] |
denied | L'action s'est exécutée et l'environnement l'a refusée | [-] |
indeterminate | L'action s'est exécutée, mais rien ne peut être conclu | [?] |
error | MacNoise lui-même n'a pas réussi à exécuter l'action | [!] |