Aller au contenu

CVE-2020-9715 : Use-After-Free dans Adobe Acrobat et Reader

La vulnérabilité se situe dans le module EScript.api, plus précisément dans la gestion du cache des data ESObject utilisés par le moteur JavaScript d’Adobe Reader.

Le cœur du problème réside dans la divergence de traitement des encodages de chaînes lors de l’insertion et de la suppression d’objets dans le cache.

  1. Insertion dans le cache : lorsqu’un data ESObject est créé, la clé du cache conserve l’encodage original (soit ANSI, soit Unicode) présent dans le document PDF.
  2. Éviction du cache (Le bug) : lors de la phase de suppression, le système tente de localiser l’objet pour le supprimer. Cependant, il utilise systématiquement des chaînes encodées en Unicode pour effectuer cette recherche.
  3. La rupture : si l’objet a été indexé avec un nom ANSI, la recherche Unicode ne trouve aucune correspondance. Par conséquent, l’entrée dans le cache n’est jamais supprimée.
  4. Le résultat : bien que l’objet lui-même soit libéré de la mémoire (suite à la nullification de la référence JavaScript), le pointeur reste actif dans le cache. Cela crée une condition de Use-After-Free (UAF).
  • Type de vulnérabilité : Use-After-Free (CWE-416)
  • Score CVSS v3.1 : 7.8 (Élevé)
  • Vecteur : AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
  • Impact : compromission totale du processus de rendu (renderer).

L’exploitation de la CVE-2020-9715 nécessite un fichier PDF contenant un script JavaScript malveillant.

  1. Déclenchement de l’allocation : le script crée un Data ESObject avec un nom encodé en ANSI, forçant Adobe Reader à stocker un pointeur dans le cache EScript.api.
  2. Nullification de la référence : la référence JavaScript vers l’objet est mise à null (ex: this.dataObjects[0] = null), marquant l’objet pour libération.
  3. Déclenchement du Garbage Collection (GC) : l’attaquant utilise une fonction de délai (app.setTimeOut) pour attendre que le ramasse-miettes libère la mémoire de l’objet nullifié.
  4. Accès au pointeur obsolète : le script appelle à nouveau une méthode sur l’objet (ex: toString()). Comme la purge du cache a échoué, le système trouve le pointeur obsolète et tente de l’utiliser.
  5. Exécution de code (RCE) : en manipulant le tas (heap grooming), l’attaquant remplace la zone mémoire libérée par un shellcode, permettant ainsi l’exécution de commandes arbitraires.
function triggerUAF() {
// Accède au pointeur obsolète dans le cache d'objets
this.dataObjects[0].toString();
}
function poc() {
// 1. Allouer Data ESObject
this.dataObjects[0].toString();
// 2. Nullifier la référence
this.dataObjects[0] = null;
// 3. Déclencher l'UAF après le passage du GC
app.setTimeOut("triggerUAF()", 1000);
}
poc();

Lors de l’analyse d’un système suspecté d’être compromis via la CVE-2020-9715, les analystes doivent rechercher les traces suivantes.

  • Lignage de processus anormal : rechercher des processus enfants suspects spawnés par Acrobat.exe ou AcroRd32.exe, tels que cmd.exe, powershell.exe, wscript.exe ou mshta.exe.
  • Crashs de processus : des plantages fréquents du processus de rendu d’Adobe Reader peuvent indiquer des tentatives d’exploitation infructueuses (corruption du tas).
  • Inspection de la mémoire : analyse du tas du processus Reader pour détecter des motifs de shellcode classiques (ex: NOP sleds, interruptions 0xCC).
  • Analyse de PDF malveillants : inspection des fichiers .pdf pour détecter l’utilisation des collections this.dataObjects combinée à des appels app.setTimeOut.
  • Prefetch/Shimcache : vérifier l’exécution d’ Acrobat.exe et l’exécution concomitante de shells immédiatement après l’ouverture d’un PDF.

Pour détecter l’activité post-exploitation, surveillez les processus enfants anormaux.

Logique :

  • Image Parent : C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\Acrobat.exe OU C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe
  • Image Enfant : cmd.exe, powershell.exe, sh.exe, certutil.exe
  • Event ID : 4688 (Création de processus)
index=endpoint
parent_process IN ("Acrobat.exe", "AcroRd32.exe")
process IN ("cmd.exe", "powershell.exe", "sh.exe", "whoami.exe")
| table _time, host, user, pid, process, parent_process, command_line

Mise à jour

Mettre à jour Adobe Acrobat et Reader vers les dernières versions. Cette vulnérabilité est corrigée dans l’avis APSB20-48.

Durcissement du sandbox

S’assurer que le “Mode Protégé” (Sandbox) est activé dans les paramètres d’Adobe Reader pour limiter l’impact d’une RCE.

Désactivation du JS

Désactiver JavaScript dans Adobe Reader pour les environnements à haut risque si cette fonctionnalité n’est pas critique.