
익스플로잇 탐지를 시도하는 프로세스 모니터링 도구
익스플로잇을 탐지하려고 시도하는 프로세스 모니터링 도구
[!IMPORTANT] 신종 위협: 2026년 10월 21일 14:00 UTC, PHP 보안 긴급 릴리스. PHP 프로젝트가 10월 20일에 이를 발표했습니다 (발표문): 두 개의 치명적 취약점이며, 둘 다 CVSS v4.0 9.2로 평가되었습니다. 세부 정보, 영향을 받는 버전 및 수정 사항은 릴리스와 함께 공개되며, 세부 정보가 공개되거나 익스플로잇이 시작되면 더 일찍 나올 수 있습니다. 지금 PHP 업데이트를 준비하십시오.
발표문에는 이 결함이 어떤 종류인지 나와 있지 않습니다. 공격으로 PHP가 프로그램을 시작하게 되면, process-watcher는 각 프로그램을 명령줄과 함께 보여주고 선택적으로 지정한 프로그램을 종료할 수 있습니다. 이 도구는 이러한 결함을 찾지 않습니다: 아무것도 예방하지 못하며 프로세스를 시작하지 않고 PHP 내부에서 실행되는 코드는 놓치므로, 탐지 계층을 추가할 뿐 패치를 대체하지는 않습니다.
여기서 시작하십시오: process-watcher로 PHP 감시하기, 또는 전체 PHP 가이드를 읽으십시오.
서비스가 무엇을 시작하는지 확인하십시오. process-watcher는 서비스(웹 서버, 애플리케이션 서버, ...)와 그 서비스가
생성하는 모든 프로세스를 실시간으로 추적하고, 각 시작, 프로그램 변경 및 종료를 JSON으로 기록하며 선택적으로 명령줄도
함께 기록합니다. 웹 서버가 갑자기 셸이나 curl을 실행하면, 무엇이 시작되었는지, 어느 프로세스에 의해, 어느 서비스에서
시작되었는지 확인할 수 있습니다. Linux(amd64, arm64)용 단일 정적 바이너리입니다: 다운로드하고, 압축을 풀고, 실행하십시오.
이 도구는 활동을 가시화할 뿐, 판단하지는 않습니다. 기준선을 구축하거나 공격 여부를 결정하는 일은 사용자 또는 이벤트를
수신하는 시스템(로그 파일, SIEM, 웹훅)에 맡겨집니다. 선택적으로 특정 자식 프로세스에 표적화된 SIGKILL로 대응할 수
있습니다(종료 규칙).
1. 다운로드 및 압축 해제 최신 릴리스(amd64 또는
arm64, 사용 중인 머신에서 감지됨; 아카이브 이름에 버전이 포함되어 있으므로 두 번째 줄에서 최신 태그를 조회합니다):
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. 서비스가 시작하는 항목 관찰 (두 번째 터미널, 동일 디렉터리; 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,
...)를 실행하는 웹 또는 애플리케이션 서버는 웹 셸 또는 원격 코드 실행의 전형적인 흔적입니다. 부모가 종료된
후에도 모든 세대가 추적됩니다. (jq는 표시를 위해 인수들을 결합할 뿐이며, 이벤트는 이들을 배열로 유지합니다. sh는
실제로 실행된 프로그램인 이미지이기 때문에 dash로 표시됩니다.)
다음: systemd 서비스로 계속 실행하기 · --tcp-address, --udp-address 또는
--webhook-url을 사용하여 이벤트를 SIEM 또는 로그 파이프라인으로 전송하기 (출력) · 의심스러운 자식
프로세스 자동 종료하기 (Kill 규칙).
| 요구 사항 | 값 |
|---|---|
| 운영 체제 | Linux, amd64 또는 arm64 |
| 커널 | 5.15 이상 BTF 포함 (/sys/kernel/btf/vmlinux). 버전 번호만으로는 보장되지 않습니다: 시작 시 에이전트가 필요한 함수와 커널 구조체 필드를 확인합니다. |
| 권한 | root, 또는 CAP_BPF + CAP_PERFMON (다른 사용자 프로세스의 /proc/<pid>/exe에 대해서는 CAP_SYS_PTRACE, kill 기능에 대해서는 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 키트 구성 두 개가 즉시 사용 가능한 형태로(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)만으로도 첫 확인에는 충분합니다.