
Инструмент мониторинга процессов, который пытается обнаруживать эксплуатацию
Инструмент мониторинга процессов, который пытается обнаружить эксплуатацию
[!IMPORTANT] Новая угроза: критический релиз безопасности PHP 21 октября 2026 г., 14:00 UTC. Проект PHP объявил о нём 20 октября (анонс): две критические уязвимости, обе оценены по CVSS v4.0 в 9.2. Подробности, затронутые версии и исправления появятся вместе с релизом, который может выйти раньше, если подробности станут публичными или начнётся эксплуатация. Готовьтесь обновить PHP уже сейчас.
В анонсе не сказано, какого рода эти уязвимости. Если атака заставляет PHP запускать программы, process-watcher показывает каждую из них с её командной строкой и может по желанию завершать те, которые вы укажете. Он не ищет эти уязвимости: он ничего не предотвращает и пропускает код, который выполняется внутри PHP без запуска процесса, поэтому он добавляет слой обнаружения и не заменяет патч.
Начните здесь: наблюдение за PHP с помощью process-watcher, или прочитайте полное руководство по 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 и Linux 5.15 или новее с BTF;
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 записывает командные строки, которые могут
содержать секреты (Argument capture). Предпочитаете файл? Отредактируйте 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 · отправьте события в вашу SIEM или конвейер журналов
с помощью --tcp-address, --udp-address или --webhook-url (Выходы) · автоматически завершайте подозрительные дочерние процессы
(Правила завершения).
| Требование | Значение |
|---|---|
| Операционная система | Linux, amd64 или arm64 |
| Ядро | 5.15 или новее с BTF (/sys/kernel/btf/vmlinux). Один лишь номер версии ничего не гарантирует: при запуске агент проверяет необходимые ему функции и поля структур ядра. |
| Привилегии | root, или CAP_BPF + CAP_PERFMON (+ CAP_SYS_PTRACE для /proc/<pid>/exe процессов других пользователей, CAP_KILL для функции завершения, CAP_SYS_RESOURCE до ядра 5.11). Блокировка ядра 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