sábado, 18 de octubre de 2008

Introducción al Portable Document Format (PDF)

Hace ya unos meses, en la Black Hat europea de este año, se hizo una charla que hablaba de las capacidades y funcionalidades del formato PDF. En ella se advertía que gracias a algunas de sus funciones, un simple PDF podría convertirse en un malware en toda regla que podría realizar las acciones que especificara el atacante. Además, recientemente se ha puesto de moda la explotación de vulnerabilidades a través de documentos en este formato. Es por eso que hoy os voy a contar lo básico sobre la estructura de un PDF y cómo trabaja internamente. Puede que resulte un poco pesado, pero os prometo que en los próximos posts sobre el mismo tema habrá más parte práctica;) Para hacerlo más ameno podéis abrir un PDF en un editor de texto o en un editor hexadecimal e ir viendo todo lo que voy comentando.

Un PDF está formado internamente por multitud de objetos que se relacionan entre sí. Estos objetos pueden ser de ocho tipos diferentes: booleanos, números enteros y reales, cadenas de texto, nombres, arrays, diccionarios, streams y nulos. Dejando aparte los tipos “conocidos”, los nombres son una especie de etiquetas de los distintos elementos que definen un objeto, los diccionarios, delimitados por los caracteres "<<" y ">>", son un conjunto de parejas clave-valor, y los streams, delimitados por las palabras "stream" y "endstream", son secuencias de bytes, un flujo de información que los lectores PDF pueden leer incrementalmente, al contrario que las cadenas de texto normales. Todos los objetos se pueden declarar como objetos indirectos, de forma que se les asigna un identificador para poder ser referenciados en cualquier otra parte del archivo. Esta clase de objetos están delimitados por las palabras "obj" y "endobj".

No hay comentarios: