
macnoise v0.2.1
Generatore di telemetria di sistema MacOS estensibile.
MacNoise
MacNoise genera telemetria macOS reale: connessioni di rete, scritture su file, avvio di processi, mutazioni di plist, sonde TCC e altro ancora. Puntalo verso una macchina che esegue il tuo stack EDR, SIEM o firewall e osserva cosa si attiva realmente, non ciò che la scheda tecnica del fornitore dichiara che si attiverà.
Per il contesto sulle motivazioni e sul design, consulta il post del blog di rilascio.
Avvio rapido
# 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
Categorie di telemetria
| Categoria | Descrizione |
|---|---|
network | Connessioni TCP, HTTP, listener, reverse shell, DNS e TLS |
process | Esecuzione esatta, invio di segnali, iniezione di dylib, bypass di Gatekeeper e osascript |
file | Scoperta limitata, letture/copie letterali, creazione, modifica, archiviazione, occultamento e crittografia esca |
tcc | Sonde sui permessi TCC con requisiti esatti di Accesso completo al disco, Contatti, Accessibilità o Registrazione schermo |
credential | Accesso nativo all'archivio delle credenziali |
volume | Creazione di immagini disco e ciclo di vita dei volumi montati |
service | Enumerazione di Launchd, persistenza LaunchAgent/Daemon, cron, profilo shell e Login Items |
plist | Creazione e modifica di plist |
evasion | Cancellazione dei log, timestomping, rimozione della cronologia e mascheramento |
Consulta il catalogo dei moduli generato per ogni modulo, parametro, output, tipo di evento, privilegio e mappatura ATT&CK.
Comandi
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
Flag globali
| Flag | Predefinito | Descrizione |
|---|---|---|
--format | human | Formato di output: human o jsonl |
--output | (nessuno) | Scrive l'output su file (in aggiunta a stdout) |
--verbose | false | Output dettagliato, inclusi gli errori di pulizia |
--dry-run | false | Anteprima delle azioni senza esecuzione |
--no-cleanup | false | Lascia gli artefatti del modulo al loro posto (vedi sotto) |
--timeout | 30 | Timeout per modulo in secondi |
--audit-log | (nessuno) | Scrive i record di audit OCSF 1.7.0 in un file JSONL |
--config | (nessuno) | Carica i valori predefiniti da un file di configurazione YAML |
--run-id | generato | Imposta l'identificatore di correlazione per questa esecuzione |
Flusso di dati degli scenari
I file di scenario usano version: 1. Gli input e gli output dei moduli sono tipizzati, e
un passaggio successivo vi fa riferimento tramite mappature esplicite anziché
interpolazione di stringhe:
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
Solo gli output dichiarati da un modulo possono essere referenziati. Gli scenari locali possono essere riutilizzati con un passo include; gli include sono relativi, non possono risalire oltre la directory radice degli scenari, sono sottoposti a controllo dei cicli e sono limitati a otto livelli. MacNoise convalida il grafo completo prima dell'esecuzione, assegna alla run un workspace privato e ripulisce i moduli invocati in ordine inverso. Usa --input content=value per fornire gli input e --report report.json per il report di esecuzione versionato.
Lasciare gli artefatti in posizione
Per impostazione predefinita ogni modulo si annulla al termine. Di solito è ciò che si desidera, ma significa che una detection vede solo l'evento di install. Per validare che il tuo stack rilevi la persistenza stessa - un LaunchAgent presente in ~/Library/LaunchAgents, una voce cron, un profilo shell modificato - l'artefatto deve essere ancora lì quando viene eseguita la scansione:
./macnoise run svc_launch_agent --no-cleanup
Ogni modulo che salta la pulizia stampa una riga con il proprio nome, e il registro di audit registra cleanup_result: skipped anziché ok, così un'esecuzione che ha lasciato persistenza dietro di sé non viene mai confusa con una che ha ripulito. Usa macnoise info <module> per vedere cosa crea un determinato modulo.
Sei responsabile di rimuoverli tu stesso. Rieseguire lo stesso modulo senza il flag pulirà solo ciò che quell'esecuzione ha creato, non ciò che una precedente esecuzione con --no-cleanup ha lasciato dietro di sé.
Registrazione di audit
MacNoise scrive due flussi separati. Gli eventi di telemetria - ciò che il tuo EDR/SIEM vede effettivamente - vanno su stdout o --output. Un secondo flusso opzionale registra ciò che MacNoise stesso ha fatto: quali moduli sono stati eseguiti, gli esiti di prereq/cleanup e le mappature MITRE, in JSONL OCSF 1.7.0.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Ogni evento di telemetria porta un outcome autorevole e un subject tipizzato (schema 2.0). L'outcome indica cosa è successo all'azione tentata da MacNoise, mentre il subject identifica il file, il processo, l'endpoint di rete, il servizio o la risorsa coinvolti:
outcome | Significato | Indicatore umano |
|---|---|---|
executed | L'azione è stata eseguita e ha fatto ciò che il modulo dichiara | [+] |
denied | L'azione è stata eseguita e l'ambiente l'ha rifiutata | [-] |
indeterminate | L'azione è stata eseguita, ma non è possibile concludere nulla | [?] |
error | MacNoise stesso non è riuscito a portare a termine l'azione | [!] |
Una sonda TCC negata o un beacon verso un C2 morto è la telemetria che questo strumento esiste per generare, quindi è distinta da error, che significa che MacNoise stesso ha fallito. Il registro di audit registra lo stesso valore in unmapped.outcome. I parametri dichiarati sensibili vengono sostituiti con [REDACTED] nei record di audit gestiti e nell'identità della riga di comando.