Artemis : détecter les failles SSRF en PHP/Symfony avec l’analyse statique
Les attaques SSRF (Server‑Side Request Forgery) sont devenues une menace sérieuse dans le développement web moderne. Dans un monde où les microservices, APIs et configurations cloud s’interconnectent en permanence, un simple appel réseau peut ouvrir la porte à des données sensibles internes.
C’est ici qu’intervient Artemis , un outil d’analyse statique avancée conçu pour aider les développeurs PHP — et notamment Symfony — à identifier ces chemins de vulnérabilités. Voici un guide pratique pour comprendre, utiliser, et intégrer Artemis dans un workflow de sécurité moderne.
Pourquoi les SSRF sont critiques en PHP ?
Une attaque SSRF exploite le fait qu’un serveur web peut faire des requêtes vers d’autres ressources (souvent internes), sur la base d’entrées utilisateur non filtrées.
Conséquences typiques :
Accès aux metadata cloud (AWS, GCP…)
Scan du réseau interne
Contournement de pare‑feu / ACL
Récupération de fichiers ou d’identifiants sensibles
Symfony et d’autres frameworks PHP exposent de nombreux points d’entrée (query, body, headers) et fonctions réseau (HttpClient, curl, etc.), rendant l’analyse complexe à l’œil nu.
Artemis : analyse taint, graphe d’appel, et intelligence contextuelle
Artemis repose sur une série de techniques clés :
Analyse taint interprocédurale : suit les données “sales” (non filtrées) à travers le code, même entre plusieurs fonctions ou services.
Détection de source → sink : par exemple, Request->get('url') → HttpClient::request(...).
Sensibilité au chemin (path-sensitive) : évite les faux positifs en tenant compte des conditions de validation.
Pruning intelligent : arrête l’analyse lorsqu’un chemin est bloqué par une vérification efficace.
Exemple Symfony : vulnérabilité SSRF classique
// src/Controller/FetchController.php
#[Route('/fetch')] public function fetch(Request $request): Response
{
$url = $request->query->get('url'); // <-- input non validé
Un attaquant pourrait appeler /fetch?url=http://169.254.169.254/latest/meta-data/ et accéder aux données internes du serveur cloud.
Corriger & se protéger
a) Valider l’URL et l’hôte
$url = $request->query->get('url');
if (!filter_var($url, FILTER_VALIDATE_URL))
{
return new Response('URL invalide', 400);
}
$host = parse_url($url, PHP_URL_HOST);
$allowlist = ['api.monsite.com'];
if (!in_array($host, $allowlist))
{
return new Response('Hôte non autorisé', 403);
}
b) Vérifier l’adresse IP résolue
$ip = gethostbyname($host);
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return new Response('IP interdite', 403);
}
c) Forcer un proxy de sortie
Configure ton HttpClient pour qu’il passe par un proxy filtrant, avec journalisation, timeout, et ACL.
Intégrer Artemis dans une CI
Voici quelques bonnes pratiques :
Automatiser l’analyse sur chaque pull request
Prioriser les alertes critiques (metadata services, intranet, etc.)
Compléter par du fuzzing, tests d’intégration, et WAF
Triage humain pour les cas ambigus
Check‑list sécurité Symfony
Valider les URL (format + domaine)
Vérifier l’IP et refuser les plages privées
Utiliser un proxy pour les requêtes externes
Monitorer les appels réseau
Lancer Artemis en CI
Pour aller plus loin
• Guide SSRF de l’OWASP
• Documentation Symfony HttpClient
• Le papier de recherche complet sur Artemis (à publier prochainement ?)
Conclusion
Artemis montre qu’avec une approche bien pensée — taint analysis, vérifications contextuelles, heuristiques — il est possible de sécuriser efficacement les applications PHP contre les SSRF.
Mais comme toujours : l’outil seul ne suffit pas. Combinez analyse statique, bonnes pratiques de validation, et tests dynamiques pour une défense en profondeur.