
macOS 지속성 메커니즘 스캐너 (코드 서명 검증 및 타임라인 추적 포함)
Mac에서 실행되는 모든 것을 확인하세요. 왜 실행되는지 이해하세요. 무엇을 유지할지 결정하세요.


MacPersistenceChecker는 Mac에서 자동으로 실행되는 모든 것을 보여주고, 왜 중요한지 설명하며, 무엇을 유지하거나 제거할지 결정하는 데 도움을 줍니다.
→ 악성코드 찾기 → 숨겨진 지속성 감지 → 시스템을 몇 분 안에 이해하기
MacPersistenceChecker v2.0.0 (DMG) 다운로드
→ 30초 안에 Mac 스캔 → 설치 마법사 없이 열어서 바로 실행 → 네이티브 macOS, 유니버설 (Apple Silicon 및 Intel), macOS 13+
macOS에서 앱이 손상되었다고 표시되면:
xattr -cr /Applications/MacPersistenceChecker.app
앱이 시스템을 학습하고 수천 개의 항목을 자동으로 분류합니다.
빠른 시작:
실제 비용: 활성 사용 시 <월 $1, 정상 상태에서는 무료.
앱은 Mac의 모든 지속성 항목에 대한 지식 그래프를 구축하고 Claude(Anthropic)를 사용하여 추론합니다. 수천 개의 항목을 신속하게 분류하고, 실제로 중요한 것만 에스컬레이션하며, 시스템을 학습하여 추가 AI 호출 없이도 대부분의 질문에 답변할 수 있습니다.
┌──────────────────────────┐
│ Persistence scan │
│ (e.g. 6800 items) │
└─────────────┬────────────┘
▼
┌────────────────────────────────────────┐
│ Concept Extraction (deterministic) │
│ 6 extractors → vendor / software / │
│ pathCategory / pattern / mechanism / │
│ filename. No AI calls here. │
└─────────────┬──────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Knowledge Graph (SQLite) │
│ • concepts (~280 typically) │
│ • concept_links (subsumes / instance) │
│ • item_concepts (m:n) │
│ • concept_verdicts │
└─────────────┬──────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Concept Resolver │
│ for every item, picks the strongest │
│ verdict via a deterministic ladder: │
│ severity → confidence → specificity │
│ → source → recency. │
└─────────────┬──────────────────────────┘
│
┌───────────┴────────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────────┐ │ Item is already │ │ Item is unresolved │ │ classified. │ │ → goes to a cluster. │ │ Filter hides it │ └──────────┬───────────┘ │ from "Suspicious"│ ▼ └──────────────────┘ ┌──────────────────────┐ │ Cluster Builder │ │ groups items by │ │ identical concept │ │ signature (sorted │ │ ids). 6800 items → │ │ ~280 clusters. │ └──────────┬───────────┘ ▼ ┌──────────────────────────────────────────┐ │ User decides per cluster (one click = │ │ N items decided), OR sends batch to AI: │ │ │ │ • Trust / Watch / Block (manual) │ │ • Send unresolved clusters to AI │ │ → Haiku batch (15 cluster per call) │ │ → AI returns verdicts attached to │ │ concepts (not items) — propagate │ │ to ALL items linked to those │ │ concepts, including future ones. │ └──────────────────────────────────────────┘
### AI 도구
| 도구 | 위치 | 모델 | 호출당 비용 |
|---|---|---|---|
| AI로 분석 (단일 항목) | 항목 상세 → 지식 그래프 | Haiku | ~$0.003 |
| 스마트 분류 배치 | 도구 모음 → 분류 | Haiku 배치 | ~$0.005 (15개 클러스터) |
| 시스템 보고서 | 도구 모음 → 보고서 | Sonnet | ~$0.05-0.10 |
| 위협 헌트 | 도구 모음 → 헌트 | Haiku | ~$0.003 |
| 스냅샷 차이 | 기록 → 비교 → AI로 분석 | Haiku | ~$0.003 |
일일 호출 제한(기본 30)은 설정 → AI에서 구성 가능. 하드 상한이며, 도달 시 AI가 자동으로 비활성화됩니다.
### 신뢰 제어
사용자 정의 규칙은 **항상** AI 추출 규칙보다 우선합니다:
- **이 항목 신뢰** — 단일 항목 규칙, 귀하의 판결이 AI 감시 목록보다 우선
- **이 패턴 신뢰** — TeamID/서명 앵커 기반 패턴 규칙 (서명된 바이너리만 해당)
- **신뢰 제거** — 실수로 추가한 사용자 정의 규칙 삭제
- **감시 / 차단** — 스마트 분류에서 전체 클러스터에 감시 목록/악성 판결 적용
</details>
---
## 지속성 스캔
### 핵심 스캐너
- **Launch Daemons** - 시스템 전체 서비스 (`/Library/LaunchDaemons`, `/System/Library/LaunchDaemons`)
- **Launch Agents** - 사용자 수준 에이전트 (`~/Library/LaunchAgents`, `/Library/LaunchAgents`)
- **로그인 항목** - 로그인 시 시작되는 앱
- **커널 확장** - 레거시 kext
- **시스템 확장** - 최신 시스템 확장 (DriverKit, NetworkExtension, EndpointSecurity)
- **권한 있는 도우미 도구** - 상승된 권한을 가진 XPC 서비스
- **Cron 작업** - 예약된 작업
- **구성 프로파일** - MDM 및 구성 프로파일
- **애플리케이션 지원** - 백그라운드 앱 및 도우미
### 확장 스캐너 (선택 사항)
- **주기적 스크립트** - `/etc/periodic/`에 있는 일일, 주간, 월간 스크립트
- **셸 시작 파일** - 의심스러운 패턴 탐지가 적용된 `.zshrc`, `.bashrc`, `/etc/profile`
- **로그인/로그아웃 훅** - `com.apple.loginwindow`를 통한 레거시 로그인 훅
- **인증 플러그인** - `/Library/Security/SecurityAgentPlugins`의 보안 에이전트 플러그인
- **Spotlight 임포터** - 사용자 정의 메타데이터 임포터
- **Quick Look 플러그인** - 악용될 수 있는 미리보기 생성기
- **디렉터리 서비스 플러그인** - 인증 플러그인
- **Finder Sync 확장** - pluginkit를 통한 Finder 확장
- **BTM 데이터베이스** - 백그라운드 작업 관리 항목 (macOS 13+)
- **Dylib 하이재킹** - `DYLD_INSERT_LIBRARIES` 및 의심스러운 dylib 주입 탐지
- **TCC/접근성** - TCC 데이터베이스에서 접근성 권한이 있는 앱
---
## 위험 평가
모든 지속성 항목은 여러 요인에 기반한 **위험 점수(0-100)** 를 받습니다:
- 유효하지 않거나 누락된 코드 서명
- 누락된 하드닝된 런타임 보호
- 임시 서명된 바이너리
- 의심스러운 파일 위치
- 지속적인 자동 시작 구성 (RunAtLoad, KeepAlive)
- 알려진 악성 코드 패턴
**심각도 수준:** 낮음, 중간, 높음, 치명적 - 신속한 위협 식별을 위해 항목이 위험도별로 정렬됩니다.
### 실행 빈도 이상 탐지
- **마이크로 재시작** - StartInterval < 60초 (가능한 워치독 남용)
- **공격적 워치독** - KeepAlive + 낮은 StartInterval 조합
- **조절 제한 없음** - ThrottleInterval 없는 KeepAlive (충돌-재시작 루프 위험)
### 서명되었지만 위험한 탐지
- **위험한 권한** - 위험한 권한 탐지 (`com.apple.security.cs.disable-library-validation` 등)
- **Apple 사칭** - Apple로 보이려는 비 Apple 소프트웨어
- **숨겨진 위치** - 의심스러운 디렉터리에 있는 서명된 앱
- **공증 격차** - 공증이 없는 최근 앱
- **개발자 인증서 분석** - 알려진 공급업체에 대한 TeamID 검증
### LOLBins 탐지 (합법 이진 파일 악용)
지속성 컨텍스트에서 합법적인 macOS 바이너리의 의심스러운 사용을 탐지합니다. **조합이 중요합니다:**
- **osascript + 지속성** = AppleScript와 자동 시작 (GUI 자동화 남용)
- **curl/wget + RunAtLoad** = 다운로드 및 실행 패턴
- **python + 권한 있는 도우미** = 상승된 스크립트 실행
- **security + KeepAlive** = 자격 증명 수집 위험
- **launchctl + 자동 시작** = 메타 지속성 설치자
- **netcat + 지속성** = 리버스 셸 / C2 채널
40개 이상의 LOLBins가 MITRE ATT&CK 매핑 및 컨텍스트 인식 심각도 점수로 추적됩니다.
### 바이너리 평판 및 행동 분석
의심스러운 행동 패턴을 감지하는 고급 휴리스틱:
- **숨겨진 지속성 가드** - 명백한 워치독 목적이 없는 KeepAlive 에이전트
- **공격적 지속성** - 비서비스 항목에 대한 RunAtLoad + KeepAlive
- **은밀한 자동 시작** - 알 수 없는 공급업체의 백그라운드 프로세스
- **고아 지속성** - 존재하지 않는 실행 파일을 가리키는 Plist
- **의심스러운 위치** - `/tmp/`, `/Users/Shared/` 또는 숨겨진 디렉터리의 실행 파일
- **권한 상승 위험** - 권한 있는 작업을 시도하는 사용자 에이전트
- **네트워크 지원 지속성** - 네트워크 기능이 있는 지속성
- **스크립트 기반 지속성** - 인터프리터를 통한 인라인 스크립트
- **시스템 프로세스 사칭** - Apple 유사 이름을 사용하는 비 Apple 항목
- **빈번한 재시작 패턴** - StartInterval < 60초
### Plist와 바이너리 의도 불일치
Plist가 선언하는 내용과 바이너리가 실제로 수행하는 작업이 일치하지 않을 때를 감지합니다 - **정확히 현대 드로퍼가 하는 일:**
- **무해한 Plist, 무거운 바이너리** - 간단한 구성이지만 바이너리에 위험한 권한이 있음
- **수동적인 도우미와 네트워크** - 네트워크 클라이언트/서버 접근이 있는 백그라운드 도우미
- **수동적인 도우미와 Dylib 로딩** - 서명되지 않은 코드를 로드할 수 있는 도우미
- **최소 구성, 최대 기능** - 최소한의 Plist지만 광범위한 권한
- **키체인 접근이 있는 간단한 작업** - 자격 증명 접근이 있는 간단한 작업
### 바이너리 연령과 지속성 연령
설치 후 악성 업데이트를 나타내는 의심스러운 타임스탬프 패턴을 감지합니다:
- **오래된 Plist, 새로운 바이너리** - 전형적인 "설치 후 악성 업데이트" 패턴
- **조용한 바이너리 교체** - Plist 변경 없이 바이너리 수정
- **타임스탬프 조작** - 생성 날짜 이전의 수정 날짜 (불가능)
- **의심스러운 수정 시간** - 오전 2-5시에 수정된 바이너리
- **설치 후 수정된 바이너리** - 초기 설치 후 변경된 비업데이터 바이너리
### 신뢰 수준
- 🟢 **Apple** - Apple이 서명
- 🔵 **알려진 공급업체** - 검증된 타사 소프트웨어
- 🟡 **서명됨** - 유효한 서명이지만 공증되지 않음
- ⚪ **알 수 없음** - 확인할 실행 파일 없음
- 🟠 **의심스러움** - 만료된 인증서 또는 의심스러운 경로
- 🔴 **서명되지 않음** - 유효한 서명 없음
---
## 타임라인 및 포렌식
각 지속성 항목에 대한 포괄적인 포렌식 타임라인:
**발견**
- 최초 발견 - 항목이 처음 발견된 시간
**구성 파일 (Plist)**
- 생성됨 - 파일 생성 타임스탬프
- 수정됨 - 마지막 수정 타임스탬프
**실행 파일 (바이너리)**
- 생성됨 - 바이너리 생성 타임스탬프
- 수정됨 - 마지막 수정 타임스탬프
- 마지막 실행 - 마지막 접근/실행 시간
### 타임스탬프 이상 탐지
- **타임스탬프 조작** - 생성 날짜가 수정 날짜 이후 (안티 포렌식 기술)
- **파일 교체** - 초기 발견 후 생성된 파일
- **바이너리 교체** - 오래된 Plist와 최근에 수정된 바이너리 (가능한 트로이 목마)
- **최근 실행** - 현재 로드되지 않았지만 최근에 접근된 바이너리
---
## MITRE ATT&CK 통합
모든 지속성 메커니즘이 MITRE ATT&CK 프레임워크에 매핑됨:
- **전술**: 지속성, 권한 상승, 방어 회피, 실행
- **기술**: T1543.001, T1543.004, T1547.001, T1547.015 등
- MITRE ATT&CK 문서로 직접 연결
---
## 앱 침투성 보고서
설치된 앱의 포괄적인 분석을 통해 "침투성" 수준 평가:
### 이중 점수 시스템
**지속성 점수 (0-100)** - 지속성 메커니즘 평가:
- 트리거 유형 (RunAtLoad, KeepAlive)
- 권한 수준 (LaunchDaemons, 커널 확장, 권한 있는 도우미)
- 복원력 (자동 재시작, 업데이터)
- 중복성 (동일 공급업체의 여러 항목)
- 신뢰 수준 (서명되지 않음/의심스러움 패널티)
**설치 점수 (0-100)** - "정크" 설치 공간 평가:
- Library 폴더 전체에 분산된 파일
- 총 디스크 사용량
- 고아 파일 (일치하는 앱 없는 지속성)
- 캐시 부풀림
- 시스템 전체 설치
### 등급 시스템
앱은 결합 점수를 기준으로 **A부터 F까지** 등급이 매겨지며, 모든 점수 요인에 대한 상세 분석이 제공됩니다.
---
## 시각화
### 통계 대시보드
- **위험 분포 히스토그램** - 위험 대역별 항목 (낮음, 중간, 높음, 치명적)
- **신뢰 수준 도넛 차트** - 신뢰 수준별 분포
- **카테고리 분류 차트** - 지속성 카테고리별 항목
- **타임라인 시각화** - 항목 생애주기 이벤트 (생성, 수정, 실행, 발견)
### 대화형 그래프
- **전체 시스템 그래프** - 모든 지속성 항목 및 관계 개요
- **초점 항목 그래프** - 개별 항목 분석을 위한 방사형 그래프
- **분석 모드**: 기본 (신뢰/카테고리) 또는 전체 (dylib 종속성, 네트워크 연결 포함)
- **대화형 캔버스** - 확대, 축소, 관계 탐색
- **신뢰 수준별 색상 코드** - 빠른 시각적 위협 평가
### 보안 프로필 레이더
신뢰, 서명, 안전, 안정성, 투명성, 연령 차원을 한눈에 보여주는 포괄적인 레이더 차트.
---
## 실시간 모니터링
두 가지 분석 모드를 사용한 지속성 변경 사항의 지속적인 모니터링.
### 모니터링 모드
**표준 모드**
- FSEvents 기반 실시간 파일 시스템 모니터링
- 구성 가능한 디바운스를 통한 지능적 노이즈 억제
- 중요하지 않은 변경 사항을 필터링하는 관련성 점수
- 높은 관련성 변경 사항에 대한 즉각적인 알림
**AI 모드** (Claude API 키 필요)
- Claude AI가 감지된 각 변경 사항 분석
- 전체 컨텍스트를 AI에 전송: 서명 정보, LOLBins, 행동 이상, 위험 점수
- AI가 실제 위협 수준에 따라 변경 사항이 알림을 받을 가치가 있는지 결정
- 구성 가능한 확인 간격 (30초 ~ 1시간)
- 심각도 임계값 필터링 (정보, 낮음, 중간, 높음, 치명적)
### 메뉴 바 통합
- 실시간 모니터링 상태 표시기
- "AI" 또는 "Std" 모드 배지
- 빠른 제어 (모니터링 시작/중지, 스캔 실행)
- 설정 접근
- 확인되지 않은 변경 사항에 대한 배지 수
- 마지막 감지된 변경 사항 미리보기
### 알림 중복 제거
- 동일 항목은 쿨다운 기간 내에 반복 알림을 트리거하지 않음
- 구성 가능한 쿨다운 (1-24시간, 기본 2시간)
- 자주 변경되는 항목으로 인한 알림 피로 방지
### 시작 알림
모니터링이 시작되면 다음을 확인하는 알림을 받습니다:
- 활성 모드 (AI 모드 또는 표준 모드)
- 확인 간격 (AI) 또는 "실시간" (표준)
- 알림 임계값 설정
### 변경 감지
- **추가됨** - 새로운 지속성 항목
- **제거됨** - 삭제된 항목
- **수정됨** - 구성 변경 (활성화/비활성화, 경로 변경 등)
- **활성화/비활성화됨** - 상태 변경
### AI 분석 세부 정보
AI 모드가 활성화되면 각 변경 사항이 완전한 항목 데이터를 Claude에 전송합니다:
- 기본 정보 (이름, 카테고리, 경로, plist 내용)
- 서명 세부 정보 (서명됨, Apple, 공증됨, 팀 ID, 인증서 상태)
- 위험 평가 (점수, 상세 분석)
- LOLBins 탐지와 MITRE 매핑
- 행동 이상
- 의도 불일치 (plist와 바이너리 간)
- 연령 이상 (타임스탬프 분석)
- 서명되었지만 위험한 플래그
Claude는 다음으로 응답합니다:
- `shouldNotify` - 사용자에게 알릴지 여부
- `severity` - 위협 수준 평가
- `title` - 알림 제목
- `explanation` - 이것이 의심스럽거나 그렇지 않은 이유
- `recommendation` - 제안된 조치
- `mitreTechniques` - 관련 ATT&CK 기술
### AI 사용자 정의
**설정 → AI**를 통해 AI가 변경 사항을 분석하는 방식 제어:
**구조화된 옵션**
| 옵션 | 기본값 | 효과 |
|--------|---------|--------|
| Apple 서명 무시 | 켜짐 | Apple이 서명한 항목(com.apple.*) 우선순위 낮춤 |
| 시스템 경로 무시 | 켜짐 | /System 및 /Library 경로 우선순위 낮춤 |
| 서명되지 않음 우선 | 켜짐 | 서명되지 않은 실행 파일에 추가 주의 |
| LOLBins에 집중 | 켜짐 | Living-off-the-Land 바이너리 탐지 우선 |
| 최소 위험 점수 | 0 | 위험 점수 >= 임계값인 항목만 분석 |
| 무시된 경로 | - | 건너뛸 사용자 정의 경로 (쉼표로 구분) |
**알림 임계값**
- `정보` - 모든 것 알림
- `낮음` - 낮음 심각도 이상 알림
- `중간` - 중간 이상 알림 (기본값)
- `높음` - 높음 및 치명적만 알림
- `치명적` - 치명적 위협만 알림
**사용자 정의 프롬프트**
AI 프롬프트에 추가되는 자신만의 지침을 추가하세요. 예시:```
Always notify me if an item uses python or osascript.
Ignore anything from Microsoft.
Be more aggressive with unsigned items from ~/Downloads.
AI는 이러한 선호도를 사용하여 더 스마트한 결정을 내립니다. 예를 들어:
/tmp/의 서명되지 않은 LaunchAgent → 중요 알림RunAtLoad가 있는 osascript → 높음 알림MacPersistenceChecker에는 Claude Code, Claude Desktop 및 기타 MCP 호환 클라이언트가 지속성 데이터를 쿼리할 수 있도록 하는 MCP(Model Context Protocol) 서버가 포함되어 있습니다.
swift build --target MPCServer
바이너리는 `.build/debug/mpc-server`에 생성됩니다.
### 사용 가능한 MCP 도구
| Tool | Description |
|------|-------------|
| `get_current_state` | 선택적 필터를 적용하여 모든 현재 지속성 항목 가져오기 |
| `get_diff` | 기준선 또는 특정 스냅샷으로부터 변경 사항 가져오기 |
| `get_summary` | 개수와 주요 위협에 대한 간결한 개요 |
| `get_item_details` | 식별자로 특정 항목의 전체 세부 정보 가져오기 |
| `get_risk_analysis` | 권장 사항이 포함된 집계 위험 분석 |
| `get_snapshots` | 메타데이터와 함께 사용 가능한 스냅샷 나열 |
| `compare_snapshots` | 두 스냅샷을 비교하여 변경 사항 확인 |
### Claude Code 구성
Claude Code MCP 설정 (`~/.claude/claude_desktop_config.json` 또는 유사 파일)에 추가:```json
{
"mcpServers": {
"macpersistence": {
"command": "/path/to/mpc-server",
"args": []
}
}
}
구성 완료 후, Claude Code에게 다음과 같이 요청할 수 있습니다:
보안 파이프라인을 위한 기계 판독 가능 내보내기:
스캔 완료 후에만 버튼이 활성화됩니다.
영구 삭제 없이 의심스러운 지속성 항목을 안전하게 무력화:








git clone https://github.com/Pinperepette/MacPersistenceChecker.git cd MacPersistenceChecker ./build.sh
Copy `MacPersistenceChecker.app`를 `/Applications/`로 복사하십시오.
### 요구 사항
- macOS 13.0+
- Xcode 15+ 또는 Swift 5.9+
### 종속성
- [GRDB.swift](https://github.com/groue/GRDB.swift) - SQLite 데이터베이스
---
## 권한
스캔하려면 **전체 디스크 접근**이 필요합니다:
- `/Library/LaunchDaemons`
- 시스템 구성 파일
- TCC 데이터베이스
- 쉘 시작 파일
전체 디스크 접근 권한이 없으면 일부 항목이 표시되지 않을 수 있습니다.
---
## 라이선스
MIT 라이선스 - 자세한 내용은 [LICENSE](https://github.com/pinperepette/macpersistencechecker/blob/HEAD/LICENSE)를 참조하십시오.
## 저자
**pinperepette** - 2025
## Star 기록
<a href="https://www.star-history.com/?repos=Pinperepette%2FMacPersistenceChecker&type=date&legend=top-left">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=Pinperepette/MacPersistenceChecker&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=Pinperepette/MacPersistenceChecker&type=date&legend=top-left" />
Star History Chart
</picture>
</a>
---
*Mark Russinovich의 Windows용 [Autoruns](https://docs.microsoft.com/en-us/sysinternals/downloads/autoruns)에서 영감을 받음*