Une vulnérabilité découverte sur Microsoft Visual Studio sur le langage C++

Date de publication :

En octobre 2018, le développeur de Zero Day Initiative Simon Zuckerbraun a adressé à Microsoft un rapport de vulnérabilité affectant le compilateur Visual C++. Microsoft Visual Studio est un environnement de développement intégré (IDE) supportant 36 langages de programmation différents. Il est utilisé pour développer des programmes informatiques, ainsi que des sites Web, des applications Web, des services Web et des applications mobiles.

Zero Day Initiative propose un programme de récompenses pour les chercheurs identifiant des vulnérabilités de type "jour-zéro". Dans son article, le chercheur propose une démonstration de faisabilité exploitant la vulnérabilité identifiée sous la référence CVE-2019-0546 et dont la criticité est considérée importante.

Lorsqu’un développeur compile du code en C++, des bogues peuvent résulter d’erreurs de programmation ou de compilation. Le second cas est plus grave, car le développeur ne va pas nécessairement s’en apercevoir. C’est dans ce contexte que Simon Zuckerbraun a identifié la vulnérabilité en compilant un code ne faisant pas ce qui était attendu.

Un attaquant pourrait l’exploiter pour exécuter du code arbitraire dans le contexte d’un utilisateur authentifié avec des droits administrateurs sur une plateforme. Il pourrait ensuite procéder à une élévation de privilège sur le système. L’impact est cependant moins important si l’utilisateur possède des droits d'utilisateurs. Cette attaque ne serait pas trop complexe à mettre en œuvre, mais nécessite un niveau d'authentification faible. L'impact estimé sur la confidentialité et l'intégrité des données est important.

Détails techniques :

CVE-2019-0546 [CVSS V3 7.8] : Simon Zuckerbraun a écrit du code pour faire appel à une fonction dans un module en mémoire, le compilateur a accepté son code sans erreur, mais le code compilé n’a pas fonctionné comme prévu. Les instructions générées n’utilisaient pas les bonnes adresses mémoires pour les variables, ainsi Zuckerbraun a pu accéder à des emplacements de piles incorrects.

Ce problème peut causer une fuite ou une corruption de données sensibles dans la pile d’un système.

La vulnérabilité se base sur l’utilisation de fonctions lambda possédant ces deux conditions :

  1. La capture des variables se fait par référence ou par copie ;
  2. La fonction lambda doit contenir un bloc « _asm ».ah d.

Le rapport préconise l'interdiction de l’assemblage en ligne dans les corps lambda C++ dans les blocs "_asm". Le mot clé "_asm" permet d'invoquer du langage assembleur code source dans un programme C++. Les fonctions lambda (ou fonctions anonymes) sont des fonctions n'ayant pas de noms qui sont permises dans certains langages de programmation notamment C++. N'ayant pas de nom à l'endroit où on devrait trouver cette fonction, les instructions sont directement introduites dans une syntaxe particulière. 

Des correctifs ont été publiés par Microsoft pour Visual Studio 2017 et sont disponibles au téléchargement depuis le 8 janvier 2019. Cependant du fait de la criticité, les utilisateurs sont invités à appliquer la mise à jour le plus rapidement possible.

Informations

La faille est activement exploitée :

Un correctif existe :

Une mesure de contournement existe :

Risques

Risques

  • Exécution de code arbitraire.

Criticité

  • Score CVSS : 7.80

Existence d’un code d’exploitation de la vulnérabilité

  • Aucun code d’exploitation n’est disponible.

Composants & versions vulnérables

  • Microsoft Visual Studio 2017 versions antérieures à 15.9 / Visual Studio 2015.
  • Toutes les versions n’ont pas été testées.

CVE

  • CVE-2019-0546

Solutions ou recommandations

Mise en place de correctif de sécurité

  • Pour Microsoft Visual Studio 2017, la version 15.9 corrige la vulnérabilité.

  • Pour les autres Microsoft Visual studio aucun correctif de sécurité n’est mis en place.

Solution de contournement

  • Aucune solution de contournement n’est proposé.