Liste-noire de fonctions : Suhosin VS PHP

suhosin

Depuis quelques années, le serveur web Apache intègre nativement un module de sécurité du nom de Suhosin.

Historiquement, le moteur de PHP dispose de nombreuses directives qui permettent d’augmenter sa sécurité. L’ensemble de ces directives se gère dans le php.ini. Au regard de la sécurité des serveurs web Apache, les directives intrinsèques à PHP qui étaient alors très utilisées sont :

  • Le Safe_mode : directive booléenne qui désactive (entre autres) un grand nombres de fonctions natives de PHP, jugées dangereuses. Cette directive est considérée obsolète depuis PHP 5.3.0 et a été supprimée dans la version 5.4.0.
  • La directive disable_functions, présente depuis PHP 4.3.2, qui permet de lister une série de fonctions à blacklister dans PHP, séparées par des virgules.

Du fait de l’obsolescence du Safe_mod de PHP, le module Suhosin a fait son apparition. Ce module permet des réglages de sécurité d’une toute autre finesse.

“What is Suhosin?

Suhosin is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination. The first part is a small patch against the PHP core, that implements a few low-level protections against bufferoverflows or format string vulnerabilities and the second part is a powerful PHP extension that implements all the other protections.

Unlike the PHP Hardening-Patch Suhosin is binary compatible to normal PHP installation, which means it is compatible to 3rd party binary extension like ZendOptimizer.”

Lorsque Suhosin est déployé dans un environnement web PHP, sa configuration se gère dans le fichier suhosin.ini généralement présent dans /etc/php5/<YOUR PHP INSTALLED MOD>/conf.d/suhosin.ini, où votre mode d’installation PHP peut être interne à Apache2, en mode CLI ou CGI.

Dans le cadre de déploiement d’application web sécurisée, SYNETIS est régulièrement amenée à renforcer la sécurité native d’un serveur Apache/PHP. Au travers de ce billet, nous faisons un retour d’expérience sur les différents mécanismes de blacklist de fonctions PHP avec la directive native du moteur ou via le module Suhosin.

La plupart des hébergeurs web mutualisés, et les serveurs web dédiés ne prenant pas la sécurité à la légère, activent les mécanismes de PHP et/ou Suhosin pour blinder leurs déploiements.

Il n’est pas rare d’observer des séries de fonctions PHP qui sont blacklistées sur ces environnements, notamment les fonctions jugées “à risque”, qui permettent l’obtention d’un shell sur le système par exemple. Parmi les fonctions jugées à risque, on peut citer :

Ces fonctions sont automatiquement confinées si le Safe_mod de PHP est activé. Toutefois, le Safe_mod qui est à présent obsolète, celles-ci sont à présent listées dans les listes noires.

Mais où blacklister ces fonctions? Deux choix sont disponibles :

  • Utiliser la directive native de PHP : disable_functions, bien que plus ancienne par rapport à Suhosin, c’est la technique à préconiser.
  • Utiliser la directive suhosin.executor.func.blacklist de Suhosin, qui hélas peut être bypassée et amener à la corruption du système.

SYNETIS, au cours de sa veille quotidienne, s’intéresse et réalise des PoC pour évaluer la sécurité réelle des mécanismes de sécurité généralement employés chez les clients et dans ses maquettes.

C’est au travers de cette veille qu’un PoC intéressant a été décellé par un contributeur. Une technique de bypass de la liste-noire des fonctions déclarées dans Suhosin a été publiée il y a quelques jours. Le contributeur de SYNETIS s’est empressé de validé la véracité de ce PoC tout en étendant sa portée à d’autres fonctions exploitables. Un article complet détaillant le PoC étendu et la manière de reproduire ces tests a été rédigé sur le site personnel du contributeur.

L’idée générale est d’exploiter les arguments de fonction de rappel (callback), présents dans un grand nombre de fonctions natives de PHP et qui ne sont pas jugées à risque. Ainsi, si la fonction “system()” de PHP, qui permet de récupérer un shell sur le serveur, est blacklistée par Suhosin, celle-ci est tout de même utilisable via un appel de callback.

Parmi les fonctions qui permettent de bypasser cette directive, on dénombre :

Le contributeur de SYNETIS a contacté le concepteur du patch Suhosin, Stefan Esser, particulièrement connu pour ses travaux lié à Apple. Après un échange de mail, il s’avère que cette vulnérabilité du module Suhosin est connue des développeurs et n’est pas liée au module en tant que tel mais au moteur PHP.

Le moteur PHP ne parvient pas à appeler le hook sécurisé des appels de fonctions internes (callback). Cette faiblesse est résolue dans la version 5.5 de PHP, qui n’est qu’en beta pour le moment. Stefan Esser a également précisé que les développements Suhosin sont un peu gelés en ce moment, mais qu’ils reprendront courant mai 2013.

En conclusion, il est préférable d’employer la directive historique de PHP (disable_functions) pour blacklister celles jugées dangereuses, plutôt que la directive suhosin.executor.func.blacklist, qui est aisément bypassée.

Malgré le caractère beaucoup plus récent et interne à un module de référence en sécurité PHP, la directive de Suhosin ne sera pas considérée comme sécurisée avant PHP 5.5. Nous vous sensibilisons donc à ne pas l’exploiter avant cette future version.

Sources & ressources :

Yann CAM

Consultant Sécurité