
Un outil de surveillance des processus qui tente de détecter l'exploitation
Un outil de surveillance des processus qui tente de détecter l'exploitation
[!IMPORTANT] Menace émergente : publication de sécurité PHP critique le 21 octobre 2026, 14:00 UTC. Le projet PHP l'a annoncée le 20 octobre (annonce) : deux vulnérabilités critiques, toutes deux notées CVSS v4.0 9.2. Les détails, les versions affectées et les correctifs accompagneront la publication, qui pourrait survenir plus tôt si les détails deviennent publics ou si l'exploitation commence. Préparez-vous à mettre à jour PHP dès maintenant.
L'annonce ne précise pas la nature de ces failles. Si une attaque amène PHP à lancer des programmes, process-watcher affiche chacun d'eux avec sa ligne de commande et peut éventuellement tuer ceux que vous désignez. Il ne recherche pas ces failles : il ne prévient rien et manque le code qui s'exécute à l'intérieur de PHP sans lancer de processus, il ajoute donc une couche de détection et ne remplace pas le correctif.
Commencez ici : surveiller PHP avec process-watcher, ou lisez le guide PHP complet.
Voyez ce qu'un service lance. process-watcher suit un service (un serveur web, un serveur d'application, ...) et chaque
processus qu'il crée, en temps réel, et journalise chaque démarrage, changement de programme et arrêt au format JSON, éventuellement avec la ligne de
commande. Quand votre serveur web exécute soudainement un shell ou curl, vous voyez ce qui a été lancé, par quel processus et depuis quel
service. C'est un binaire statique unique pour Linux (amd64, arm64) : téléchargez, décompressez, exécutez.
Il rend l'activité visible ; il ne la juge pas. Construire une référence ou décider ce qui constitue une attaque vous revient
ou revient au système qui reçoit les événements (fichier de journal, SIEM, webhook). Il peut éventuellement réagir à des processus enfants
spécifiques avec un SIGKILL ciblé (Règles de kill).
1. Téléchargez et décompressez la dernière version (amd64 ou
arm64, détectée depuis votre machine ; les noms des archives contiennent la version, donc la deuxième ligne recherche le dernier 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. Lancez-le contre le service que vous souhaitez surveiller. Il nécessite les droits root et Linux 5.15 ou une version plus récente avec BTF ;
sudo ./process-watcher doctor vous indique si votre hôte est compatible.
sudo ./process-watcher --watch-image-contains nginx --capture-argv=true
nginx est une sous-chaîne du nom de l'exécutable de votre service (apache2, php-fpm, java, ...). Arrêtez l'agent avec
Ctrl-C ; il écrit les événements dans ./process-watcher.jsonl. --capture-argv=true enregistre les lignes de commande, qui peuvent
contenir des secrets (Argument capture). Vous préférez un fichier ? Modifiez process-watcher.yaml à côté du binaire
(il est trouvé automatiquement) et exécutez sudo ./process-watcher.
3. Surveillez ce que le service démarre (second terminal, même répertoire ; jq rend le JSON lisible) :
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:]]"; "?")'
Exemple : un service appelé nginx est amené à exécuter un shell et quelques programmes (simulés avec un programme de substitution) :
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 serveur web ou d'application qui lance des shells, des outils de téléchargement ou des interpréteurs (sh, curl, wget, nc, python,
...) est une trace classique d'un web shell ou d'une exécution de code à distance. Toutes les générations sont suivies, y compris après que le parent
a terminé. (jq ne fait que joindre les arguments pour l'affichage ; l'événement les conserve sous forme de tableau. sh apparaît comme dash
car l'image est le programme qui s'est réellement exécuté.)
Ensuite : maintenez-le en fonctionnement comme service systemd · envoyez les événements à votre SIEM ou pipeline de journaux
avec --tcp-address, --udp-address ou --webhook-url (Sorties) · terminez automatiquement les processus enfants suspects
(Règles de kill).
| Prérequis | Valeur |
|---|---|
| Système d'exploitation | Linux, amd64 ou arm64 |
| Noyau | 5.15 ou plus récent avec BTF (/sys/kernel/btf/vmlinux). Le numéro de version seul n'est pas une garantie : au démarrage, l'agent vérifie les fonctions et les champs de structure du noyau dont il a besoin. |
| Privilèges | root, ou CAP_BPF + CAP_PERFMON (+ CAP_SYS_PTRACE pour /proc/<pid>/exe des processus d'autres utilisateurs, CAP_KILL pour la fonctionnalité de kill, CAP_SYS_RESOURCE avant le noyau 5.11). Le verrouillage du noyau confidentiality empêche le fonctionnement. |
| Namespace PID | le namespace PID initial de l'hôte (tous les PID sont des PID hôtes) ; l'exécution à l'intérieur d'un conteneur est refusée. |
Si un prérequis manque, l'agent s'arrête avec un diagnostic concret et le code de sortie 3 ; il ne se rabat jamais sur
l'interrogation de /proc, ce qui manquerait les processus de courte durée. sudo ./process-watcher doctor vérifie tout, charge les
programmes et exécute son propre processus de test. Noyaux testés : 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