Le clic que vous n'avez jamais fait : trouver /OpenAction dans un PDF malveillant
Le défi
La comptabilité a transféré une facture fournisseur et la passerelle de messagerie l'a mise en quarantaine. Le premier réflexe est de vérifier si l'extension ment sur le fichier, et cette fois elle ne ment pas : la signature est honnête, c'est bien un PDF. Le problème se trouve plus loin. Le dictionnaire de catalogue en tête de fichier déclare deux choses qu'une simple facture n'a aucune raison de transporter. La première indique seulement qu'un script est joint, et un lecteur prudent vous demanderait quand même confirmation avant de l'exécuter. La seconde est la clé qui donne la main à ce script à l'instant où le document est ouvert, sans que personne ne clique. Lisez la colonne ASCII et nommez cette seconde clé.
Ce que tu vas apprendre
- Lire l'en-tête d'un PDF et confirmer qu'une signature est authentique
- Repérer le dictionnaire de catalogue et ses clés dans une vue hexadécimale brute
- Distinguer /OpenAction de /JavaScript et expliquer pourquoi une seule des deux est la trouvaille
- Expliquer pourquoi une signature de fichier authentique ne prouve rien sur le comportement d'un document
- Nommer les clés apparentées qui produisent le même effet (/AA et /Launch)
Compétences testées
Prérequis
- Lire un dump hexadécimal avec une colonne ASCII
- Notion de base d'une signature de fichier
Comment ça marche
Un PDF est un ensemble d'objets numérotés. Celui que le lecteur charge en premier est le catalogue, marqué /Type /Catalog, et il décrit ce qu'est le document et ce qui doit lui arriver.
Parmi les clés qu'un catalogue peut porter figure /OpenAction. Elle pointe vers une action que le lecteur exécute automatiquement à l'instant où le document est ouvert. Elle existe pour des raisons anodines : aller à une destination nommée, régler le niveau de zoom, jouer un son. Elle accepte aussi une action dont le type est /S /JavaScript.
Voilà toute l'astuce. /JavaScript décrit ce qu'est la charge utile. /OpenAction décide du moment où elle s'exécute. Un fichier qui ne porte que la première a besoin qu'un humain clique sur quelque chose. Un fichier qui porte les deux n'a besoin de rien du tout.
La signature n'a aucune importance ici. %PDF- à l'offset 0 est correcte, et c'est exactement pour cela que la simple vérification de signature est un contrôle faible : le fichier ne prétend pas être autre chose, c'est honnêtement un PDF qui demande honnêtement à exécuter du code.
Erreurs fréquentes
- Répondre /JavaScript. C'est effectivement suspect, mais à lui seul cela signifie seulement qu'un script est joint. Les formulaires interactifs embarquent un script qui se déclenche sur un clic et ne touche jamais à rien. C'est le déclencheur, pas la charge utile, qui rend ceci automatique.
- Chercher une signature falsifiée. Les huit premiers octets ressemblent à toutes les autres énigmes de type de fichier, d'où le réflexe de les comparer à la liste de référence et de s'arrêter là. Ici ils correspondent, et c'est justement le but.
- Survoler le panneau hexadécimal au lieu de la colonne ASCII. Tout le dictionnaire d'objet est du texte imprimable. Lire la colonne de droite est plus rapide que décoder les octets à la main.
- Supposer qu'un lecteur demandera toujours confirmation. Certains lecteurs demandent avant d'exécuter un script de document, beaucoup de lecteurs plus anciens ou embarqués ne le font pas, et un volet d'aperçu de messagerie est le pire des cas.
Comment s'en protéger
La solution n'est pas de bloquer les PDF. C'est d'arrêter de traiter une signature valide comme un verdict.
- Analysez la structure, ne vous fiez pas à une simple détection de signature. Notez les pièces jointes selon leur structure d'objets.
/OpenAction,/AA,/Launch,/EmbeddedFileet/RichMediadans une facture entrante justifient chacun une mise en quarantaine à eux seuls. - Désactivez le script de document dans le lecteur que vous déployez, et désactivez le volet d'aperçu pour le courrier externe afin que l'ouverture soit toujours un acte délibéré.
- Aplatissez à l'ingestion. Rendre un PDF entrant sous forme d'images, ou le reconstruire via un assainisseur, supprime toutes les clés d'action tout en gardant la facture lisible.
- Alertez sur la combinaison. Une seule clé de script est bruyante à elle seule :
/OpenActionrésolu vers une action/JavaScriptest un signal à haute confiance qui mérite une alerte.