SecurityInsider
Le blog des experts sécurité Wavestone

Bilan de la compétition Pwn2Own 2015



La compétition Pwn2Own est une compétition de hacking sponsorisée par la Zero Day Initiative de HP et le projet Zero de Google, au sein du cycle de conférences de sécurité CanSecWest. Au cours de cette compétition, des chercheurs peuvent tenter de découvrir des vulnérabilités dans les principaux navigateurs web, ainsi que Adobe Reader, Adobe Flash et Windows. À la clé, des récompenses élevées :
  • Google Chrome (64-bit) : 75 000$
  • Microsoft Internet Explorer 11 (64-bit avec le module Enhanced Protected Mode) : 65 000$
  • Apple Safari (64-bit) : 50 000$
  • Mozilla Firefox : 30 000$
  • Adobe Reader dans Internet Explorer 11 (64-bit avec le module Enhanced Protected Mode) : 60 000$
  • Adobe Flash (64-bit) dans Internet Explorer 11 (64-bit avec le module Enhanced Protected Mode) : 60 000$
  • Microsoft Windows (64 bit avec le module EMET) : 25 000$
Les vulnérabilités identifiées dans le cadre de cette compétition sont signalées aux éditeurs de ces logiciels afin qu’ils puissent les corriger.
Le bilan de cette édition (18 et 19 mars 2015) a été lourd pour l’ensemble des logiciels ciblés : un total de 557 500$ a été versé aux chercheurs en récompense pour les vulnérabilités identifiées. 
Il s’agit de :
  • 5 vulnérabilités dans Microsoft Windows
  • 4 vulnérabilités dans Internet Explorer 11
  • 3 vulnérabilités dans Mozilla Firefox
  • 3 vulnérabilités dans Adobe Reader
  • 3 vulnérabilités dans Adobe Flash
  • 2 vulnérabilités dans Apple Safari
  • 1 vulnérabilité dans Google Chrome

Premier jour

Zeguang Zhao (équipe Team509) et Peter, Jihui Lu, et wushi (équipe KeenTeam) ont découvert une première vulnérabilité dans Flash en trouvant un moyen d’exécuter du code arbitraire à distance grâce à un débordement de mémoire. Ils ont poursuivi en réalisant une élévation de privilèges au niveau SYSTEM dans Windows en exploitant une vulnérabilité du kernel grâce aux TrueTypeFonts (TTF) et en contournant les protections EMET.
Nicolas Joly, chercheur français, a poursuivi en découvrant trois vulnérabilités, une dans Flash et deux dans Adobe Reader. La vulnérabilité dans Flash consiste en une exécution de code à distance grâce à l’exploitation d’une vulnérabilité Use-After-Free (UAF). Elle est combinée à une vulnérabilité d’évasion de la sandbox Flash grâce à un directory traversal.
Les deux vulnérabilités dans Adobe Reader consistent en un débordement de mémoire tampon permettant de la divulgation d’informations et un débordement de mémoire tampon permettant une exécution de code à distance.
Ensuite, Peter, Jihui Lu, Wen Xu et wushi (équipe KeenTeam) et Jun Mao (équipe Tencent PCMgr) ont dévoilé une vulnérabilité dans Adobe Reader exploitant un débordement d’entier et ont élevé leurs privilèges au niveau SYSTEM grâce à une deuxième vulnérabilité TTF.
Mariusz Mlynski a identifié une vulnérabilité liée au contournement de la same-origin policy dans Mozilla Firefox en exploitant une vulnérabilité dans le traitement des fichiers SVG.
Enfin, l’équipe 360Vulcan a compromis Internet Explorer 11 grâce en exploitant de la mémoire non initialisée, permettant une exécution de code.

Deuxième jour

Le chercheur en sécurité « ilxu1a » a divulgué une vulnérabilité dans l’implémentation de la vérification des bornes d’un tableau en JavaScript. Cette vulnérabilité peut être exploitée pour lire et écrire dans la mémoire, permettant ainsi de l’exécution de code arbitraire.
Le coréen JungHoon Lee (lokihardt) a présenté plusieurs exploits sur Internet Explorer, Chrome, Windows et Safari. La vulnérabilité sur Internet Explorer est de type time-of-check to time-of-use (TOCTOU) qui permet d’obtenir des privilèges en lecture et écriture. Il s’est évadé de la sandbox d’Internet Explorer grâce à une injection JavaScript.
Il a ensuite présenté une vulnérabilité race condition menant à un débordement de mémoire tampon dans Chrome. Cette attaque combinée à une fuite d’information d’un pilote Windows et une race condition dans un autre pilote Windows lui a permis d’obtenir les privilèges SYSTEM.
Enfin, il a présenté une vulnérabilité Use-After-Free (UAF) dans un pointeur de pile non initialisé dans Safari lui permettant de contourner la sandbox du navigateur, ce qui mène à une exécution de code arbitraire.

Quel bilan tirer de cette compétition ?

Tous les navigateurs et logiciels ciblés ont été compromis par les attaques divulguées à la compétition Pwn2Own. Cependant, bien que ces vulnérabilités soient critiques et nécessitent une correction au plus vite, il s’agit de vulnérabilités faisant l’objet de dizaines voire centaines d’heures de recherche sur ces logiciels spécifiques.
Les vulnérabilités présentées par les chercheurs ont été divulguées exclusivement aux éditeurs de ces logiciels afin qu’elles soient corrigées au plus vite. Pour le moment seul Mozilla a corrigé les vulnérabilités en publiant la version 36.0.4 de Firefox [1][2].
Les logiciels ont donc été compromis par les meilleurs chercheurs en sécurité au monde, mais dans le but de les améliorer sur le long terme et d’apporter une sécurité accrue pour l’ensemble de leurs utilisateurs.
[1] https://www.mozilla.org/en-US/security/advisories/mfsa2015-28/
[2] https://www.mozilla.org/en-US/security/advisories/mfsa2015-29/

Focus sur la vulnérabilité Use-After-Free (UAF)

Une vulnérabilité UAF est une faille de corruption de la mémoire qui peut être exploitée pour induire des comportements non souhaités dans une application (crash, exécution de code, etc.)
Cette vulnérabilité repose sur la présence d’un objet vers lequel un pointeur est défini dans le code de l’application. Une section du code de l’application indique que la pile contenant l’objet n’est plus utilisée. Une autre section de code fait ensuite appel au pointeur vers cet objet : l’objet n’existant plus l’appel est fait à une section de la pile non initialisée. Si un attaquant remplit cette section non initialisée par des données qu’il maîtrise, il peut exécuter une commande arbitraire.

1) Exemple d’exploitation grâce aux fonctions virtuelles

Cette vulnérabilité peut être exploitée grâce aux fonctions virtuelles en C++. Considérons par exemple la classe C++ suivante :
class Class_A
{
int membre_de_A;
public:
virtual long vfunc_A1();
virtual long vfunc_A2();
static void sfunc_A();
void funcA();
};

Sa représentation peut être vue avec le diagramme suivant :

Le premier DWORD de l’instance de la Class_A est un pointeur vers sa VFTABLE (Virtual Function Table). Le reste de la mémoire de cette instance contient ses attributs.

2) Notion de VFTABLE

La VFTABLE est un tableau de pointeurs vers les fonctions virtuelles de la classe. La VFTABLE est contenue dans chaque instance de la classe par opposition aux fonctions statiques ou aux méthodes standard qui sont contenues à un même emplacement pour toutes les instances d’une classe.

3) Réalisation d’un appel de méthode en assembleur

Lors de l’appel d’une fonction virtuelle, le code assembleur calcule l’emplacement de cette fonction grâce à la VFTABLE de cet objet, puis l’appelle.
Une représentation de cet appel peut être le code assembleur suivant :
MOV ECX, [Adresse de l’objet];
MOV EAX, [ECX];
CALL [EAX + 8];
La première ligne affecte à ECX l’adresse de l’instance. La deuxième ligne affecte à EAX la valeur de [ECX] qui est le premier DWORD de ECX, c’est-à-dire la VFTABLE. La troisième ligne appelle [EAX + OFFSET], c’est-à-dire l’emplacement relatif de la fonction à exécuter dans la VFTABLE. Dans l’exemple ci-dessus (EAX+8), c’est la troisième fonction qui va être appelée.

4) Exploitation de la vulnérabilité

Le principe de base de l’exploitation est de remplir la pile de l’ancien objet avec des données malveillantes. La figure suivante illustre l’exécution de code malveillant par l’application.

Afin d’exploiter la vulnérabilité, la première étape est de remplir le contenu de la pile à l’emplacement de l’ancien objet, en inscrivant sur le premier DWORD une adresse vers la VFTABLE de cet objet, et en inscrivant sur le reste des données de cet objet un shellcode qui va être exécuté.
Le pointeur VFTABLE pointe vers un emplacement de la pile choisi de telle sorte que le EAX+OFFSET appelé par l’application pointe vers un emplacement CALL ou JMP ECX. Pour cela, il est possible par exemple de trouver un emplacement arbitraire dans la pile qui contient un CALL ou JMP vers ECX et de faire pointer le pointer VFTABLE vers cette valeur moins l’OFFSET.
Une fois cette configuration atteinte, il n’y a qu’à attendre que l’application exécute la fonction ciblée de notre objet n’existant plus. Cet appel réalisera une exécution du shellcode arbitraire injecté.

Cyprien OGER

Aucun commentaire:

Enregistrer un commentaire