
Analyse technique de CVE-2017-0037, une vulnérabilité de corruption mémoire du navigateur Microsoft permettant l'exécution de code à distance via une confusion de type dans le traitement CSS/JS, avec les détails de l'exploit PoC et les stratégies d'atténuation.
CVE-2017-0037 (Vulnérabilité de corruption de la mémoire du navigateur Microsoft)
Ce document concerne CVE-2017-0037- Vulnérabilité de corruption de la mémoire du navigateur Microsoft. Il présentera d'abord ce qu'est une Exécution de code à distance (RCE) puis abordera quelques détails techniques.
Qu'est-ce que l'Exécution de code à distance ?
Une cyberattaque dans laquelle un attaquant peut exécuter des commandes à distance sur un autre ordinateur est appelée exécution de code à distance. Les exécutions de code à distance (RCE) sont le plus souvent causées par un logiciel malveillant téléchargé par l'hôte et peuvent survenir indépendamment de l'emplacement du système.
Pour réaliser une RCE, les méthodes suivantes peuvent être utilisées :
Attaques par injection : Ici, l'attaquant fournit une entrée erronée avec l'intention qu'une partie de celle-ci soit traitée comme faisant partie de la commande.
Attaques par désérialisation : Le programme de désérialisation peut lire une entrée utilisateur soigneusement formulée dans les données sérialisées comme du code exécutable.
Écriture hors limites : Un attaquant peut être en mesure de construire une entrée qui dépasse le tampon alloué si l'allocation mémoire est mal faite. Comme le code exécutable est également stocké en mémoire, le programme peut exécuter des données fournies par l'utilisateur si elles sont écrites au bon endroit.
Attaque par confusion de type : Il existe une menace de confusion de type lorsqu'un code source ne prend aucune mesure pour vérifier l'authenticité d'une entité qui lui est fournie. Parce que la confusion de type permet à un pirate d'introduire clandestinement du code pouvant exécuter des instructions aléatoires simplement en provoquant un décalage dans les types d'objets, c'est risqué.
Exécution d'une attaque RCE
Une séquence d'attaque RCE est simple à réaliser. D'abord, l'acteur malveillant cherche sur Internet des vulnérabilités courantes qui peuvent être exploitées pour une attaque efficace. Après avoir identifié une vulnérabilité particulière, le pirate utilise l'exploit pour obtenir un accès. Maintenant qu'il a obtenu l'accès, il peut utiliser le script malveillant pour atteindre ses objectifs, qui incluent l'exfiltration de données, le blanchiment d'argent, la surveillance complète et la perturbation de service.
Le langage de l'application cible est fréquemment utilisé pour injecter du code. Le langage est ensuite exécuté par le processeur côté serveur. Python, Java, Perl, Ruby et PHP sont des langages de programmation courants. L'injection de code est courante sur les plateformes qui analysent immédiatement des entrées non vérifiées. Les applications en ligne publiques sont, en effet, une cible majeure pour les pirates.
Le script malveillant est généralement exécuté par des scripts bash. Un script bash est un document texte qui contient des commandes qui seraient normalement tapées dans l'invite de commande. Les scripts bash permettent aux commandes incluses de fonctionner correctement. Il est d'usage d'y ajouter l'extension ".sh", bien que ce ne soit pas obligatoire. Après avoir préparé le paquet, le pirate place le code dans une application vulnérable, qui l'exécute alors. L'application peut également donner une instruction au noyau pour l'exécuter.
Métriques de l'attaque
L'image suivante se concentre sur les métriques de score de base de CVE-2017-0037 .

Le score CVSS ici est 8.1 (élevé).
Vecteur d'attaque - Le composant vulnérable ici est lié à la pile réseau, et la gamme de pirates potentiels inclut tout, depuis les autres alternatives mentionnées jusqu'à l'ensemble d'Internet.
La Complexité de l'attaque de cette vulnérabilité est élevée, c'est-à-dire que le succès d'une attaque dépend de circonstances hors du contrôle de l'attaquant. Ainsi, une attaque ne peut être menée à volonté, mais nécessite plutôt que l'attaquant consacre un niveau de travail significatif dans la planification ou la mise en œuvre contre l'élément vulnérable avant de pouvoir être considérée comme efficace.
La valeur de Confidentialité ici est élevée, ce qui signifie une perte totale de confidentialité, permettant à l'attaquant d'accéder à toutes les ressources à l'intérieur du composant endommagé.
L'Intégrité est élevée, ce qui signifie une perte grave d'intégrité et de protection.
La Disponibilité est élevée, ce qui signifie une perte totale de disponibilité, permettant à l'attaquant d'interdire complètement l'accès aux ressources du composant affecté.
Détails de l'attaque
La vulnérabilité CVE-2017-0037 était un défaut de confusion de type présent dans Microsoft Edge et Internet Explorer 10 et 11. Elle permettait aux attaquants d'exécuter du code à distance sur la machine cible lorsque l'utilisateur visitait un site Web malveillant.
Le défaut a été signalé par le chercheur de Google Ivan Frantic et les détails de la vulnérabilité ont été publiés par Google car Microsoft n'a pas pu le corriger dans son délai de divulgation de 90 jours.

L'exploit proof-of-concept (PoC) publié par le chercheur révèle qu'il peut faire planter Edge et IE, permettant à un attaquant d'exécuter du code à distance et d'obtenir les privilèges d'administrateur du système compromis. Il a également confirmé que l'attaque fonctionnait sur la version 64 bits d'Internet Explorer sous Windows Server 2012 R2 et qu'elle affectait IE 11 32 bits ainsi que Microsoft Edge.
La confusion de type se trouve dans la fonction Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElemnt dans mshtml.dll. En exécutant du code arbitraire à distance, via des vecteurs impliquant une séquence de jetons Cascading Style Sheets (CSS) et du code JavaScript conçu pour opérer sur un élément TH, l'attaque peut se produire.
Le PoC par Ivan Fratric de Google Project Zero

Comme indiqué par le chercheur Ivan Frantic, le PoC plante dans MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement lors de la lecture à l'adresse 0000007800000070.


En analysant le code autour du point du plantage, on peut observer qu'à l'adresse mémoire 00007ffe`8f330a51, le contenu du registre rbp est lu dans le registre rcx. Ensuite, l'appel à MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable attribue une valeur à rax (c'est un registre désigné pour stocker les valeurs de retour des fonctions).
Bien que rcx soit censé pointer vers un autre type d'objet, dans le PoC comme montré ci-dessus, il pointe vers un tableau d'entiers 32 bits alloué dans Array<Math::SLayoutMeasure>::Create. Les décalages des colonnes du tableau sont stockés dans ce tableau et un attaquant peut en prendre le contrôle. Le plantage se produit à 00007ffe`8f330a59 car rax pointe vers une mémoire non initialisée. rax stocke la valeur de retour de la fonction MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable qui n'est pas une adresse mémoire initialisée. L'attaquant peut faire pointer rax vers un emplacement mémoire qu'il peut contrôler. L'attaquant peut modifier les propriétés du tableau telles que l'espacement des bordures (border-spacing) et la largeur du premier élément TH pour prendre le contrôle de rax.

Si l'attaquant parvient à prendre le contrôle de rax à la ligne 00007ffe`8f330a59, la fonction MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable est appelée à nouveau à la ligne 00007ffe`8f330a5d 743d avec les mêmes arguments et un saut vers une adresse plus élevée. Ensuite, à travers une série de différences commençant par rax, un pointeur de fonction pourrait être obtenu et stocké dans rdi. Si l'attaquant pouvait passer une vérification CFG sur ce pointeur de fonction, le pointeur de fonction contrôlé par l'attaquant serait appelé à la ligne 00007ffe`8f330a80.
Correctif probable du bogue
Comme suggéré par Ivan Fratric, la raison derrière l'apparition de la confusion de type doit d'abord être détectée. Selon son hypothèse, deux types de colonnes existent dans le DOM : les colonnes de tableau HTML et les colonnes CSS. IE/Edge confondait les deux. Donc, si une vérification de type était ajoutée quelque part dans la fonction vulnérable, cela aurait pu résoudre le problème.
Liens utiles
Impacts d'une attaque RCE
Accès initial : Les attaquants peuvent l'utiliser pour prendre le contrôle d'un appareil et installer des logiciels malveillants ou atteindre d'autres objectifs.
Divulgation d'informations : Les attaques RCE aident à installer des logiciels malveillants voleurs d'informations ou à exécuter des commandes qui collectent et volent des données depuis l'appareil affecté.
Déni de service : Une faille RCE permet aux pirates d'exécuter du code sur la machine qui héberge l'application affectée et donc de perturber son fonctionnement ainsi que celui d'autres programmes du système.
Cryptominage : Les logiciels malveillants de cryptominage sont fréquemment déployés et exécutés sur les appareils vulnérables.
Rançongiciel : Un rançongiciel est un type de logiciel qui empêche un utilisateur d'accéder à ses fichiers à moins de payer une rançon.
Moyens d'atténuer les attaques RCE
Le contrôle des débordements de tampon peut être utilisé pour atténuer les attaques RCE.
Les listes de contrôle d'accès sont utiles pour limiter les privilèges des utilisateurs et, par conséquent, limiter les capacités d'un attaquant s'il prend le contrôle d'un compte utilisateur.
Le trafic réseau doit être surveillé pour détecter tout contenu potentiellement malveillant en plus de la surveillance des points de terminaison.
Utiliser l'assainissement des entrées, qui est le processus de nettoyage et de filtrage des entrées de l'utilisateur pour les empêcher d'être utilisées pour exploiter des failles de sécurité.
Références