2008 avr. 18
Par Olivier - Développement - Lien permanent
La mise à jour de sécurité Dotclear 1.2.8 peut vous amener à vous poser la question de Dotclear 2. N'est-il pas vulnérable au même problème ?
Le gestionnaire de média de Dotclear 2 permet d'envoyer n'importe quel fichier (ou presque). On estime donc que l'utilisateur a pris ses dispositions afin que les fichiers ".php" soient affichés en text/plain et pas interprétés. Par exemple, votre configuration Apache peut contenir quelque chose comme :
<Location ~ "public/.*\.php$"> ForceType text/plain </Location>
Ce n'est qu'un exemple d'une configuration très simple avec un dossier nommé "public" pour les fichiers du gestionnaire de média.
Ceci étant, il est maintenant possible depuis la révision 1714 de spécifier une expression rationnelle pour les fichiers non autorisés dans le gestionnaire de média. Dans votre module "about:config", vous trouverez un champs "media_exclusion". Si vous voulez interdire le dépôt de tous les fichiers .php, vous indiquez dans le champs : /\.php$/i. Si, pour cause de possession démoniaque, vous voulez interdire l'envoi de fichiers gif, jpg et png, vous indiquez : /\.(gif|png|jp(e?)g)/i.
Exceptionnellement, la révision 1714 est déjà dans les nightly :)
Commentaires
Visiblement, une stratégie de blacklist a été retenue, pourquoi pas une whitelist plutôt ? N'autoriser que les extensions de fichier choisies par l'utilisateur me semblerait une approche plus saine de la sécurité à ce niveau (mieux, une approche par mime types)
C'est une regexp, donc il est parfaitement possible de nier la négation :)
/(?<!\.(png|jpg))$/i permet de n'autoriser que les fichiers png et jpg
Je viens de faire un svn co mais je n'ai pas de champs "media_exclusion"... C'est normal ?
Olivier (auteur du #1),
Les expressions rationnelles prévoient les assertions négatives qui permettent de créer une whitelist dans ce cas-là. Par exemple, pour interdire tous les fichiers sauf les images GIF, JPEG et PNG, tu peux écrire :
/^(?>.*)(?<!\.gif|\.jpg|\.jpeg|\.png)/i
Ah, bizarre, j'avais consulté aujourd'hui la page et je n'ai pas vu les nouveaux commentaires. :/
Faut rajouter "RemoveHandler php" dans le fichier de conf d'apache. Ce qui devient :
<Location ~ "public/.*\.php$">
RemoveHandler php
ForceType text/plain
</Location>
Oui oui, avec un PHP en CGI. Même qu'avec lighttpd, il ne faut pas faire la même chose...
est-ce que ça permet aussi de bloquer un fichier .htaccess ?
Olivier G. Oui :)
/^(?>.*)(?<!\.gif|\.jpg|\.jpeg|\.png|\.htaccess)/i
Tous les fichiers commençant par un point sont exclus par défaut.