Hervé Godquin

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 23 janvier 2020

Nouvelles vulnérabilités dans PHP

Deux nouvelles vulnérabilités semblent toucher PHP.

Voici l'advisory du CERT-FR : https://www.cert.ssi.gouv.fr/avis/CERTFR-2020-AVI-054/

Il semble qu'une des vulnérabilités touche mbstring et notamment la fonction mb_decode_mimeheader qui sert à décoer des en-tête MIME  : https://www.php.net/manual/fr/function.mb-decode-mimeheader.php.

Cette librairie fait partie de l'extension mbstring.

La librairie touchée semble être la libmbfl dans la fonction : mbfl_filt_conv_big5_wchar(int c, mbfl_convert_filter *filter).

Quand on regarde la pile d'exécution on peut voir que le chemin est le suivant (dans mbstring) :

mb_decode_mimeheader() -> mbfl_mime_header_decode() -> mime_header_decoder_collector() -> mbfl_filt_conv_qprintdec() -> mbfl_filter_output_pipe() -> mbfl_filt_conv_big5_wchar()

Autant vous dire que si vous cherchez à trouver cette vulnérabilité en faisant de l'analyse de code "à la mano" vous n'avez pas le cul sorti des ronces :)

Alors cette vulnérabilité a été trouvé comment ? Fuzzing ... Par reza : reza at iseclab dot org.

Vous pouvez tester si vous êtes vulnérables en faisant ceci :

./php -r 'mb_decode_mimeheader(file_get_contents("php://stdin"));' < global-overflow-cp950_pua_tbl.poc

Le fichier PoC est disponible ici : https://github.com/gaintcome/fuzz-php/blob/master/poc/mbstrings/global-overflow-cp950_pua_tbl.poc

(Au cas ou cela disparaîtrait j'en ai mis une copie ici : https://www.paranoiac-thoughts.com/netpsycho/public-scripts-and-confs/blob/master/global-overflow-cp950_pua_tbl.poc)

Pour voir la correction du la vulnérabilité : http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/mbstring/libmbfl/filters/mbfilter_big5.c;h=5e1ca815da31ed68db2baae2b3d38699b546ca83;hp=f5ab8809ce8a799bd40bda74606f181fcef36c75;hb=2bcbc95f033c31b00595ed39f79c3a99b4ed0501;hpb=0f79b1bf301f455967676b5129240140c5c45b09

Alors pourquoi j'en parle : sérieusement le contrôle de MIME c'est courant, surtout dans les fonctionnalités d'upload, donc y a moyen de se faire plaisir.

De même, c'est vrai que PHP reste vaste (et inexploré ???) c'est donc une bonne piste pour s'entraîner au fuzzing et trouver des petites vulns :).

Have fun !

Comme d'habitude vous pouvez proposer des améliorations à cet article via : https://www.paranoiac-thoughts.com/netpsycho/blog_post/blob/master/20200123_nouvelles_vulnerabilites_php

dimanche 22 septembre 2019

Quelques nouvelles vulnérabilités dans PHP

Récemment quelques vulnérabilités ont été découvertes dans PHP.

Toutes concernent le traitement des images, j'ai néanmoins choisi de montrer l'une d'entre elle car c'est comment dire ... un classique au final.

Voici le code vulnérable :

                                                       if (*(p1 + 1) == '=') {

                                                                ++p1;

                                                                --str_left;

                                                        }

 

                                                        err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);

On voit tout de suite le problème ... que se passe-t-il si str_left = 0 ? ... forcément quelque chose de pas très bien, on le devine aisément.

Le problème est que str_left est un unsigned integer. Et ce vulnérabilité est comprise dans une boucle for qui en fin de boucle refait un str_left-- ... nous avons donc un énorme entier par la suite.

Et quand dans cette boucle nous avons des opérations de lecture nous nous retrouvons donc bien face à un : "Out-of-bounds read due to integer overflow".

La correction est assez simple :

                                                        * we can do at this point. */

                                                        if (*(p1 + 1) == '=') {

                                                                ++p1;

-                                                               --str_left;

+                                                               if (str_left > 1) {

+                                                                       --str_left;

+                                                               }

                                                        }

 

                                                        err = _php_iconv_appendl(pretval, encoded_word, (size_t)((p1 + 1) - encoded_word), cd_pl);

Pour plus d'informations : https://bugs.php.net/bug.php?id=78069

Concernant les autres vulnérabilités dans PHP : 

https://bugs.php.net/bug.php?id=77950

https://bugs.php.net/bug.php?id=77988

https://bugs.php.net/bug.php?id=78222

https://bugs.php.net/bug.php?id=78256

 

A vos patchs !