
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 typeshell.php.jpgdanspublic/etstorage/.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 typeauto_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:
.envabsent, vide, illisible, ou placé souspublic/. Vérification world-readable sur Unix.APP_KEYvide, divergence avec.env.example.APP_DEBUG=truequandAPP_ENV=production— l'option--productionforce la règle quel que soit l'env et flag égalementAPP_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:diffBaseline à 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.