
Расширяемый генератор системной телеметрии MacOS.
MacNoise генерирует реальную телеметрию macOS: сетевые соединения, запись файлов, порождение процессов, мутации plist, проверки TCC и многое другое. Направьте его на машину с вашим стеком EDR, SIEM или межсетевого экрана и посмотрите, что действительно срабатывает, — а не то, что обещает сработать в спецификации вендора.
О мотивации и дизайне читайте в блоге о релизе.
# 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
| Категория | Описание |
|---|---|
network | TCP-соединения, HTTP, слушатели, reverse shell, DNS и TLS |
process | Точное выполнение, доставка сигналов, инъекция dylib, обход Gatekeeper и osascript |
file | Ограниченное обнаружение, буквальное чтение/копирование, создание, изменение, архивирование, сокрытие и шифрование приманок |
tcc | Проверки разрешений TCC с точными требованиями Full Disk Access, Contacts, Accessibility или Screen Recording |
credential | Доступ к нативному хранилищу учётных данных |
volume | Создание образов дисков и жизненный цикл смонтированных томов |
service | Перечисление Launchd, персистентность LaunchAgent/Daemon, cron, профиль оболочки и элементы входа |
plist | Создание и изменение plist |
evasion | Очистка журналов, изменение временных меток, удаление истории и маскировка |
Смотрите сгенерированный каталог модулей для каждого модуля, параметра, вывода, типа события, привилегии и сопоставления с 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
| Флаг | По умолчанию | Описание |
|---|---|---|
--format | human | Формат вывода: human или jsonl |
--output | (нет) | Записать вывод в файл (в дополнение к stdout) |
--verbose | false | Подробный вывод, включая ошибки очистки |
--dry-run | false | Предпросмотр действий без выполнения |
--no-cleanup | false | Оставить артефакты модуля на месте (см. ниже) |
--timeout | 30 | Тайм-аут на модуль в секундах |
--audit-log | (нет) | Записать записи аудита OCSF 1.7.0 в файл JSONL |
--config | (нет) | Загрузить значения по умолчанию из файла конфигурации YAML |
--run-id | генерируется | Задать идентификатор корреляции для этого запуска |
Файлы сценариев используют version: 1. Входы и выходы модулей типизированы, и
последующий шаг ссылается на них через явные сопоставления, а не через строковую
интерполяцию:
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
Ссылаться можно только на выходы, объявленные модулем. Локальные сценарии можно
переиспользовать с помощью шага include; включения относительны, не могут
выходить за пределы корневого каталога сценариев, проверяются на циклы и
ограничены восемью уровнями.
MacNoise проверяет полный граф перед выполнением, предоставляет запуску одно
приватное рабочее пространство и очищает вызванные модули в обратном порядке. Используйте
--input content=value для передачи входов и --report report.json для
версионированного отчёта о выполнении.
По умолчанию каждый модуль отменяет свои действия по завершении. Обычно это то, что нужно, но это означает, что обнаружение видит только событие установки. Чтобы проверить, что ваш стек обнаруживает саму персистентность — LaunchAgent, находящийся в ~/Library/LaunchAgents, запись cron, изменённый профиль оболочки, — артефакт должен всё ещё присутствовать, когда запускается сканирование:
./macnoise run svc_launch_agent --no-cleanup
Каждый модуль, пропускающий очистку, выводит строку со своим именем, а журнал аудита записывает cleanup_result: skipped вместо ok, так что запуск, оставивший персистентность, никогда не будет принят за тот, который всё убрал. Используйте macnoise info <module>, чтобы увидеть, что создаёт данный модуль.
Вы несёте ответственность за их удаление самостоятельно. Повторный запуск того же модуля без флага очистит только то, что создал этот запуск, а не то, что оставил предыдущий запуск с --no-cleanup.
MacNoise записывает два отдельных потока. События телеметрии — то, что фактически видит ваш EDR/SIEM, — идут в stdout или --output. Второй, опциональный поток записывает то, что сделал сам MacNoise: какие модули запускались, результаты проверки предварительных условий/очистки и сопоставления MITRE, в формате OCSF 1.7.0 JSONL.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Каждое событие телеметрии несёт один авторитетный outcome и один типизированный subject (схема 2.0). Outcome говорит, что произошло с действием, которое попытался выполнить MacNoise, а subject идентифицирует файл, процесс, сетевую конечную точку, службу или ресурс, вовлечённые в действие:
outcome | Значение | Человеческий маркер |
|---|---|---|
executed | Действие выполнилось и сделало то, что заявляет модуль | [+] |
denied | Действие выполнилось, но среда его отклонила | [-] |
indeterminate | Действие выполнилось, но ничего нельзя заключить | [?] |
error | Сам MacNoise не смог выполнить действие | [!] |
Отклонённая проверка TCC или маяк к мёртвому C2 — это телеметрия, для генерации которой существует этот инструмент, поэтому она отличается от error, который означает, что сам MacNoise дал сбой. Журнал аудита записывает то же значение в unmapped.outcome. Параметры, объявленные чувствительными, заменяются на [REDACTED] в управляемых записях аудита и идентичности командной строки.