Limites du "Safe mode" de PHP
Date : 06 Juillet 2005
PHP est un langage couramment utilisé pour développer des pages Web dynamiques. Il s'agit d'une technologie "Server-side", c'est-à-dire que le code PHP placé dans une page Web (sous forme de tags HTML) est exécuté par le serveur Web, et c'est le résultat de cette exécution qui est renvoyé à l'internaute consultant la page Web. Pour sécuriser son fonctionnement, PHP dispose d'une directive de configuration appelée "Safe mode". Dans ce mode, PHP refuse d'effectuer certains types d'actions jugées dangereuses (par exemple le lancement de commandes du système d'exploitation, ou l'accès à certains fichiers de l'arborescence). Pour renforcer la sécurité, de nombreux sites développés en PHP activent cette fonctionnalité.
Des discussions récentes dans les forums sécurité (cf. URL donnée en fin d'article) montrent que ce mécanisme PHP n'est pas une panacée. L'exemple mis en exergue lors de ces discussions est le cas (très classique) où un site PHP utilise une base de données MySQL. Comme il existe une fonctionnalité MySQL d'initialisation de table (au sens base de données) à partir d'un fichier, il est en effet théoriquement possible de contourner l'interdiction d'accès à un fichier au niveau PHP (fonctionnalité de l'option "Safe mode") en demandant à MySQL :
- de créer une table avec le contenu de ce fichier,
- puis de visualiser le contenu de cette table.
Il est clair en effet, que si l'option "Safe mode" de PHP empêche effectivement à un script PHP d'accéder à certains fichiers, elle n'a cependant aucun effet sur les actions entreprises par MySQL, même si MySQL est invoqué par un script PHP.
Cet exemple de contournement du "Safe mode" PHP au moyen de MySQL est en fait tout à fait hypothétique. Il suppose en effet que l'internaute attaquant:
- soit autorisé au niveau MySQL à lire des fichiers et à créer de nouvelles tables,
- et exploite une vulnérabilité de type "SQL injection" lui permettant d'exécuter une requête SQL arbitraire.
Cependant, cet exemple montre bien la nécessité de sécuriser chacun des composants d'une application. Ainsi, même si l'option "Safe mode" de PHP est une mesure souhaitable d'un point de vue sécurité, elle ne suffit pas à sécuriser l'ensemble du site Web.
Pour plus d'information
Le chapitre "Safe Mode" du manuel PHP : http://www.php.net/manual/en/features.safe-mode.php
Avis de sécurité sur le contournement de PHP "Safe mode" : http://www.securiteam.com/exploits/5LP03156AC.html