Español | English
rss facebook linkedin Twitter

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".

La estructura física de un archivo PDF se divide en cabecera, cuerpo, tabla de referencias cruzadas y trailer:

  • Cabecera: es la primera línea del archivo y se indica la versión de la especificación PDF que se aplica en el documento precedida de la cadena "%PDF-".
  • Cuerpo: se trata de una secuencia de objetos indirectos que conforman el contenido del PDF.
  • Tabla de referencias cruzadas: comienza con la palabra "xref" y recoge la ubicación en el archivo de los objetos indirectos, a través de un offset de bytes, de forma que se pueda acceder a ellos sin necesidad de leer el documento completo.
  • Trailer: se encuentra al final del archivo y permite la lectura rápida del documento por parte de las aplicaciones; es por ello que éstas deberían empezar a leer el archivo desde el final. En el trailer se incluye un diccionario que comienza con la palabra "trailer" que contiene diversa información importante para la interpretación del documento. También se incluye, después de la palabra "startxref", los bytes desde el comienzo del fichero hasta la tabla de referencias cruzadas, terminando con la cadena "%%EOF".

Es importante señalar que el bloque "cuerpo-tabla de referencias cruzadas-trailer" se puede repetir más de una vez si se han realizado modificaciones del documento original. Es decir, en un archivo PDF se guarda el original y todos los cambios realizados sobre él, de ahí el despiste de las tropas americanas en Iraq al desclasificar la información de un informe, dejando a la luz más de lo que deseaban.

Para terminar, comentar brevemente la estructura lógica de un documento PDF. Ésta sigue una jerarquía donde el "catálogo" se encuentra como raíz de los demás nodos (se accede a él a través de la entrada /Root del trailer). En él se encuentran referencias a otros objetos que definen el contenido del documento y la forma de presentarlo, entre muchas otras cosas. Por ejemplo, el nodo /Pages es un árbol de todas las páginas que conforman el documento, definiéndose a su vez en otros nodos su contenido y demás atributos. Ésta sería la estructura aproximadamente:


Si queréis ampliar la información no tenéis más que descargar la especificación del formato desde la página oficial, aunque os aviso que no es para nada ameno:)

Jose Miguel Esparza
S21sec e-crime


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login