Fin mars 2018, les chercheurs d'ESET ont identifié un échantillon de PDF malveillant intéressant. Un examen plus approfondi a révélé que l'échantillon exploite deux vulnérabilités jusqu'alors inconnues : une vulnérabilité d'exécution du code à distance dans Adobe Reader et une d'escalade des privilèges dans Microsoft Windows.

La combinaison de ces deux vulnérabilités est extrêmement puissante, car elle permet à un attaquant d'exécuter du code arbitraire avec les privilèges les plus élevés possibles sur la cible vulnérable, et avec seulement le minimum d'interaction avec  l'utilisateur. Les groupes APT utilisent régulièrement de telles combinaisons pour effectuer leurs attaques, comme dans le cadre de la campagne Sednit que nous avons connue l'année dernière.

Une fois l'échantillon PDF découvert, ESET a contacté et travaillé avec le Microsoft Security Response Center, l'équipe de recherche Windows Defender ATP et l’Adobe Product Security Incident Response Team pour corriger ces bogues.

Des correctifs et informations provenant d’Adobe et de Microsoft sont disponibles ici  :

Les versions de produits touchées sont les suivantes :

  • Acrobat DC (2018.011.20038 et les versions antérieures)
  • Acrobat Reader DC (2018.011.20038 et les versions antérieures)
  • Acrobat 2017 (011.30079 et les versions antérieures)
  • Acrobat Reader DC 2017 (2017.011.30079 et les versions antérieures)
  • Acrobat DC (Classic 2015) (2015.006.30417 et les versions antérieures)
  • Acrobat Reader DC (Classic 2015) (2015.006.30417 et les versions antérieures)
  • Windows 7 version 32-bits — Service pack 1
  • Windows 7 version 64-bits — Service pack 1
  • Windows Server 2008 version 32-bits — Service Pack 2
  • Windows Server 2008 pour les systèmes d’exploitation Itanium — Service Pack 2
  • Windows Server 2008 version 64-bits — Service Pack 2
  • Windows Server 2008 R2 pour les systèmes d’exploitation Itanium — Service Pack 1
  • Windows Server 2008 R2 version 64-bits — Service Pack 1

Cet article présente des informations techniques plus détaillées concernant ces échantillons malveillants et des vulnérabilités qu’ils exploitent.

Introduction

PDF (Portable Document Format) est un format de fichier pour les documents électroniques et, comme pour les autres formats de documents populaires, il peut être utilisé par les attaquants pour livrer des logiciels malveillants sur l'ordinateur d'une victime. Afin d'exécuter leur propre code malveillant, les attaquants doivent trouver et exploiter les vulnérabilités des logiciels de visualisation de PDF. Plusieurs visionneuses PDF existent. L’une des plus populaires d’entre elles est Adobe Reader.

Le logiciel Adobe Reader a implanté une fonction de sécurité appelée sandbox, également connue dans la visionneuse comme étant le mode «  protégé ». La description technique détaillée de l'implémentation du sandbox a été publiée sur les pages du blog d'Adobe en quatre parties (Partie 1Partie 2Partie 3Partie 4). Cette fonction rend l'exploitation plus difficile : même si l'exécution du code est réalisée, l'attaquant devra toujours contourner les protections du sandbox pour pouvoir compromettre l'ordinateur exécutant Adobe Reader. Habituellement, le contournement de celui-ci est réalisé en exploitant une vulnérabilité du système d'exploitation lui-même.

Nous faisons néanmoins face à un rare cas où les attaquants ont pu trouver des vulnérabilités et écrire des exploits pour le logiciel Adobe Reader et le système d'exploitation.

CVE-2018-4990 – RCE dans Adobe Reader

L'échantillon PDF malveillant intègre du code JavaScript qui contrôle l'ensemble du processus d'exploitation. Une fois le fichier PDF ouvert, le code JavaScript est exécuté.

Au début de l'exploitation, le code JavaScript commence à manipuler l'objet Button1. Cet objet contient une image JPEG2000 conçue spécifiquement afin de déclencher une double vulnérabilité dans Adobe Reader.

Figure 1 : Le code en JavaScript qui manipule l’objet Button1

Le JavaScript utilise des techniques « heap-spray » afin de corrompre les structures de données internes. Après toutes ces manipulations, les attaquants atteignent leur but principal : lire et écrire des accès mémoire à partir de leur code JavaScript.

Figure 2 : Le code en JavaScript utilisé pour lire et écrire dans la mémoire

En utilisant ces deux primitives, l'attaquant localise l'adresse mémoire du plugin EScript.api, qui est le moteur JavaScript d'Adobe. En utilisant les instructions d'assemblage (gadgets ROP) de ce module, le JavaScript malveillant met en place une chaîne ROP qui conduirait à l'exécution du shellcode natif.

Figure 3 : Le code en JavaScript fabriquant une chaîne ROP

Lors de l’étape finale, le shellcode initialise un fichier PE incorporé dans le PDF et lui confie l'exécution.

CVE-2018-8120 – Escalade de privilèges sous Microsoft Windows

Après avoir exploité la vulnérabilité d'Adobe Reader, l'attaquant doit casser le sandbox. C'est exactement le but du deuxième exploit que nous aborderons.

La racine de cette vulnérabilité inconnue jusqu'à présent se trouve dans la fonction NtUserSetImeInfoEx  du composant win32k  du noyau Windows. Plus précisément, le sous-programme SetImeInfoEx  de NtUserSetImeInfoEx  ne valide pas un pointeur de données, ce qui permet de dériver un pointeur NULL.

Figure 4 : Sous-programme SetImeInfoEx démonté

Comme le montre la Figure 4, la fonction SetImeInfoEx attend un pointeur vers un objet WINDOWSTATION initialisé comme premier argument. La spklList pourrait être égale à zéro si l'attaquant crée un nouvel objet de station de fenêtre et l'assigne au processus courant en mode utilisateur. Ainsi, en mappant la page NULL et en définissant un pointeur pour décaler 0x2C, l'attaquant peut utiliser cette vulnérabilité pour écrire à une adresse arbitraire dans l'espace du noyau. Il est à noter que depuis Windows 8, un processus utilisateur n'est pas autorisé à mapper la page NULL.

Comme l'attaquant a une écriture primitive arbitraire, ils peuvent utiliser différentes techniques, mais dans ce cas, l'attaquant choisit d'utiliser une technique décrite par Ivanlef0u et Mateusz “j00ru” Jurczyk et Gynvael Coldwin. L'attaquant met en place une porte d'appel vers Ring 0 en réécrivant le Global Descriptor Table (GDT). Pour ce faire, un attaquant obtient l'adresse du GDT original en utilisant l'instruction d'assemblage SGDT, construit sa propre table et réécrit l'adresse originale en utilisant la vulnérabilité mentionnée ci-dessus.

L’exploit utilise alors l’instruction CALL FAR  pour effectuer un appel de niveau inter-privilège.

Figure 5 : L'instruction CALL FAR désassemblée

Une fois le code exécuté en mode noyau, l'exploit remplace le jeton du processus en cours par le jeton système.

Conclusion

Au départ, les chercheurs d'ESET ont découvert l'échantillon PDF lorsqu'il a été téléchargé dans un dépôt public d'échantillons malveillants. L'échantillon ne contient pas de charge utile finale, ce qui peut suggérer qu'il a été capturé au cours de ses premières étapes de développement. Même si l'échantillon ne contient pas de véritable charge utile finale malveillante, ce qui peut suggérer qu'il a été capturé au cours de ses premières phases de développement, le ou les auteurs ont fait preuve d'un haut niveau de compétences en matière de découverte de vulnérabilité et d'écriture de l’exploit.

Indicateurs de compromission (IoC)

ESET detection names
JS/Exploit.Pdfka.QNV trojan
Win32/Exploit.CVE-2018-8120.A trojan
SHA-1 hashes
C82CFEAD292EECA601D3CF82C8C5340CB579D1C6
0D3F335CCCA4575593054446F5F219EBA6CD93FE