Anatomie des fichiers PDF malveillants
Date : 09 Février 2010
Depuis un peu plus d'un an, les attaques au moyen de fichiers PDF (Portable Document Format) malveillants se sont multipliées. Par exemple :
- Pour l'année 2009 le Cert-IST a émis 4 Dangers Potentiels pour avertir notre communauté de nouvelles attaques utilisant des vulnérabilités jusqu'alors inconnues dans Adobe Reader ou dans Adobe Acrobat.
- L'éditeur antivirus BitDefender a placé en tête de son "Top 10 pour décembre 2009" la menace Exploit.PDF-JS.Gen qui représente 12,04% de l’ensemble des infections. Sous ce nom sont regroupés des fichiers PDF qui exploitent différentes vulnérabilités détectées dans le moteur JavaScript de PDF Reader, afin d’exécuter du code malveillant sur l’ordinateur de l’utilisateur.
Afin de mieux comprendre cette menace nous allons dans cet article expliquer comment fonctionne un fichier PDF malveillant et quelles sont les mesures disponibles pour diminuer ce risque.
Anatomie d'un fichier malveillant
Les fichiers PDF malveillants utilisent des failles découvertes dans les lecteurs PDF (typiquement Acrobat Reader) pour forcer ces derniers à exécuter un code arbitraire au moment où le fichier PDF est ouvert. Ces failles sont généralement des débordements de buffer qui se produisent lorsque le lecteur PDF analyse un fichier spécifiquement construit. Ces failles peuvent typiquement se trouver :
- Dans des primitives PDF. Par exemple, un appel à la primitive PDF "/Colors" avec un argument plus grand que 2^24 provoque un débordement de tas dans Adobe Reader 9.3 (cf. CERT-IST/AV-2009.469, CVE-2009-3459)
- Dans l'interpréteur JavaScript qui est inclus dans le lecteur PDF. Par exemple un appel à la méthode JavaScript "Collab.getIcon" peut provoquer un débordement de pile dans Acrobat Reader 9.0 (cf. CERT-IST/AV-2009.078, CVE-2009-0927)
Afin de tirer partie d'un débordement mémoire pour exécuter du code, l'attaquant a besoin de connaitre l'organisation mémoire du lecteur PDF au moment où le débordement se produit. Mais le plus souvent il utilise plutot un code JavaScript qui réalise un "heap spray" (une "pulvérisation sur le tas") avant de déclencher la vulnérabilité Cette technique permet d’exécuter du code arbitraire sans connaître l'endroit exact à modifier en mémoire. L'attaquant remplit alors la mémoire avec de multiples instructions de saut vers son code d'attaque, augmentant la probabilité que l'une d‘entre elles soit exécutée au moment où le débordement mémoire se produit.
Donc, même si ce n'est pas absolument nécessaire, la plupart des fichiers PDF malveillants contiennent un code JavaScript :
- soit parce que la vulnérabilité exploitée se trouve dans l'interpréteur Javascript,
- soit parce que la technique d'attaque utilise JavaScript (par exemple pour réaliser un "heap-spay").
Ce code JavaScript est déclenché (à l'ouverture du document, ou plus tard lors de l'arrivée d'un événement précis) par les primitives PDF "/OpenAction" ou "/AA" (Additional Action).
Vecteurs d'infection
Il existe deux scenarii types permettant l'infection d'un poste utilisateur cible :
- L'infection se fait le plus souvent au moment où la victime visite un site web malveillant parce que ce site est construit pour provoquer l'affichage automatique d'un document PDF piégé dans le navigateur web de la victime. Dans ce cas, c'est donc le plugin "Acrobat Reader" qui est attaqué. L'attaque devient furtive (invisible et silencieuse) si elle est insérée dans une balise "iframe" d'une taille de 1x1 pixel.
- Elle peut aussi se faire en envoyant à la victime un fichier PDF piégé en attachement d'un e-mail. L'e-mail lui-même utilise un prétexte quelconque pour inciter la victime à ouvrir le fichier attaché. Dans ce cas c'est l'application "Acrobat Reader" elle-même (le client de visualisation autonome) qui est attaquée.
Il existe un troisième scénario, qui peut être utilisé dans le cas très particulier et peu courant où la vulnérabilité impacte également l'extension Adobe qui se greffe sur l'explorateur de fichiers de Windows. Cette extension permet à Windows de pré-visualiser un fichier PDF ou d'afficher dans une bulle d'information les propriétés du fichier au moment où l'on place le curseur dessus. Dans ce cas, l'infection peut se produire lorsque l'utilisateur visualise le contenu d'un répertoire dans lequel un fichier piégé a été déposé (par exemple sur un partage réseau). Ce cas d'infection a par exemple été démontré dans le cas de la vulnérabilité "JBIG2Decode" (cf. CERT-IST/AV-2009.078, CVE-2009-0658).
Moyens de protection
Il faut noter que la détection des fichiers PDF malveillants au moyen d'un antivirus est relativement difficile. En effet, le format PDF dispose de fonctions permettant à l'attaquant de dissimuler le code malveillant à l'intérieur du fichier PDF. Tout d'abord il existe des fonctions lexicales telles que :
- Changer un caractère par son équivalent hexadécimal ou octal,
- Couper les mots en les mettant sur plusieurs lignes successives,
- Insérer des blancs multiples entre les mots.
Ensuite, il est possible d'utiliser un script JavaScript pour générer dynamiquement un code qui sera ensuite exécuté (via les fonctions JavaScript "unescape" et "eval").
Enfin, le code malveillant peut être caché à l'intérieur d'un objet "Stream" dans le fichier PDF. PDF utilise abondamment et pour des raisons légitimes ces objets "Stream". Par exemple un texte ou une image peuvent être stockés dans un "Stream" (qui peut contenir n'importe quelle suite de données binaires) et être utilisé ensuite lors de la visualisation du fichier. Afin de stocker un "Stream" dans le fichier PDF celui-ci doit être encodé en appliquant un filtre. Il existe une demie douzaine d'encodages possibles : encodé en hexadécimal, encodé en base 85, compressé via Zlib, compressé via LZW, chiffré AES, etc….
Toutes ces méthodes permettent de construire des fichiers PDF très complexes rendant toute analyse antivirus difficile. En effet, il faudrait que l'antivirus interprète le fichier PDF, le mette sous forme canonique, analyse les streams qu’il contient, etc…. D'ailleurs les taux de détection des fichiers PDF malveillants par les antivirus est généralement très faible.
Les seuls moyens de protection réellement efficaces sont les suivants :
- Maintenir à jour son logiciel PDF, de façon à éliminer toutes les vulnérabilités connues et corrigées.
- Désactiver l'interprétation du Javascript dans Acrobat Reader.
- Eventuellement, désactiver le plugin PDF permettant de lire le fichier PDF à l'intérieur du navigateur web (pour éviter l'infection lors de la visite de sites web).
Adobe propose également, depuis Adobe Reader 9.2 (et 8.1.7), une fonction "blacklist" permettant d'interdire l'exécution de certaines fonctions JavaScript dans les fichiers PDF. Cette fonction semble cependant assez peu intéressante par rapport à la désactivation complète de JavaScript.
La détection de fichiers malveillants peut être faite en utilisant des outils d'analyse tels que PDF-id (un script Python qui recherche si un fichier PDF contient des éléments dangereux, comme par exemple du code JavaScript et une primitive "/OpenAction"). Mais il s'agit d'outils conçus pour faire une analyse manuelle d’un fichier PDF. Il n'existe pas à notre connaissance de solution plus ambitieuse qui automatiserait l'analyse et pourrait être installée sur une passerelle filtrante (web ou de messagerie) pour éliminer les fichiers suspects entrant dans l'entreprise.
Conclusion
Il fût un temps où le format PDF était réputé comme un format sûr. Il a même été utilisé quelque temps comme une alternative au format ".doc" de Word jugé beaucoup trop dangereux. Clairement ces temps ont changé et PDF s'est révélé être tout aussi dangereux.
PDF est un langage versatile. La possibilité d'inclure du code JavaScript dans un fichier PDF (ou encore des ActionScript Flash depuis la version 9 de Adobe Reader), augmente le nombre de failles potentielles du lecteur ou de son moteur JavaScript. Surtout il est désormais possible de construire des attaques évoluées. Il est donc probable que "le pire des attaques PDF" soit encore à venir …
Pour plus d'information
- Malicious PDF Files – Pawel Jacewlcz (NASK review 2009 – Page 28)
http://www.nask.pl/review/Review_2009a.PDF
- Q&A Didier Stevens on malicious PDFs (Insecure magazine page 29)
http://www.net-security.org/dl/insecure/INSECURE-Mag-23.pdf
- Anatomy of Malicious PDF Documents – Didier Stevens (Hakin9 magazine)
http://iaclub.ist.psu.edu/files/PDF_Seminar/anatomy_of_malicious_pdfs.pdf