La méthode est un peu « rustre », très système et réseau et pas réellement dans les méthodes des développeurs mais parfois, elle peut faire gagner un temps phénoménale…
Mais de quoi il parle…?
Appliquer une modification dans des pages de code. Par exemple remplacer un mot par un autre ou même appliquer le patch de Gabriel contre les XSS de Magento super rapidement dans tout le code de Magento. Si si c’est possible, Adrien (un collègue en charge des infrastructures Magento), nous offre un peu de ligne de commande qui colle aux dents mais qui rend bien service. Bon, vous avez besoin d’un shell sous unix avec des droits décents et quelques utilitaires qui sont installés par défaut sous presque tous les BSD et Linux. (Avec la remise en forme du texte par WordPress, je ne sais pas si ca se copie/collera correctement, mais voici les synthaxes, les quotes ‘ vont probablement mal passer en CTRL C/CTRL V)
find /var/www/htdocs -type f -print0 | xargs -r -0 sed SED_EXPRESSION
On va chercher avec la commande « find » dans le répertoire qui nous intéresse (ici /var/www/htdocs), les fichers uniquement et envoyer tout cela à « sed ». Pour ceux qui ne sont pas familier de la ligne de commande unix et de bash en général, c’est un peu abstrait, ca fait peut mais c’est pas bien méchant. (pour les connaisseurs, on pourrait aussi utiliser –exec) Il faut découper :
find /var/www/htdocs -type f -print0
touve moi tous les fichiers dans le répertoire /var/www/htdocs et ses sous directory et affiche le résultat.
| (prononcer païpe, comme un tuyau en anglais)
et passe le résultat de tes recherches (donc la liste de tous les fichiers) à :
xargs -r -0
qui est un programme qui reformatte les lignes de commandes (en l’occurence pour son copain sed)
sed SED_EXPRESSION
et lance sed avec l’expression qui va bien, sans effectuer les modifications (il faut ajouter -i pour cela)
Justement… L’expression. C’est là que se situe la magie de ces syntaxes de barbares. Car avec la bonne expression, on va appliquer un traitement à tous les fichiers !!! Si on trouve l’expression cherché, on va la remplacer par une autre, c’est ca le boulot de sed. On cherche et on remplace avec ce que l’on appel une Regexp (pour régular expression), c’est une grammaire descriptive pour décrire une chaine de caractère. Je n’ai pas réellement le temps de vous l’expliquer en détail, googlez un peu et vous trouverez.
Allez, on applique le patch de Gabriel à tout ce qui ressemble de prêt ou de loin à un retour d’erreur non filtrée.
si on cherche ça : « <?php echo $* ?> » et qu’on veut le remplacer par ça : « <?php echo htmlentities($*) ?>«
l’expression c’est ça : ‘s/<?php echo $\([a-zA-Z0-9_]\+\) ?>/<?php echo htmlentities($\1) ?>/g’
(et on ne touche pas à *, en gros au nom de la variable)
donc sed 's/<?php echo $\([a-zA-Z0-9_]\+\) ?>/<?php echo htmlentities($\1) ?>/g' ou si on réinsère ca dans notre recherche avec find :
find /var/www/htdocs -type f -print0 | xargs -r -0 sed ‘s/<?php echo $\([a-zA-Z0-9_]\+\) ?>/<?php echo htmlentities($\1) ?>/g’
Le petit inconvénient, c’est que la synthaxe est stricte, à l’espace pret. Donc si c’est écrit différemment à deux endroits du code, ca ne remplacera pas tout. Deuxième chose, si le paramètre remplacé est un tableau ou une fonction, la synthaxe sera peut être différente. Pour ne pas avoir de doute, on peut utiliser ou grep -ro pour vérifier avant que tout est bon, ceci affichera ce qui va être traiter avant de faire quoique ce soit :
grep -hro ‘<?php echo $\([a-zA-Z0-9_]\+\) ?>’ /var/www/htdocs
Pour le cas de l’url du downloader (le XSS en GET pas beau) voici la synthaxe sed :
find /var/www/htdocs -type f -print0 | xargs -r -0 sed ‘s/\$this->set(‘return_url’, \$_GET[[]‘return’[]])/\$this->set(‘return_url’, htmlentities(\$_GET['return']));/‘
Et vous savez quoi ?
L’inconvénient, c’est que le patch de Gabriel est efficace mais il n’est pas persistent (lorsque vous mettrez à jour Magento, les correctifs vont sauter alors que Varien n’aura peut être pas patché les vulnérabilité.
Le deuxième défaut, c’est que seul 3 failles ont été révélées, si ca se trouve, il en existe d’autres.
La bonne nouvelle c’est que la méthode de bourrin proposée, elle ne fait pas de quartier. Elle trouve, elle remplace que ce soit sur les fichiers et failles identifié ou non. Elle vous remplacera donc potentiellement aussi des failles non encore dévoilées
Deuxième avantage, si vous montez de version, vous pouvez relancer la même commande, elle refera le boulot sans que vous ayez à éditer quoique ce soit. Vu le rythme de publication des versions de Magento, ca peut être confortable.
Merci à Adrien pour les regexp
Commentaires récents