
Una herramienta de monitoreo de procesos que intenta detectar la explotación
Una herramienta de monitorización de procesos que intenta detectar la explotación
[!IMPORTANT] Amenaza emergente: versión crítica de seguridad de PHP el 21 de octubre de 2026, 14:00 UTC. El proyecto PHP lo anunció el 20 de octubre (anuncio): dos vulnerabilidades críticas, ambas calificadas con CVSS v4.0 9.2. Los detalles, las versiones afectadas y las correcciones llegan con la versión, que puede publicarse antes si los detalles se hacen públicos o comienza la explotación. Prepárese para actualizar PHP ahora.
El anuncio no dice qué tipo de fallos son. Si un ataque hace que PHP inicie programas, process-watcher muestra cada uno con su línea de comandos y, opcionalmente, puede matar los que usted indique. No busca estos fallos: no evita nada y pasa por alto el código que se ejecuta dentro de PHP sin iniciar un proceso, por lo que añade una capa de detección y no sustituye al parche.
Empiece aquí: vigilando PHP con process-watcher, o lea la guía completa de PHP.
Vea qué inicia un servicio. process-watcher sigue a un servicio (un servidor web, un servidor de aplicaciones, ...) y cada
proceso que crea, en tiempo real, y registra cada inicio, cambio de programa y salida como JSON, opcionalmente con la línea de
comandos. Cuando su servidor web ejecuta de repente un shell o curl, usted ve qué se inició, por qué proceso y desde qué
servicio. Es un único binario estático para Linux (amd64, arm64): descargue, descomprima, ejecute.
Hace visible la actividad; no la juzga. Crear una línea base o decidir qué es un ataque queda en sus manos
o en el sistema que recibe los eventos (archivo de registro, SIEM, webhook). Opcionalmente puede reaccionar ante procesos hijos
específicos con un SIGKILL dirigido (reglas de eliminación).
1. Descargue y descomprima la última versión (amd64 o
arm64, detectado desde su máquina; los nombres de los archivos contienen la versión, por lo que la segunda línea busca la última etiqueta):
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. Ejecútalo contra el servicio que quieres vigilar. Requiere root y Linux 5.15 o superior con BTF;
sudo ./process-watcher doctor te indica si tu host cumple los requisitos.
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true
nginx es una subcadena del nombre del ejecutable de tu servicio (apache2, php-fpm, java, ...). Detén el agente con
Ctrl-C; este escribe los eventos en ./process-watcher.jsonl. --capture-argv=true registra las líneas de comandos, que pueden
contener secretos (Captura de argumentos). ¿Prefieres un archivo? Edita process-watcher.yaml junto al binario
(se encuentra automáticamente) y ejecuta sudo ./process-watcher.
3. Observa qué inicia el servicio (segunda terminal, mismo directorio; jq hace legible el 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:]]"; "?")'
Ejemplo: se hace que un servicio llamado nginx ejecute un shell y algunos programas (simulados con un programa sustituto):
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 servidor web o de aplicaciones que inicia shells, herramientas de descarga o intérpretes (sh, curl, wget, nc, python,
...) es un rastro clásico de una web shell o de ejecución remota de código. Se siguen todas las generaciones, también después de que el padre
haya terminado. (jq solo une los argumentos para mostrarlos; el evento los conserva como un array. sh aparece como dash
porque la imagen es el programa que realmente se ejecutó.)
Siguiente: mantenerlo en ejecución como un servicio systemd · enviar los eventos a tu SIEM o pipeline de logs
con --tcp-address, --udp-address o --webhook-url (Salidas) · terminar automáticamente los procesos hijos sospechosos
(Reglas de terminación).
| Requisito | Valor |
|---|---|
| Sistema operativo | Linux, amd64 o arm64 |
| Kernel | 5.15 o superior con BTF (/sys/kernel/btf/vmlinux). El número de versión por sí solo no es garantía: al iniciar, el agente comprueba las funciones y los campos de estructura del kernel que necesita. |
| Privilegios | root, o CAP_BPF + CAP_PERFMON (+ CAP_SYS_PTRACE para /proc/<pid>/exe de procesos de otros usuarios, CAP_KILL para la función de terminación, CAP_SYS_RESOURCE antes del kernel 5.11). El bloqueo del kernel confidentiality impide la operación. |
| Espacio de nombres de PID | el espacio de nombres de PID inicial del host (todos los PID son PID del host); se rechaza la ejecución dentro de un contenedor. |
Si falta algún requisito, el agente se detiene con un diagnóstico concreto y código de salida 3; nunca recurre a
sondeo de /proc, que pasaría por alto procesos de corta duración. sudo ./process-watcher doctor comprueba todo, carga los
programas y ejecuta un proceso de prueba propio. Kernels probados: 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