
macnoise v0.5.0
확장 가능한 MacOS 시스템 텔레메트리 생성기.
MacNoise
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
텔레메트리 카테고리
| Category | Description |
|---|---|
network | TCP 연결, HTTP, 리스너, 리버스 셸, DNS, TLS |
process | 정확한 실행, 시그널 전달, dylib 주입, Gatekeeper 우회, osascript |
file | 범위가 제한된 탐색, 리터럴 읽기/복사, 생성, 수정, 아카이빙, 은닉, 디코이 암호화 |
tcc | 정확한 전체 디스크 접근, 연락처, 손쉬운 사용, 화면 기록 요구사항을 사용한 TCC 권한 프로브 |
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
전역 플래그
| Flag | Default | Description |
|---|---|---|
--format | human | 출력 형식: human 또는 jsonl |
--output | (none) | 출력을 파일에 쓰기 (stdout에 추가로) |
--verbose | false | 정리 오류를 포함한 상세 출력 |
--dry-run | false | 실행하지 않고 동작 미리보기 |
--no-cleanup | false | 모듈 아티팩트를 그대로 남기기 (아래 참조) |
--timeout | 30 | 모듈별 타임아웃 (초) |
--audit-log | (none) | OCSF 1.7.0 감사 레코드를 JSONL 파일에 쓰기 |
--config | (none) | YAML 설정 파일에서 기본값 로드 |
--run-id | generated | 이 실행의 상관 관계 식별자 설정 |
시나리오 데이터 흐름
시나리오 파일은 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 단계로
재사용할 수 있으며, include는 상대 경로이고 루트 시나리오 디렉터리 위로
이동할 수 없으며, 순환 검사를 거치고, 최대 8단계로 제한됩니다.
MacNoise는 실행 전에 전체 그래프를 검증하고, 실행에 하나의 비공개
워크스페이스를 부여하며, 호출된 모듈을 역순으로 정리합니다. 입력을
제공하려면 --input content=value를, 버전이 지정된 실행 보고서를
원하면 --report report.json을 사용하세요.
아티팩트를 그대로 남기기
기본적으로 모든 모듈은 완료 시 스스로를 되돌립니다. 이는 일반적으로 원하는
동작이지만, 탐지가 설치 이벤트만 보게 된다는 의미이기도 합니다. 지속성
자체를 스택이 탐지하는지 검증하려면 — ~/Library/LaunchAgents에 남아 있는
LaunchAgent, cron 항목, 수정된 셸 프로필 — 스캔이 실행될 때 아티팩트가
여전히 존재해야 합니다:
./macnoise run svc_launch_agent --no-cleanup
정리를 건너뛰는 각 모듈은 자신의 이름을 출력하는 줄을 인쇄하고, 감사 로그는
ok 대신 cleanup_result: skipped를 기록하므로, 지속성을 남긴 실행이
정리된 실행으로 오인되지 않습니다. 특정 모듈이 무엇을 생성하는지 보려면
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 | Meaning | Human marker |
|---|---|---|
executed | 동작이 실행되었고 모듈이 주장하는 대로 수행됨 | [+] |
denied | 동작이 실행되었으나 환경이 이를 거부함 | [-] |
indeterminate | 동작이 실행되었으나 아무것도 결론지을 수 없음 | [?] |
error | MacNoise 자체가 동작을 수행하지 못함 | [!] |
거부된 TCC 프로브나 죽은 C2로의 비콘은 이 도구가 생성하기 위해 존재하는
텔레메트리이므로, MacNoise 자체가 실패했음을 의미하는 error와는 구별됩니다.
감사 로그는 unmapped.outcome에 동일한 값을 기록합니다. 민감하다고 선언된
파라미터는 관리형 감사 레코드와 명령줄 아이덴티티에서 [REDACTED]로
대체됩니다.
감사 로그는 추가 모드로 열리므로, 여러 실행의 레코드가 일괄 분석을 위해 하나의 파일에 쌓입니다. 모듈을 추가하면서 새로운 이벤트 유형이 OCSF로 어떻게 분류되는지 알고 싶다면 CONTRIBUTING.md를 참조하세요.
모듈 레퍼런스
생성된 모듈 카탈로그는 이름, 파라미터, 출력, 이벤트 유형, 권한 및 ATT&CK 매핑에 대한 권위 있는 레퍼런스입니다. 카테고리 노트는 플랫폼 동작과 운영 경계를 설명합니다:
| Category | README |
|---|---|
network | modules/network/README.md |
process | modules/process/README.md |
file | modules/file/README.md |
tcc | modules/tcc/README.md |
credential | modules/credential/README.md |
volume | modules/volume/README.md |
service | modules/service/README.md |
plist | modules/plist/README.md |
evasion | modules/evasion/README.md |
시나리오
시나리오는 모듈을 순서가 있는 시퀀스로 연결합니다 — 탐지 대상에 대해 다단계 침입 패턴을 재생하는 단일 YAML 파일입니다.
| File | Description |
|---|---|
network_only.yaml | 구성된 TCP, 리스너, DNS, HTTP 비콘, HTTP 유출 작업 |
edr_validation.yaml | 포괄적인 EDR 탐지 커버리지 |
full_sweep.yaml | 모든 카테고리 |
lazarus_group.yaml | Lazarus Group: dylib 주입, 서비스 탐색, 리버스 셸, LaunchAgent 지속성 |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: MaaS 인포스틸러, Gatekeeper 우회, 키체인 덤프, ZIP 유출, 백도어 지속성 |
clickfix.yaml | ClickFix: 터미널에 붙여넣는 난독화된 원라이너, base64 디코드, 2단계 페치, LaunchAgent 지속성 |
ransomware.yaml | 랜섬웨어 영향: 평문 디코이 배치, 암호화, 랜섬 노트 드롭 |
discovery.yaml | 구성된 argv 기반 시스템, 계정, 네트워크, 보안 소프트웨어 탐색 레시피 |
process_chain.yaml | 명시적 인자 벡터로 구성된 3개 프로세스 셸 체인 |
file_flow.yaml | 연결된 생성, 수정, 범위 제한 탐색, 읽기, 복사, 아카이빙 흐름 |
mounted_execution.yaml | 관찰된 디스크 이미지 마운트 지점에서 페이로드 생성 및 실행 |
두 APT 시나리오는 실제로 문서화된 침입 시퀀스를 기법별로 따릅니다 — 각 YAML 파일은 기반이 된 실제 위협 인텔을 인용하고 모든 단계에 실행하는 MITRE 기법을 주석으로 달았으므로, 여기서 재설명하기보다 전체 분석은 거기서 시작하세요.
먼저 드라이런:
./macnoise scenario configs/scenarios/<scenario>.yaml --dry-run
SIEM/EDR과 교차 참조: 각 단계 주석은 트리거해야 할 기법을 명시합니다. 실제 실행 후 일치하는 경보가 없다면 커버리지의 공백입니다.
직접 작성하기:
version: 1
name: My Custom Scenario
on_error: stop
steps:
- module: net_connect
params:
target: "192.168.1.1"
port: 443
- module: file_create
params:
base_dir: "/tmp/test"
파라미터는 미리보기 또는 실행 전에 각 모듈이 선언한 문자열, 정수, 불리언,
경로 또는 리스트 타입과 대조하여 검사됩니다. 알 수 없는 이름과 유효하지 않은
값은 거부됩니다. on_error의 기본값은 stop입니다. 커버리지 스윕이 실패 후
이후 모듈 호출을 시도해야 하는 경우에만 continue로 설정하세요.
타입이 지정된 입력, 출력 및 연결된 데이터 흐름은 시나리오 템플릿에서 시작하세요.
버전 1 호환성
버전 1.0은 지원되는 CLI 명령과 플래그, 모듈 이름과 계약, 시나리오 스키마 1, 텔레메트리 스키마 2.0, 시나리오 보고서 스키마 1.0을 정의합니다. 이러한 인터페이스에 대한 향후 비호환 변경은 새로운 메이저 릴리스가 필요합니다.
기존 사용자는 v0.6.0에서 v1.0.0으로 마이그레이션을 읽어야 합니다. 제거된 모든 모듈을 매핑하고 시나리오, JSONL 및 Go API 변경 사항을 설명합니다.
기여
프리미티브, 시나리오 및 코어 변경 경로는 CONTRIBUTING.md를 참조하세요.
릴리스는 자동화되어 있습니다 — release-please가
Conventional Commit PR 제목에서 바로
새 버전을 생성하므로, feat: add net_tls module 또는 fix: correct beacon jitter가
PR 제목이자 변경 로그 항목이 됩니다.
면책 조항
MacNoise는 본인이 소유하거나 테스트에 대한 명시적 서면 허가를 받은 시스템에서 승인된 보안 테스트, EDR 검증 및 탐지 엔지니어링을 위한 것입니다. 저자는 오용에 대해 어떠한 책임도 지지 않습니다.
AI 코드 정책
AI 코드 기여는 괜찮지만, 코드 리뷰는 현재 사람이 주도하는 프로세스이므로 리뷰할 수 있는 코드의 양에 한계가 있다는 점을 명심하세요. PR은 특정 수정 또는 새로운 텔레메트리 모듈로 제한해 주세요. 광범위한 변경이 포함된 PR은 닫힐 가능성이 높습니다.