
macnoise v0.2.1
Generador extensible de telemetría del sistema macOS.
MacNoise
MacNoise genera telemetría real de macOS: conexiones de red, escrituras de archivos, creación de procesos, mutaciones de plist, sondas TCC y más. Apúntalo a una máquina que ejecute tu stack de EDR, SIEM o firewall y observa qué se activa realmente, no lo que la hoja de datos del proveedor afirma que se activará.
Para conocer los antecedentes sobre la motivación y el diseño, consulta la publicación del blog de lanzamiento.
Inicio rápido
# 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
Categorías de telemetría
| Categoría | Descripción |
|---|---|
network | Conexiones TCP, HTTP, listeners, reverse shells, DNS y TLS |
process | Ejecución exacta, entrega de señales, inyección de dylib, omisión de Gatekeeper y osascript |
file | Descubrimiento acotado, lecturas/copias literales, creación, modificación, archivado, ocultamiento y cifrado señuelo |
tcc | Sondas de permisos TCC con requisitos exactos de Acceso Total al Disco, Contactos, Accesibilidad o Grabación de Pantalla |
credential | Acceso nativo al almacén de credenciales |
volume | Creación de imágenes de disco y ciclo de vida de volúmenes montados |
service | Enumeración de Launchd, persistencia de LaunchAgent/Daemon, cron, perfil de shell y elementos de inicio de sesión |
plist | Creación y modificación de plist |
evasion | Borrado de registros, timestomping, eliminación de historial y enmascaramiento |
Consulte el catálogo de módulos generado para conocer cada módulo, parámetro, salida, tipo de evento, privilegio y mapeo ATT&CK.
Comandos
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 globales
| Flag | Predeterminado | Descripción |
|---|---|---|
--format | human | Formato de salida: human o jsonl |
--output | (ninguno) | Escribir la salida en un archivo (además de stdout) |
--verbose | false | Salida detallada, incluidos los errores de limpieza |
--dry-run | false | Previsualizar las acciones sin ejecutarlas |
--no-cleanup | false | Dejar los artefactos del módulo en su lugar (ver más abajo) |
--timeout | 30 | Tiempo de espera por módulo en segundos |
--audit-log | (ninguno) | Escribir registros de auditoría OCSF 1.7.0 en un archivo JSONL |
--config | (ninguno) | Cargar los valores predeterminados desde un archivo de configuración YAML |
--run-id | generado | Establecer el identificador de correlación para esta ejecución |
Flujo de datos de escenarios
Los archivos de escenario usan version: 1. Las entradas y las salidas de los módulos están tipadas, y un
paso posterior las referencia con asignaciones explícitas en lugar de interpolación de cadenas:
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 se puede hacer referencia a las salidas declaradas por un módulo. Los escenarios locales se pueden reutilizar con un paso include; las inclusiones son relativas, no pueden atravesar por encima del directorio raíz de escenarios, se comprueba que no haya ciclos y están limitadas a ocho niveles. MacNoise valida el grafo completo antes de la ejecución, asigna a la ejecución un espacio de trabajo privado y limpia los módulos invocados en orden inverso. Use --input content=value para proporcionar entradas y --report report.json para el informe de ejecución versionado.
Dejar artefactos en su sitio
Por defecto, cada módulo se revierte a sí mismo cuando termina. Normalmente eso es lo que se desea, pero implica que una detección solo llega a ver el evento de instalación. Para validar que tu stack detecta la persistencia en sí misma —un LaunchAgent situado en ~/Library/LaunchAgents, una entrada de cron, un perfil de shell modificado—, el artefacto tiene que seguir ahí cuando se ejecute el escaneo:
./macnoise run svc_launch_agent --no-cleanup
Cada módulo que omite la limpieza imprime una línea nombrándose a sí mismo, y el registro de auditoría registra cleanup_result: skipped en lugar de ok, de modo que una ejecución que dejó persistencia atrás nunca se confunde con una que limpió. Use macnoise info <module> para ver qué crea un módulo determinado.
Usted es responsable de eliminar estos elementos por sí mismo. Volver a ejecutar el mismo módulo sin el flag limpiará solo lo que esa ejecución creó, no lo que dejó atrás una ejecución anterior con --no-cleanup.
Registro de auditoría
MacNoise escribe dos flujos separados. Los eventos de telemetría —lo que su EDR/SIEM realmente ve— van a stdout o a --output. Un segundo flujo opcional registra lo que MacNoise hizo por sí mismo: qué módulos se ejecutaron, los resultados de prereq/cleanup y las asignaciones MITRE, en JSONL de OCSF 1.7.0.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Cada evento de telemetría lleva un outcome autoritativo y un subject tipado (esquema 2.0). El outcome indica qué le ocurrió a la acción que MacNoise intentó ejecutar, mientras que el subject identifica el archivo, proceso, endpoint de red, servicio o recurso involucrado:
outcome | Significado | Marcador humano |
|---|---|---|
executed | La acción se ejecutó e hizo lo que el módulo afirma | [+] |
denied | La acción se ejecutó y el entorno la rechazó | [-] |
indeterminate | La acción se ejecutó, pero no se puede concluir nada | [?] |
error | MacNoise mismo falló al llevar a cabo la acción | [!] |