jobsphp

ActualitéOpen Source & Outils

Laravel Scalpel : détecter les intrusions dans vos fichiers PHP

Laravel Scalpel, présenté par Laravel News, s'attaque précisément à ce trou dans le filet: scanner l'état réel du système de fichiers d'une application Laravel déployée, et le comparer à un…

Laravel Scalpel : détecter les intrusions dans vos fichiers PHP

Un scalpel dans le déploiement

eval(base64_decode($_POST['x'])): trois lignes qui survivent à la plupart des audits statiques et pullulent dans les public/ après compromission. Laravel Scalpel, présenté par Laravel News, s'attaque précisément à ce trou dans le filet: scanner l'état réel du système de fichiers d'une application Laravel déployée, et le comparer à un instantané réputé sain pour faire remonter ce qui a été ajouté, modifié ou supprimé.

Ce qu'il inspecte (et ce qu'il ne fait pas)

Harry Agustiana, l'auteur, positionne l'outil en complément de Ward et Checkpoint. Ces derniers auscultent le code source, la configuration et les dépendances. Scalpel, lui, cherche la trace d'une intrusion déjà consommée — pas une vulnérabilité latente, un artefact post-exploitation.

Six scanners embarqués par défaut dans scalpel:scan. Cinq examinent l'état courant, le sixième — Baseline Diff — compare à un instantané. Détail technique:

  • Structural: fichiers .php, .phtml, .pht, .phar, doubles extensions type shell.php.jpg dans public/ et storage/. public/index.php, public/vendor/, vues compilées et cache restent en allowlist, modifiables dans la config.
  • Obfuscated-code: eval(base64_decode(...)), payloads compressés, appels dynamiques de fonctions, évaluation directe d'inputs requête, chaînes encodées anormalement longues. Patterns désactivables un par un si du code métier déclenche un faux positif.
  • .htaccess: handlers et mappings MIME pour Python, Perl, CGI, Options +ExecCGI, règles de rewrite redirigeant vers des URL externes, directives PHP type auto_prepend_file.
  • .user.ini: auto_prepend_file, auto_append_file, include_path, disable_functions — voie classique pour exécuter un fichier caché à chaque requête.
  • Environment: .env absent, vide, illisible, ou placé sous public/. Vérification world-readable sur Unix. APP_KEY vide, divergence avec .env.example. APP_DEBUG=true quand APP_ENV=production — l'option --production force la règle quel que soit l'env et flag également APP_ENV=local.
  • Baseline Diff: SHA-256, taille, mtime. Rapporte fichiers ajoutés, modifiés, supprimés.

Workflow minimal en prod

php artisan optimize
php artisan scalpel:baseline --force
php artisan scalpel:scan
php artisan scalpel:diff

Baseline à créer uniquement lorsque l'application est dans un état de confiance — après audit, après hardening, après validation manuelle. Sans baseline, scalpel:scan et scalpel:diff émettent un finding MEDIUM pour le signaler. Après chaque déploiement, l'auteur recommande optimize puis scalpel:baseline --force pour rafraîchir l'empreinte.

Exclusions par défaut: logs, sessions, vues compilées, storage/app. vendor/ exclu des scans de contenu mais conservé dans les comparaisons baseline — un fichier injecté dans un paquet installé remontera dans le diff. Mode strict activé par défaut: hash de chaque fichier à chaque comparaison.

Verdict

À brancher dans le pipeline post-déploiement dès que la baseline est figée. Coût d'intégration faible, surface fonctionnelle alignée sur les vecteurs d'intrusion concrets: backdoors obfusquées, directives serveur altérées, drift de configuration, drop de fichiers exécutables dans les répertoires servis. Ce n'est ni un WAF, ni un scanner de CVEs de dépendances, ni un remplacement d'un SAST type Ward. C'est un détecteur de compromission post-incident, à exécuter en cron quotidien et après chaque push en production. Pour une équipe PHP qui livre du Laravel exposé, l'ajouter est une décision sans regret.