Hardened-PHP, développeur d'une version sécurisée publie dans son alerte une série de failles et notamment :
- CAN-2004-1018 : La fonction pack() ne
valide pas correctement ses arguments ce qui peut conduire à un
débordement d’entier qui aboutit à un dépassement de tampon dans le
tas. Un attaquant peut alors exécuter du code arbitraire avec les
droits du serveur WEB.
La fonction unpack() comporte la même faille et permet ainsi une fuite
d'information du contenu de la mémoire du processus apache.
- CAN-2004-1063 : Le safe_mode PHP permet de restreindre l'exécution de
binaires à un répertoire spécifié par le paramètre safe_mode_exec_dir.
Il est cependant possible de contourner cette restriction en injectant des commandes shell dans le nom de répertoire courant.
- CAN-2004-1064 : Le safe_mode PHP contrôle le chemin des fichiers
ouverts ; lors de ce contrôle il tronque les chemins trop longs
(>MAXPATHLEN).
Si un script utilise une inclusion tel que : include
"modules/$userinput/config.inc.php"; il est possible de tromper le
safe_mode, en fournissant un chemin trop long. Il sera alors troqué et
passera les tests du safe_mode alors qu’en réalité, ce chemin pointe
vers un fichier normalement pas accessible.
- CAN-2004-1019 : La fonction unserialize() peut être détournée afin de
libérer arbitrairement un bloc de mémoire conduisant ainsi à
l'exécution de code avec les droits du serveur WEB.
Cette vulnérabilité est d'autant plus dangereuse que les scripts PHP,
utilisant la fonction unserialize() avec pour paramètre une entrée
directement fournie par l'utilisateur, sont très courant.
Par exemple :
- phpBB2
- Invision Board
- vBulletin
- ...
Découvertes
le 15 décembre, les failles ont été corrigées le jour même.
Elles affectent PHP 4.3.9 et les versions antérieures qui doivent
donc être remplacées par la mouture 4.3.10. Même chose pour
PHP 5.0.2 et ses versions antérieures, qu'il faut donc faire évoluer
vers PHP 5.0.3. Toutes deux sont disponibles en téléchargementNote : Nota bene :
NPDS n'utilise pas la fonction
pack, unpack et unserialize() et les includes sont largements filtrés ...