
macnoise v0.5.0
可扩展的 macOS 系统遥测生成器。
MacNoise
MacNoise 生成真实的 macOS 遥测数据:网络连接、文件写入、进程派生、plist 变更、TCC 探测等。将其指向运行着 EDR、SIEM 或防火墙堆栈的机器,看看实际触发的是什么——而不是厂商数据表声称会触发的内容。
有关动机和设计的背景信息,请参阅发布博客文章。
快速开始
# 构建(添加 build-amd64 / build-arm64 可交叉编译到 Darwin,或使用 release 同时构建两者)
make build
# 列出可用模块
./macnoise list
# 运行单个模块
./macnoise run net_connect --param target=127.0.0.1 --param port=8080
# 预览而不执行
./macnoise run svc_launch_agent --dry-run
# 运行所有网络模块
./macnoise run --category network
# 运行一个场景
./macnoise scenario configs/scenarios/edr_validation.yaml
# 输出结构化 JSONL
./macnoise run --category file --format jsonl --output /tmp/events.jsonl
遥测类别
| 类别 | 描述 | 模块 |
|---|---|---|
network | 出站连接、DNS、信标、监听器、反向 Shell、TLS、数据外泄 | net_connect, net_listen, net_beacon, net_revshell, net_dns, net_dns_exfil, net_tls, net_exfil |
process | 进程派生、信号传递、dylib 注入、发现、Gatekeeper 绕过、osascript | proc_spawn, proc_signal, proc_inject, proc_discovery, proc_gatekeeper, proc_osascript |
file | 文件创建、修改、凭据文件和钥匙串读取、归档、隐藏 | file_create, file_modify, file_browser_creds, file_cred_files, file_keychain_copy, file_archive, file_hide |
tcc | TCC 权限探测(完全磁盘访问、通讯录、钥匙串、辅助功能、屏幕录制) | tcc_fda, tcc_contacts, tcc_keychain, tcc_accessibility, tcc_screen_recording |
endpoint_security | ES 框架事件触发,包括 .dmg 挂载和载荷执行 | es_file, es_process, es_mount |
service | LaunchAgent/Daemon 持久化、cron、Shell 配置文件、登录项 | svc_launch_agent, svc_launch_daemon, svc_cron, svc_shell_profile, svc_login_item |
plist | Plist 创建和修改 | plist_create, plist_modify |
xpc | XPC 服务枚举 | xpc_enumerate |
evasion | 防御规避:日志清除、时间戳篡改、历史记录删除 | evade_log_clear |
命令
macnoise run <module> [--param key=val ...] 运行特定模块
macnoise run --category <cat> 运行某个类别中的所有模块
macnoise run --all 运行所有模块
macnoise list [--category <cat>] 列出模块
macnoise info <module> 显示模块详情、参数、MITRE
macnoise scenario <file.yaml> 运行 YAML 场景
macnoise categories 列出类别及数量
macnoise 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 配置文件加载默认值 |
保留产物
默认情况下,每个模块在完成时会自行还原。这通常是你想要的,但这也意味着检测只能看到安装事件。要验证你的安全堆栈能否检测到持久化本身——位于 ~/Library/LaunchAgents 中的 LaunchAgent、cron 条目、被修改的 Shell 配置文件——产物必须在扫描运行时仍然存在:
./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 以及 success(schema 1.1)。success 表示 MacNoise 是否正常工作;outcome 表示其尝试的操作发生了什么:
outcome | 含义 | 人工标记 |
|---|---|---|
executed | 操作已执行并完成了模块声称要做的事 | [+] |
denied | 操作已执行但环境拒绝了它 | [-] |
indeterminate | 操作已执行,但无法得出任何结论 | [?] |
error | MacNoise 自身未能执行该操作 | [!] |
被拒绝的 TCC 探测或指向失效 C2 的信标正是此工具存在的意义所在,因此这些事件保持 success: true,并通过 outcome 加以区分。只有 error 会将 success 设为 false。在审计日志中,相同的值出现在 unmapped.outcome 处,因为 OCSF 的 status 对被拒绝的操作和损坏的工具记录方式相同。
审计日志以追加模式打开,因此多次运行产生的记录会累积在同一个文件中,便于批量分析。如果你想添加模块并了解新事件类型如何被分类到 OCSF,请参阅 CONTRIBUTING.md。
模块参考
模块文档与每个类别并列存放:
| 类别 | README |
|---|---|
network | modules/network/README.md |
process | modules/process/README.md |
file | modules/file/README.md |
tcc | modules/tcc/README.md |
endpoint_security | modules/endpoint_security/README.md |
service | modules/service/README.md |
plist | modules/plist/README.md |
xpc | modules/xpc/README.md |
evasion | modules/evasion/README.md |
场景
场景将模块串联成有序序列——一个 YAML 文件即可针对你的检测重放多阶段入侵模式。
| 文件 | 描述 |
|---|---|
network_only.yaml | 所有网络模块 |
edr_validation.yaml | 全面的 EDR 检测覆盖 |
full_sweep.yaml | 所有类别 |
lazarus_group.yaml | Lazarus 组织:dylib 注入、服务发现、反向 Shell、plist 持久化 |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer:MaaS 信息窃取器、Gatekeeper 绕过、钥匙串转储、ZIP 外泄、后门持久化 |
clickfix.yaml | ClickFix:粘贴到终端中的混淆单行命令、base64 解码、第二阶段获取、LaunchAgent 持久化 |
两个 APT 场景逐技术地遵循真实记录的入侵序列——每个 YAML 文件都引用了其构建所依据的实际威胁情报,并标注了每一步所演练的 MITRE 技术,因此请从那里获取完整分解,而不是在此复述。
先进行干跑:
./macnoise scenario configs/scenarios/<scenario>.yaml --dry-run
与你的 SIEM/EDR 交叉对照: 每个步骤注释都标明了应触发的技术。真实运行后没有匹配的告警,说明你的覆盖存在缺口。
编写你自己的场景:
name: My Custom Scenario
steps:
- module: net_connect
params:
target: "192.168.1.1"
port: "443"
- category: file
params:
base_dir: "/tmp/test"
贡献
有关添加新模块、代码风格以及完整的 PR 流程,请参阅 CONTRIBUTING.md。
发布是自动化的——release-please 直接从你的 Conventional Commit PR 标题生成新版本,因此 feat: add net_tls module 或 fix: correct beacon jitter 既是你的 PR 标题,也是你的变更日志条目。
免责声明
MacNoise 仅用于授权的安全测试、EDR 验证以及针对你拥有或已获得明确书面许可进行测试的系统的检测工程。作者对滥用不承担任何责任。
AI 代码政策
欢迎 AI 代码贡献,但请记住,代码审查目前将是一个以人工为主导的过程,这意味着我们能审查的代码量有限。请将 PR 限制为特定的修复或新的遥测模块。包含大量变更的 PR 很可能会被关闭。