
Uno strumento di monitoraggio dei processi che tenta di rilevare lo sfruttamento
Uno strumento di monitoraggio dei processi che tenta di rilevare lo sfruttamento
[!IMPORTANT] Minaccia emergente: rilascio critico di sicurezza PHP il 21 ottobre 2026, 14:00 UTC. Il progetto PHP lo ha annunciato il 20 ottobre (annuncio): due vulnerabilità critiche, entrambe valutate CVSS v4.0 9.2. Dettagli, versioni interessate e correzioni arriveranno con il rilascio, che potrebbe avvenire prima se i dettagli diventano pubblici o se inizia lo sfruttamento. Preparati ad aggiornare PHP ora.
L'annuncio non specifica che tipo di difetti siano. Se un attacco fa avviare programmi a PHP, process-watcher mostra ciascuno di essi con la relativa riga di comando e può facoltativamente terminare quelli che indichi. Non cerca questi difetti: non previene nulla e non rileva il codice che viene eseguito all'interno di PHP senza avviare un processo, quindi aggiunge un livello di rilevamento e non sostituisce la patch.
Inizia da qui: monitorare PHP con process-watcher, oppure leggi la guida completa su PHP.
Scopri cosa avvia un servizio. process-watcher segue un servizio (un web server, un application server, ...) e ogni
processo che crea, in tempo reale, e registra ogni avvio, cambio di programma e uscita come JSON, facoltativamente con la riga di
comando. Quando il tuo web server esegue improvvisamente una shell o curl, vedi cosa è stato avviato, da quale processo e da quale
servizio. È un singolo binario statico per Linux (amd64, arm64): scarica, estrai, esegui.
Rende visibile l'attività; non la giudica. Costruire una baseline o decidere cosa sia un attacco è lasciato a te
o al sistema che riceve gli eventi (file di log, SIEM, webhook). Facoltativamente può reagire a specifici processi figli
con un SIGKILL mirato (Regole di terminazione).
1. Scarica ed estrai l'ultima release (amd64 o
arm64, rilevata dalla tua macchina; i nomi degli archivi contengono la versione, quindi la seconda riga cerca l'ultimo tag):
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. Eseguilo contro il servizio che vuoi monitorare. Richiede root e Linux 5.15 o superiore con BTF;
sudo ./process-watcher doctor ti dice se il tuo host è idoneo.
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true
nginx è una sottostringa del nome dell'eseguibile del tuo servizio (apache2, php-fpm, java, ...). Arresta l'agente con
Ctrl-C; scrive gli eventi in ./process-watcher.jsonl. --capture-argv=true registra le righe di comando, che possono
contenere segreti (Argument capture). Preferisci un file? Modifica process-watcher.yaml accanto al binario
(viene trovato automaticamente) ed esegui sudo ./process-watcher.
3. Osserva cosa avvia il servizio (secondo terminale, stessa directory; jq rende il JSON leggibile):
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:]]"; "?")'
Esempio: un servizio chiamato nginx viene fatto eseguire una shell e alcuni programmi (simulati con un programma sostitutivo):
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
Un server web o applicativo che avvia shell, strumenti di download o interpreti (sh, curl, wget, nc, python,
...) è una traccia classica di una web shell o di un'esecuzione di codice remoto. Vengono seguite tutte le generazioni, anche dopo che il processo padre
è terminato. (jq unisce solo gli argomenti per la visualizzazione; l'evento li mantiene come array. sh appare come dash
perché l'immagine è il programma che è stato effettivamente eseguito.)
Successivamente: mantienilo in esecuzione come servizio systemd · invia gli eventi al tuo SIEM o alla pipeline di log
con --tcp-address, --udp-address o --webhook-url (Output) · termina automaticamente i processi figli sospetti
(Regole di kill).
| Requisito | Valore |
|---|---|
| Sistema operativo | Linux, amd64 o arm64 |
| Kernel | 5.15 o successivo con BTF (/sys/kernel/btf/vmlinux). Il solo numero di versione non è una garanzia: all'avvio l'agente verifica le funzioni e i campi delle strutture del kernel di cui ha bisogno. |
| Privilegi | root, oppure CAP_BPF + CAP_PERFMON (+ CAP_SYS_PTRACE per /proc/<pid>/exe dei processi di altri utenti, CAP_KILL per la funzionalità di kill, CAP_SYS_RESOURCE prima del kernel 5.11). Il lockdown del kernel confidentiality impedisce il funzionamento. |
| PID namespace | il PID namespace iniziale dell'host (tutti i PID sono PID dell'host); l'esecuzione all'interno di un container viene rifiutata. |
Se manca un requisito, l'agente si arresta con una diagnosi concreta e codice di uscita 3; non ripiega mai sul
polling di /proc, che perderebbe i processi di breve durata. sudo ./process-watcher doctor verifica tutto, carica i
programmi ed esegue un proprio processo di prova. Kernel testati: 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
Ogni archivio contiene il singolo binario statico (programmi eBPF incorporati; non serve altro a runtime), la
configurazione di esempio commentata process-watcher.yaml, la LICENSE, sotto php/ le due configurazioni del kit
PHP in emerging-threats/, utilizzabili subito (process-watcher --config php/php-observe.yaml), e
in packaging/ l'unità systemd con lo script che la installa. Sono forniti solo amd64 e arm64: il collector eBPF
presuppone puntatori del kernel a 64 bit, quindi i kernel a 32 bit (x86, ARM) non sono supportati.