Process Sentinelgoose-sandbox / project 03
Next project · macOS prototype

Process
Sentinel

デバイスの中で動くプロセスの森を、親子の流れとして描く。 署名・CPU・メモリ・ネットワーク、そして前回との差分を重ねて、 「見慣れない動き」に気づくための静的ビューアです。

Pipeline Viz の「構造 × 状態」を、Mac のプロセスに適用した試作。

sentinel-mbp · 29 procs demo snapshot
launchd PID 1 · root Safari PID 820 · cpu 18.2% WebKit.WebContent PID 845 · cpu 62.3% CHANGED unknown_agent unsigned · 45.77.12.9:8443 100 WebKit.GPU PID 847 · 21.5% Networking PID 846 · NET 1 親 → 子 · 未署名 / 一時領域 / 高負荷 / 差分を色とスコアで表現
左から右へ、親から子へ。 1 error · 5 warning · 1 unsigned
HOW IT WORKS

収集・正規化・可視化を、静的な仕組みで。

ネイティブアプリや常駐エージェントは作りません。macOS 標準の ps / codesign / lsof でスナップショットを取得し、JSON に正規化して、ブラウザのビューアに渡します。 サーバーもデータベースも不要で、GitHub Pages にそのまま置けます。

01 / COLLECT

プロセスを採取

ps で PID・親子関係・CPU・メモリを取得し、proc_pidpath で実行パスを補完。lsof で接続先を紐づけます。

02 / NORMALIZE

JSON に整える

codesign で署名・Team ID・アドホック署名を確認し、1 つの process_snapshot.json にまとめます。

03 / VISUALIZE

ツリーとして読む

ブラウザ側で状態を分類し、親子ツリー・アラート・差分・インスペクタを描画。状態は URL に載ります。

FEATURES

一枚の画面で、構造と状態を。

プロセスツリー

親子関係を左から右の流れで配置。フィルタ時も祖先を薄く残し、文脈を切らしません。

署名の可視化

未署名・アドホック・Team ID を表示。未署名バイナリと一時領域からの実行は Error として強調します。

アラートレール

Error / Warning をスコア順に一覧。クリックで該当ノードへ移動し、理由を確認できます。

ベースライン差分

前回スナップショットとの新規・変更・消滅を判定。実行パスをキーにし、CPU ±10pt などの変化を拾います。

ネットワーク相関

lsof から TCP / UDP の接続先をプロセス単位で表示。未知の外向き接続を署名と並べて確認できます。

履歴スパークライン

--watch で複数回サンプリングすると、CPU とメモリの短い推移をインスペクタに描きます。

STATUS MODEL

4 つの状態と、その決め方。

分類はブラウザ側の純粋関数で行い、スナップショットには生の事実だけを持たせます。判定順は「未署名・危険パス → 警告条件 → システム領域 → 健全」。

状態条件の例表示
Error signed: false、/tmp・/Users/Shared からの実行 赤いノード。スコア最大 100。アラート最上位。
Warning アドホック署名、CPU 40% 以上、メモリ 15% 以上、新規出現、署名不明 琥珀色。スコアと理由を表示。
Healthy 署名済みで、既知の実行パス・通常の負荷 ミント色。静かに一覧に残る。
External /System・/usr/libexec などのシステム領域 青灰色。スコアは 0 に固定し、ノイズを抑える。

状態は「危険度の断定」ではなく、見る順番を決めるためのシグナルです。最終判断はパス・署名・接続先・差分を並べて行います。

QUICK START

手元の Mac で試す。

デモは合成スナップショットです。実データを見るには、ProcessSentinel ディレクトリでコレクタを実行してからビューアを開きます。

1 · collectPython 3 · macOS
# ProcessSentinel に移動して
cd ProcessSentinel
python3 tools/collect_processes.py

# 前回を baseline に残しつつ、12 回サンプリング
python3 tools/collect_processes.py \
  --baseline viewer/data/process_baseline.json \
  --watch 12 --interval 2
2 · viewstatic
# 静的サーバーを起動
python3 -m http.server 8000

# ブラウザで開く
http://localhost:8000/ProcessSentinel/viewer/

# 別のスナップショットを指定
...viewer/?data=process_snapshot.json
           &baseline=process_baseline.json

署名確認には codesign、接続確認には lsof を使います。権限のないプロセスは署名が「未確認」になり、Warning として残ります。--no-codesign / --no-network で省略も可能です。

SCOPE

これは何で、何ではないか。

プロセスの「読む順番」を作る

ツリー・署名・負荷・接続・差分を 1 画面に寄せ、怪しい候補を上から確認できるようにします。

Endpoint Security ではない

イベントを常時監視するのではなく、スナップショットを取得する静的プロトタイプです。検知エンジンではありません。

macOS のみ収集

iOS / iPadOS のプロセス取得は未実装。提案の Phase 4 以降の範囲です。

デモは合成データ

公開デモのプロセス名・PID・接続先は実在の macOS を模した合成値です。実データはローカルで生成します。