
Generatore di telemetria di sistema macOS estensibile.
MacNoise genera telemetria macOS reale: connessioni di rete, scritture su file, spawn di processi, mutazioni di plist, probe 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.
# 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
| 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 cifratura di esche |
tcc | Probe dei permessi TCC con requisiti esatti di Full Disk Access, Contatti, Accessibilità o Registrazione Schermo |
credential | Accesso nativo al credential-store |
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.
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 | Predefinito | Descrizione |
|---|---|---|
--format | human | Formato di output: human o jsonl |
--output | (nessuno) | Scrivi l'output su file (oltre che su 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 sul posto (vedi sotto) |
--timeout | 30 | Timeout per modulo in secondi |
--audit-log | (nessuno) | Scrivi i record di audit OCSF 1.7.0 su 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 |
I file di scenario usano version: 1. Gli input e gli output dei moduli sono tipizzati, e uno
step successivo li referenzia con mappature esplicite anziché con l'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 uno step include; gli include sono relativi, non possono risalire oltre
la directory radice dello scenario, sono controllati per cicli e sono limitati a otto livelli.
MacNoise valida il grafo completo prima dell'esecuzione, assegna all'esecuzione un
workspace privato e pulisce i moduli invocati in ordine inverso. Usa
--input content=value per fornire gli input e --report report.json per il
report di esecuzione versionato.
Per impostazione predefinita ogni modulo si annulla al termine. Di solito è ciò che vuoi, ma significa che una detection vede solo l'evento di installazione. Per validare che il tuo stack rilevi la persistenza stessa - un LaunchAgent che risiede 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 che lo nomina, e il log 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 dato modulo.
Sei responsabile della loro rimozione. 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é.
MacNoise scrive due flussi separati. Gli eventi di telemetria - ciò che il tuo EDR/SIEM vede effettivamente - vanno su stdout o su --output. Un secondo flusso opzionale registra ciò che MacNoise stesso ha fatto: quali moduli sono stati eseguiti, gli esiti di prerequisiti/pulizia 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 unico outcome autorevole e un unico subject tipizzato (schema 2.0). L'outcome dice 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 si può concludere nulla | [?] |
error | MacNoise stesso non è riuscito a portare a termine l'azione | [!] |
Una probe 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 log 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.