
macnoise v0.3.0
拡張可能なMacOSシステムテレメトリジェネレータ。
MacNoise
MacNoiseは、実際のmacOSテレメトリ(ネットワーク接続、ファイル書き込み、プロセス生成、plist変更、TCCプローブなど)を生成します。EDR、SIEM、ファイアウォールスタックが動作しているマシンに向けて実行すると、ベンダーのデータシートが主張するものではなく、実際に何が発火するかを確認できます。
動機と設計の背景については、リリースブログ記事を参照してください。
クイックスタート
# ビルド(Darwin向けクロスコンパイルには build-amd64 / build-arm64 を、両方の場合は 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、ビーコン、リスナー、リバースシェル、データ流出 | net_connect, net_listen, net_beacon, net_revshell, net_dns, 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権限プローブ(FDA、連絡先、キーチェーン、アクセシビリティ、画面収録) | 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、シェルプロファイル、ログイン項目 | svc_launch_agent, svc_launch_daemon, svc_cron, svc_shell_profile, svc_login_item |
plist | Plistの作成と変更 | plist_create, plist_modify |
xpc | XPCサービス列挙 | xpc_enumerate |
コマンド
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エントリ、変更されたシェルプロファイル)をスタックが検出することを検証するには、スキャン実行時にアーティファクトがまだ存在している必要があります:
./macnoise run svc_launch_agent --no-cleanup
クリーンアップをスキップする各モジュールは、自身の名前を出力し、監査ログにはokではなくcleanup_result: skippedが記録されるため、永続化を残した実行が後片付けをした実行と誤認されることはありません。特定のモジュールが何を作成するかは、macnoise info <module>で確認できます。
これらは自分で削除する責任があります。 同じモジュールをフラグなしで再実行すると、その実行で作成されたものだけがクリーンアップされ、以前の--no-cleanup実行で残されたものはクリーンアップされません。
監査ログ
MacNoiseは2つの別々のストリームを書き込みます。テレメトリイベント(EDR/SIEMが実際に確認するもの)はstdoutまたは--outputに出力されます。2つ目のオプションのストリームは、MacNoise自体が何をしたか(実行されたモジュール、前提条件/クリーンアップの結果、MITREマッピング)をOCSF 1.7.0 JSONLで記録します。
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
すべてのテレメトリイベントは、success(スキーマ1.1)とともにoutcomeを保持します。successはMacNoiseが機能したかどうかを示し、outcomeは試行したアクションに何が起こったかを示します:
outcome | 意味 | 人間向けマーカー |
|---|---|---|
executed | アクションが実行され、モジュールが主張することを行った | [+] |
denied | アクションが実行されたが、環境が拒否した | [-] |
indeterminate | アクションが実行されたが、結論を導き出せない | [?] |
error | MacNoise自体がアクションを実行できなかった | [!] |
拒否されたTCCプローブや死んだC2へのビーコンは、このツールが生成するために存在するテレメトリであるため、これらはsuccess: trueのままで、outcomeで区別されます。success: falseを設定するのはerrorのみです。監査ログでは、OCSFのstatusが拒否されたアクションと壊れたツールを同一に記録するため、同じ値がunmapped.outcomeに表示されます。
監査ログは追記モードで開かれるため、複数回の実行のレコードが1つのファイルに蓄積され、バッチ分析に使用できます。モジュールを追加していて、新しいイベントタイプが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 |
シナリオ
シナリオはモジュールを順序付きシーケンスに連結します。単一のYAMLファイルで、多段階の侵入パターンを検出に対して再生します。
| ファイル | 説明 |
|---|---|
network_only.yaml | すべてのネットワークモジュール |
edr_validation.yaml | 包括的なEDR検出カバレッジ |
full_sweep.yaml | すべてのカテゴリ |
lazarus_group.yaml | Lazarus Group: dylibインジェクション、サービス探索、リバースシェル、plist永続化 |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: MaaSインフォスティーラー、Gatekeeperバイパス、キーチェーンダンプ、ZIPデータ流出、バックドア永続化 |
2つの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はクローズされる可能性が高いです。