
エクスプロイトの検出を試みるプロセス監視ツール
エクスプロイトの検出を試みるプロセス監視ツール
[!IMPORTANT] 新たな脅威: 2026年10月21日 14:00 UTC に予定される PHP の重大なセキュリティリリース。 PHP プロジェクトは 10月20日にこれを発表しました(発表): 2件の重大な脆弱性で、いずれも CVSS v4.0 で 9.2 と評価されています。詳細、影響を受けるバージョン、修正はリリース時に公開されますが、詳細が 公開されたり悪用が始まったりした場合は前倒しになる可能性があります。今すぐ PHP の更新に備えてください。
この発表では、どのような種類の欠陥なのかは述べられていません。攻撃によって PHP がプログラムを起動した場合、 process-watcher はそれぞれをコマンドラインとともに表示し、必要に応じて指定したものを強制終了できます。これは これらの欠陥を探すものではありません。何も防止せず、プロセスを起動せずに PHP 内部で実行されるコードは見逃すため、 検出レイヤーを追加するものであり、パッチの代替にはなりません。
まずはこちら: process-watcher で PHP を監視する、または PHP 完全ガイドをお読みください。
サービスが何を起動するかを可視化します。 process-watcher はサービス(Web サーバー、アプリケーションサーバーなど)と
それが作成するすべてのプロセスをリアルタイムで追跡し、各起動、プログラムの変更、終了を JSON として記録します。オプションで
コマンドラインも含まれます。Web サーバーが突然シェルや curl を実行したとき、何が、どのプロセスによって、どの
サービスから起動されたのかがわかります。Linux(amd64、arm64)向けの単一の静的バイナリです: ダウンロードして、展開して、実行するだけです。
これはアクティビティを可視化するものであり、判断するものではありません。ベースラインを構築したり、何が攻撃かを判断したりするのは、
あなた自身、またはイベントを受け取るシステム(ログファイル、SIEM、Webhook)に委ねられます。オプションで、特定の子
プロセスに対して的を絞った SIGKILL で反応させることもできます(Kill ルール)。
1. 最新のリリースをダウンロードして展開します(amd64 または
arm64、お使いのマシンから自動検出されます。アーカイブ名にはバージョンが含まれるため、2行目で最新のタグを検索します):
ARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/')
VERSION=$(curl -fsSLI -o /dev/null -w '%{url_effective}' https://github.com/Neo23x0/process-watcher/releases/latest | sed 's#.*/##')
curl -fsSLO https://github.com/Neo23x0/process-watcher/releases/download/$VERSION/process-watcher_${VERSION}_linux_${ARCH}.tar.gz
tar xzf process-watcher_${VERSION}_linux_${ARCH}.tar.gz && cd process-watcher_${VERSION}_linux_${ARCH}
2. 実行する 監視したいサービスに対して実行します。root権限と、BTFを備えたLinux 5.15以降が必要です。
sudo ./process-watcher doctor を実行すると、お使いのホストが条件を満たしているか確認できます。
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true
nginx はサービスの実行ファイル名(apache2、php-fpm、java など)の部分文字列です。エージェントを
Ctrl-C で停止すると、イベントが ./process-watcher.jsonl に書き込まれます。--capture-argv=true はコマンドラインを記録しますが、
これにはシークレットが含まれる可能性があります(引数のキャプチャ)。ファイルの方がよければ、バイナリの隣にある process-watcher.yaml を編集し
(自動的に検出されます)、sudo ./process-watcher を実行してください。
3. サービスが起動するものを監視する(2 つ目のターミナル、同じディレクトリ内。jq を使うと JSON が読みやすくなります):
sudo tail -f process-watcher.jsonl | jq -r '
select(.event_type=="process.exec" and .lineage.role=="descendant")
| "\(.timestamp[:19])Z \(.root.image) > \(.process.image) \(.process.argv // [] | join(" "))" | gsub("[[:cntrl:]]"; "?")'
例: nginx というサービスがシェルと少数のプログラムを実行するように仕向けられます (代役のプログラムでシミュレート):
2026-10-17T19:15:16Z nginx > dash sh -c id; uname -s
2026-10-17T19:15:16Z nginx > id id
2026-10-17T19:15:16Z nginx > uname uname -s
2026-10-17T19:15:16Z nginx > curl curl --version
2026-10-17T19:15:16Z nginx > sleep sleep 1
シェル、ダウンロードツール、インタプリタ(sh、curl、wget、nc、python、...)を起動するWebサーバーやアプリケーションサーバーは、Webシェルやリモートコード実行の典型的な痕跡です。すべての世代が追跡され、親プロセスが終了した後も同様です。(jqは表示のために引数を結合するだけであり、イベントはそれらを配列として保持します。shはdashとして表示されます。これは、実際に実行されたプログラムがイメージであるためです。)
次へ: systemdサービスとして実行し続ける · --tcp-address、--udp-address、または--webhook-urlでイベントをSIEMやログパイプラインに送信する(出力) · 疑わしい子プロセスを自動的に終了する(キルルール)。
| 要件 | 値 |
|---|---|
| オペレーティングシステム | Linux、amd64またはarm64 |
| カーネル | 5.15以降で、BTF付き(/sys/kernel/btf/vmlinux)。バージョン番号だけでは保証されません。起動時にエージェントは必要な関数とカーネル構造体フィールドをチェックします。 |
| 権限 | root、またはCAP_BPF + CAP_PERFMON(他のユーザーのプロセスの/proc/<pid>/exeにはCAP_SYS_PTRACE、キル機能にはCAP_KILL、カーネル5.11より前はCAP_SYS_RESOURCE)。カーネルロックダウンconfidentialityは動作を妨げます。 |
| PID名前空間 | ホストの初期PID名前空間(すべてのPIDはホストPID)。コンテナ内での実行は拒否されます。 |
要件が満たされていない場合、エージェントは具体的な診断とともに終了コード3で停止します。短命なプロセスを見逃す/procのポーリングにフォールバックすることは決してありません。sudo ./process-watcher doctorはすべてをチェックし、プログラムをロードして独自のプローブプロセスを実行します。テスト済みカーネル: docs/compatibility.md。
# in the directory the archive was downloaded to, with $VERSION and $ARCH from step 1
curl -fsSLO https://github.com/Neo23x0/process-watcher/releases/download/$VERSION/SHA256SUMS
sha256sum --check --ignore-missing SHA256SUMS
gh attestation verify process-watcher_${VERSION}_linux_${ARCH}.tar.gz --repo Neo23x0/process-watcher # build provenance
各アーカイブには、単一の静的バイナリ(eBPF プログラムが埋め込まれており、実行時に他に必要なものはありません)、コメント付きのサンプル設定 process-watcher.yaml、LICENSE、php/ 以下に emerging-threats/ 内の PHP キットの 2 つの設定(すぐに使用可能: process-watcher --config php/php-observe.yaml)、そして packaging/ に systemd ユニットとそれをインストールするスクリプトが含まれています。提供されるのは amd64 と arm64 のみです。eBPF コレクターは 64 ビットカーネルポインターを前提としているため、32 ビットカーネル(x86、ARM)はサポートされていません。
展開したアーカイブから:
sudo ./packaging/install.sh ./process-watcher # binary, configuration and unit; starts nothing
sudoedit /etc/process-watcher/config.yaml # adjust the watch list
sudo process-watcher doctor
sudo systemctl enable --now process-watcher
詳細、リポジトリのクローンからのインストール方法、およびユニット設定の理由については、packaging/INSTALL.md を参照してください。systemd を使用しない場合は、バイナリをコピーして root 権限で起動してください。
# Log file elsewhere, remote outputs and an exclusion
sudo ./process-watcher --watch-image-contains nginx --exclude-image-contains legitimate-helper \
--log-file /var/log/process-watcher/events.jsonl \
--tcp-address collector.example.net:9000 --udp-address 192.0.2.20:9001 \
--webhook-url https://collector.example.net/hooks/processes
# YAML plus overriding single values
sudo ./process-watcher --config /etc/process-watcher/config.yaml \
--watch-image-contains nginx --watch-image-contains apache2 --capture-argv=true
# Without root, without observation or network access
./process-watcher check-config --config ./process-watcher.yaml
./process-watcher print-config --config ./process-watcher.yaml
# React to child processes (see Kill rules)
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true --kill-enabled=true \
--kill-field image --kill-field argv --kill-string demo-long-running-helper \
--kill-regex '^(useradd|usermod)$'
examples/ に設定例があり、それぞれがテスト内の厳格なローダーによって検証されます。試用向けのシンプルな
レシーバー(Python 3 標準ライブラリのみ)は examples/receivers/ にあります。
nc -lk 9000(TCP)と nc -lu 9001(UDP)があれば、最初の確認には十分です。
| コマンド | 効果 |
|---|---|
run(デフォルト) | 監視を開始します。一致するプロセスがまだ実行されていなくても待機します。 |
check-config | 設定を検証します。BPF プログラムをアタッチせず、ファイルを作成せず、エンドポイントに接続せず、シグナルを一切送信しません。アクティブな kill ルールがあっても同様です。 |
print-config | 解決済みの設定(YAML)とそのソースファイル。シークレットは含みません。ベアラートークンは変数名のみ、webhook URL はスキームとホストのみです。 |
doctor | 要件と権限を確認します(上記参照)。 |
--help、--version | すべてのフラグ、デフォルト値、YAML キーのヘルプ、バージョン。 |