
コード署名検証とタイムライン追跡を備えたmacOS永続化メカニズムスキャナー
Macで実行されるすべてを確認しましょう。 それがなぜ実行されるのかを理解しましょう。 何を残すかを決定しましょう。


MacPersistenceCheckerは、Macで自動的に実行されるすべてのものを表示し、なぜそれが重要かを説明し、何を残し、何を削除するかの判断を支援します。
→ マルウェアを発見 → 隠れた永続化を検出 → 数分でシステムを理解
MacPersistenceChecker v2.0.0 (DMG) をダウンロード
→ 30秒未満でMacをスキャン → インストールウィザード不要、開いてすぐに実行 → ネイティブmacOS、ユニバーサル(Apple Silicon & Intel)、macOS 13+
macOSがアプリが破損していると表示した場合:
xattr -cr /Applications/MacPersistenceChecker.app
アプリはシステムを学習し、数千のアイテムを自動的に分類します。
クイックスタート:
実際のコスト:アクティブ使用時月1ドル未満、定常状態では0ドル。
このアプリは、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 batch | ~$0.005(15クラスタ) |
| システムレポート | ツールバー → レポート | Sonnet | ~$0.05-0.10 |
| 脅威ハント | ツールバー → ハント | Haiku | ~$0.003 |
| スナップショット差分 | 履歴 → 比較 → AIで分析 | Haiku | ~$0.003 |
1日の呼び出し上限(デフォルト30)は設定 → AIで設定可能。ハードリミットで、上限に達するとAIは自動的に無効になります。
### 信頼コントロール
ユーザー定義のルールはAIが抽出したものより**常に優先されます**:
- **このアイテムを信頼** — singleItemルール、あなたの判定が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` 内のSecurity Agentプラグイン
- **Spotlightインポーター** - カスタムメタデータインポーター
- **Quick Lookプラグイン** - 悪用される可能性のあるプレビュー生成機能
- **ディレクトリサービスプラグイン** - 認証プラグイン
- **Finder同期拡張** - 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ソフトウェア
- **隠し場所** - 不審なディレクトリ内の署名済みアプリ
- **ノータライゼーションの欠落** - ノータライゼーションがない最近のアプリ
- **開発者証明書分析** - 既知のベンダーに対するTeam IDの検証
### LOLBins検出(Living-off-the-Land Binaries)
永続的なコンテキストでの正規の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依存関係、ネットワーク接続を含む)
- **インタラクティブキャンバス** - ズーム、パン、関係の探索
- **信頼レベルで色分け** - 迅速な視覚的脅威評価
### セキュリティプロファイルレーダー
信頼、署名、安全性、安定性、透明性、経過時間の各次元を一目で示す包括的なレーダーチャート。
---
## リアルタイム監視
2つの分析モードによる永続性変更の継続的監視。
### 監視モード
**標準モード**
- FSEventsベースのリアルタイムファイルシステム監視
- 設定可能なデバウンスによるインテリジェントなノイズ抑制
- 重要でない変更をフィルタリングする関連性スコアリング
- 関連性の高い変更に対する即時通知
**AIモード**(Claude APIキーが必要)
- Claude AIが検出された各変更を分析
- 署名情報、LOLBins、行動異常、リスクスコアなど完全なコンテキストをAIに送信
- AIが実際の脅威レベルに基づいて通知が必要かどうかを判断
- 設定可能なチェック間隔(30秒〜1時間)
- 重要度しきい値フィルタリング(Info、低、中、高、クリティカル)
### メニューバー統合
- リアルタイム監視ステータスインジケーター
- 「AI」または「Std」を示すモードバッジ
- クイックコントロール(監視開始/停止、スキャン実行)
- 設定へのアクセス
- 未確認の変更のバッジカウント
- 最後に検出された変更のプレビュー
### 通知の重複排除
- 同じアイテムはクールダウン期間中に繰り返し通知をトリガーしません
- 設定可能なクールダウン(1〜24時間、デフォルト2時間)
- 頻繁に変更されるアイテムによる通知疲れを防止
### 起動通知
監視が開始されると、以下の内容を確認する通知を受け取ります:
- アクティブモード(AIモードまたは標準モード)
- チェック間隔(AI)または「リアルタイム」(標準)
- 通知しきい値設定
### 変更検出
- **追加** - 新しい永続性アイテム
- **削除** - 削除されたアイテム
- **変更** - 構成変更(有効/無効、パス変更など)
- **有効/無効** - 状態変更
### AI分析の詳細
AIモードがアクティブな場合、各変更は完全なアイテムデータをClaudeに送信します:
- 基本情報(名前、カテゴリ、パス、plistコンテンツ)
- 署名の詳細(署名済み、Apple、ノータライズ済み、チームID、証明書ステータス)
- リスク評価(スコア、詳細内訳)
- MITREマッピング付きLOLBins検出
- 行動異常
- 意図の不一致(plist vs バイナリ)
- 経過時間異常(タイムスタンプ分析)
- 署名済みだが危険なフラグ
Claudeは以下で応答します:
- `shouldNotify` - ユーザーに警告するかどうか
- `severity` - 脅威レベルの評価
- `title` - 通知タイトル
- `explanation` - これが不審であるかどうかの理由
- `recommendation` - 推奨アクション
- `mitreTechniques` - 関連するATT&CK技法
### AIカスタマイズ
**設定 → AI** でAIが変更を分析する方法を制御:
| オプション | デフォルト | 効果 |
|--------|---------|--------|
| Apple署名を無視 | ON | Apple(com.apple.*)によって署名されたアイテムの優先度を下げる |
| システムパスを無視 | ON | /System および /Library パスの優先度を下げる |
| 未署名を優先 | ON | 未署名の実行可能ファイルに特別な注意を払う |
| LOLBinsに焦点 | ON | Living-off-the-Land Binaries検出を優先 |
| 最小リスクスコア | 0 | リスク >= しきい値のアイテムのみ分析 |
| 無視するパス | - | スキップするカスタムパス(カンマ区切り) |
**通知しきい値**
- `Info` - すべて通知
- `Low` - 低重要度以上を通知
- `Medium` - 中重要度以上を通知(デフォルト)
- `High` - 高およびクリティカルのみ
- `Critical` - クリティカル脅威のみ
**カスタムプロンプト**
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/から)→ クリティカル通知RunAtLoad付きのosascript → 高通知MacPersistenceCheckerには、Claude Code、Claude Desktop、およびその他のMCP互換クライアントが永続性データをクエリできるようにするMCP(Model Context Protocol)サーバーが含まれています。
swift build --target MPCServer
バイナリは `.build/debug/mpc-server` に作成されます。
### 利用可能なMCPツール
| ツール | 説明 |
|------|-------------|
| `get_current_state` | 現在の永続化アイテムをすべて取得(オプションのフィルタ付き) |
| `get_diff` | ベースラインまたは特定のスナップショットからの変更を取得 |
| `get_summary` | カウントと主要な脅威を含むコンパクトな概要 |
| `get_item_details` | 識別子による特定のアイテムの詳細 |
| `get_risk_analysis` | 推奨事項を含む集約されたリスク分析 |
| `get_snapshots` | メタデータ付きで利用可能なスナップショットを一覧表示 |
| `compare_snapshots` | 2つのスナップショットを比較して変更を確認 |
### 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
`MacPersistenceChecker.app` を `/Applications/` にコピーします。
### 必要条件
- macOS 13.0+
- Xcode 15+ or 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
## スター履歴
<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" />
スター履歴チャート
</picture>
</a>
---
*Mark Russinovich による Windows 用の [Autoruns](https://docs.microsoft.com/en-us/sysinternals/downloads/autoruns) に触発されました*