La fonction is_executable de PHP permet de savoir si un fichier est exécutable.
Mais le champ d’action de la fonction est limité à l’open_basedir (liste des chemins accessible à PHP en récursif) uniquement.
Or, les binaires (fichiers exécutables justement) sont en général stockés à part, dans le dossier /home/WwwBSD/modules par exemple sur notre plateforme mutualisée, ou dans un répertoire cgi-bin, etc.
Pour sécuriser PHP, on définit pour le restreindre un répertoire spécifique pouvant seul contenir des fichiers exécutables autorisés, et pour être vraiment sécurisé dans un environnement mutualisé, ces fichiers sont mis en place et maintenus par l’opérateur système lui même (l’hébergeur).
Son emplacement est défini par le safe_mode_exec_dir.
Ainsi, on peut exécuter des binaires (cryptage/décryptage ATOS, etc.) tout en maintenant l’environnement sécurisé (safe_mode actif, etc.).
Or la fonction is_executable de PHP ne peut pas atteindre le répertoire du safe_mode_exec_dir et il n’est donc pas possible de savoir si un fichier du répertoire qui est prévu pour stocker les binaires est exécutable…
Autant dire que la fonction perd tout son intérêt…
Le bug est entre les mains de la fondation PHP depuis 2005, sans solution pour l’instant dans les versions officielles, malgré une intégration dans CVS.
Le lien vers le bug : https://bugs.php.net/bug.php?id=29840