
Uma ferramenta de monitoramento de processos que tenta detectar exploração
Uma ferramenta de monitoramento de processos que tenta detectar exploração
[!IMPORTANT] Ameaça emergente: versão crítica de segurança do PHP em 21 de outubro de 2026, 14:00 UTC. O projeto PHP anunciou-a em 20 de outubro (anúncio): duas vulnerabilidades críticas, ambas classificadas com CVSS v4.0 9.2. Os detalhes, as versões afetadas e as correções chegam com a versão, que pode ser lançada mais cedo se os detalhes se tornarem públicos ou a exploração começar. Prepare-se para atualizar o PHP agora.
O anúncio não diz que tipo de falhas são estas. Se um ataque fizer o PHP iniciar programas, o process-watcher mostra cada um com a sua linha de comando e pode, opcionalmente, eliminar os que indicar. Não procura estas falhas: não impede nada e não deteta código que é executado dentro do PHP sem iniciar um processo, pelo que acrescenta uma camada de deteção e não substitui a correção.
Comece aqui: monitorizar o PHP com o process-watcher, ou leia o guia completo do PHP.
Veja o que um serviço inicia. O process-watcher segue um serviço (um servidor web, um servidor de aplicações, ...) e todos os
processos que este cria, em tempo real, e registra cada início, mudança de programa e saída como JSON, opcionalmente com a linha de
comando. Quando o seu servidor web executa subitamente uma shell ou curl, vê o que foi iniciado, por que processo e a partir de que
serviço. É um único binário estático para Linux (amd64, arm64): descarregue, descompacte, execute.
Torna a atividade visível; não a julga. Construir uma linha de base ou decidir o que é um ataque fica ao seu critério
ou ao do sistema que recebe os eventos (ficheiro de log, SIEM, webhook). Opcionalmente, pode reagir a processos filhos específicos
com um SIGKILL direcionado (Regras de eliminação).
1. Descarregue e descompacte a versão mais recente (amd64 ou
arm64, detetada a partir da sua máquina; os nomes dos arquivos contêm a versão, pelo que a segunda linha procura a tag mais recente):
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. Execute-o contra o serviço que você deseja monitorar. Ele requer root e Linux 5.15 ou mais recente com BTF;
sudo ./process-watcher doctor informa se o seu host é compatível.
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true
nginx é uma substring do nome do executável do seu serviço (apache2, php-fpm, java, ...). Pare o agente com
Ctrl-C; ele grava os eventos em ./process-watcher.jsonl. --capture-argv=true registra as linhas de comando, que podem
conter segredos (Captura de argumentos). Prefere um arquivo? Edite process-watcher.yaml ao lado do binário
(ele é encontrado automaticamente) e execute sudo ./process-watcher.
3. Observe o que o serviço inicia (segundo terminal, mesmo diretório; jq torna o JSON legível):
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:]]"; "?")'
Exemplo: um serviço chamado nginx é feito para executar um shell e alguns programas (simulados com um programa substituto):
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
Um servidor web ou de aplicação que inicia shells, ferramentas de download ou interpretadores (sh, curl, wget, nc, python,
...) é um rastro clássico de um web shell ou execução remota de código. Todas as gerações são seguidas, também depois que o pai
terminou. (jq apenas junta os argumentos para exibição; o evento os mantém como um array. sh aparece como dash
porque a imagem é o programa que realmente foi executado.)
Próximo: mantenha-o em execução como um serviço systemd · envie os eventos para o seu SIEM ou pipeline de logs
com --tcp-address, --udp-address ou --webhook-url (Saídas) · encerre processos filhos suspeitos
automaticamente (Regras de encerramento).
| Requisito | Valor |
|---|---|
| Sistema operacional | Linux, amd64 ou arm64 |
| Kernel | 5.15 ou mais recente com BTF (/sys/kernel/btf/vmlinux). O número da versão por si só não é garantia: na inicialização o agente verifica as funções e os campos de estrutura do kernel de que precisa. |
| Privilégios | root, ou CAP_BPF + CAP_PERFMON (+ CAP_SYS_PTRACE para /proc/<pid>/exe de processos de outros usuários, CAP_KILL para o recurso de encerramento, CAP_SYS_RESOURCE antes do kernel 5.11). O lockdown do kernel confidentiality impede a operação. |
| Namespace de PID | o namespace de PID inicial do host (todos os PIDs são PIDs do host); a execução dentro de um contêiner é recusada. |
Se algum requisito estiver faltando, o agente para com um diagnóstico concreto e código de saída 3; ele nunca recorre a
polling de /proc, o que perderia processos de curta duração. sudo ./process-watcher doctor verifica tudo, carrega os
programas e executa um processo de teste próprio. Kernels testados: 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
Cada arquivo contém o binário estático único (programas eBPF incorporados; nada mais é necessário em tempo de execução), a
configuração de exemplo comentada process-watcher.yaml, a LICENSE, abaixo de php/ as duas configurações do kit
PHP em emerging-threats/, utilizáveis imediatamente (process-watcher --config php/php-observe.yaml), e
em packaging/ a unit systemd com o script que a instala. Apenas amd64 e arm64 são fornecidos: o coletor
eBPF assume ponteiros de kernel de 64 bits, portanto kernels de 32 bits (x86, ARM) não são suportados.