업데이트로 돌아가기
New releaseSep 3, 2026

macnoise v0.5.0

확장 가능한 MacOS 시스템 텔레메트리 생성기.

공유
Description of image

CI Release

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

텔레메트리 카테고리

CategoryDescription
networkTCP 연결, HTTP, 리스너, 리버스 셸, DNS, TLS
process정확한 실행, 시그널 전달, dylib 주입, Gatekeeper 우회, osascript
file범위가 제한된 탐색, 리터럴 읽기/복사, 생성, 수정, 아카이빙, 은닉, 디코이 암호화
tcc정확한 전체 디스크 접근, 연락처, 손쉬운 사용, 화면 기록 요구사항을 사용한 TCC 권한 프로브
credential네이티브 자격 증명 저장소 접근
volume디스크 이미지 생성 및 마운트된 볼륨 수명주기
serviceLaunchd 열거, LaunchAgent/Daemon 지속성, cron, 셸 프로필, 로그인 항목
plistPlist 생성 및 수정
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

전역 플래그

FlagDefaultDescription
--formathuman출력 형식: human 또는 jsonl
--output(none)출력을 파일에 쓰기 (stdout에 추가로)
--verbosefalse정리 오류를 포함한 상세 출력
--dry-runfalse실행하지 않고 동작 미리보기
--no-cleanupfalse모듈 아티팩트를 그대로 남기기 (아래 참조)
--timeout30모듈별 타임아웃 (초)
--audit-log(none)OCSF 1.7.0 감사 레코드를 JSONL 파일에 쓰기
--config(none)YAML 설정 파일에서 기본값 로드
--run-idgenerated이 실행의 상관 관계 식별자 설정

시나리오 데이터 흐름

시나리오 파일은 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는 관련된 파일, 프로세스, 네트워크 엔드포인트, 서비스 또는 리소스를 식별합니다:

outcomeMeaningHuman marker
executed동작이 실행되었고 모듈이 주장하는 대로 수행됨[+]
denied동작이 실행되었으나 환경이 이를 거부함[-]
indeterminate동작이 실행되었으나 아무것도 결론지을 수 없음[?]
errorMacNoise 자체가 동작을 수행하지 못함[!]

거부된 TCC 프로브나 죽은 C2로의 비콘은 이 도구가 생성하기 위해 존재하는 텔레메트리이므로, MacNoise 자체가 실패했음을 의미하는 error와는 구별됩니다. 감사 로그는 unmapped.outcome에 동일한 값을 기록합니다. 민감하다고 선언된 파라미터는 관리형 감사 레코드와 명령줄 아이덴티티에서 [REDACTED]로 대체됩니다.

감사 로그는 추가 모드로 열리므로, 여러 실행의 레코드가 일괄 분석을 위해 하나의 파일에 쌓입니다. 모듈을 추가하면서 새로운 이벤트 유형이 OCSF로 어떻게 분류되는지 알고 싶다면 CONTRIBUTING.md를 참조하세요.

모듈 레퍼런스

생성된 모듈 카탈로그는 이름, 파라미터, 출력, 이벤트 유형, 권한 및 ATT&CK 매핑에 대한 권위 있는 레퍼런스입니다. 카테고리 노트는 플랫폼 동작과 운영 경계를 설명합니다:

시나리오

시나리오는 모듈을 순서가 있는 시퀀스로 연결합니다 — 탐지 대상에 대해 다단계 침입 패턴을 재생하는 단일 YAML 파일입니다.

FileDescription
network_only.yaml구성된 TCP, 리스너, DNS, HTTP 비콘, HTTP 유출 작업
edr_validation.yaml포괄적인 EDR 탐지 커버리지
full_sweep.yaml모든 카테고리
lazarus_group.yamlLazarus Group: dylib 주입, 서비스 탐색, 리버스 셸, LaunchAgent 지속성
amos_atomic_stealer.yamlAMOS / Atomic Stealer: MaaS 인포스틸러, Gatekeeper 우회, 키체인 덤프, ZIP 유출, 백도어 지속성
clickfix.yamlClickFix: 터미널에 붙여넣는 난독화된 원라이너, 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은 닫힐 가능성이 높습니다.

카테고리