jueves, 7 de julio de 2016

Conocimientos para detectar si un PDF es malicioso - Parte 1

Antes de comentar analizar un archivo PDF para determinar si se trata de un archivo malicioso o no, debemos entender la estructura interna física y lógica del archivo para saber qué buscar.

Como comentario inicial decir que el lenguaje PDF se basa en el lenguaje PostScript (lenguaje de programación), pero el lenguaje PDF es un subconjunto de PostScript que no posee las características que hace que sea un lenguaje de programación.


Estructura  física de un archivo PDF

Estructura interna de un archivo PDF


Header: Se corresponde con la primeros bytes de cualquier archivo PDF, y específica la versión utilizada por el documento .pdf.

 El resto de la línea nos muestran caracteres sin ningún valor informativo.

Versión de PDF utilizada por el documento: 8448180488.pdf

NOTA: Los caracteres "%" indican inicio y fin de comentario.
         Si la cabecera no está presente o no sigue el patrón %PDF-X.Y%, entonces la mayoría de los lectores de archivos PDFs no visualizarán el contenido del archivo

Body: Contiene los "objetos" incluidos dentro del archivo PDF, entre los cuales nos podemos encontrar: Booleanos, números, nombres, diccionarios, streams y el objeto NULL (objetos directos o objetos). Pero también contendrá los objetos llamados indirectos.

En definitiva, está sección contendrá los datos que serán mostrados al usuario.

Comienzo de la sección "Body" del documento: 8448180488.pdf

El contenido de dicha sección se verá más adelante.

Tabla 'xref': Es una tabla de referencias cruzadas que contiene las referencias a todos los objetos contenidos en el documento o, mejor dicho, en el cuerpo o body del documento.

Esta tabla permite conocer  los objetos contenidos en el documento sin necesidad de leer el contenido de todo el documento.

Parte de la tabla: xref, del documento: 8448180488.pdf

Toda la tabla: xref, del documento: 8448180488.pdf



Toda la tabla: xref, vista de manera más legible.


La primera línea tras la clausula: xref, se corresponde con el siguiente patrón:

<ID del objeto> <Número de objetos, del tipo anterior, dentro del documento>

Nuestro ejemplo:
ID objeto: 1468 (caja roja)
Número de objetivos del tipo anterior: 36 (caja verde)

Patrón detectado tras la clausula: Xref

NOTA: En el caso estudiado sólo se tiene un tipo de objeto, pero en un documento de tipo .pdf, podrían existir múltiples IDs de objetos.

Para cada uno de los objetos del tipo definido se tiene información  está representado por una línea compuesta por 20 bytes(incluido el CRLF).

Objetos del tipo 1436

La información dada por cada uno de los objetos sigue el siguiente patrón

<offset del objeto> <Número de generación del objeto> <f|n>

Los primeros 10 bytes se corresponde con el offset donde se encuentra ubicado el objeto, partiendo siempre desde el comienzo del archivo. Tras estos bytes, nos aparecerá un espacio en blanco y un número que se corresponde con el número de objeto dentro de un mismo tipo de objeto. Tras este número, nos aparecerá otro espacio en blanco y una "f" (free, libre) o una "n" (non-free, en uso). Por último, el CRLF

Más concretamente, la "f" significa que el objeto sigue estando en el archivo pero que no puede ser utilizado, y por lo tanto NO será presentado al abrir el documento. La "n" significa que el objeto esta en el archivo y se encuentra en uso. El valor

El número de generación del objeto (NGO), se podría explicar diciendo que controla las veces que un objeto ha sido "eliminado" o categorizado como "f" (free). Es decir, cada vez que un objeto es puesto como "f" el valor correspondiente al NGO se incrementara en uno. Si por cualquier circunstancia dicho objeto se vuelve a utilizar el NGO se mantendrá con el valor incrementado a uno, pero si se vuelve a eliminar, el NGO se volverá a incrementar.

NOTAS IMPORTANTES:
1.- Pueden existir múltiples tablas de referencias cruzadas debido a la actualización del documento.

Como es el caso del documento utilizado como ejemplo:

Comienzo de la segunda sección "xref" del documento: 8448180488.pdf

2.- El primer objeto debe tener como identificador el 0 y contendrá una entrada de objeto con NGO 65535, marcado como "free" (f). Por ejemplo:

Primer objeto de la segunda sección "xref" del documento: 8448180488.pdf

2.- El último objeto de la tabla de referencias cruzadas tendrá el GNO a 0

Tal y como se ha comentado anteriormente, un archivo PDF puede modificarse, actualizarse porque se ha retocado el contenido. En este caso, la estructura inicial del documento no se elimina del propio documento, sino que se mantiene aunque no sea visible. Es decir, las actualizaciones modifican o añaden objetos al documento, pero nunca los elimina.

Esto implica que las modificaciones se escriban al final del documento, generando así mismo, una nueva sección "body", una nueva "tabla de referencias cruzadas" y una nueva sección "trailer". Visualmente ...

Patrón de actualizaciones de un archivo PDF

Trailer: Permite al lector del documento PDF determinar donde se encuentra la tabla de referencias cruzadas así como otros objetos especiales. Todos los lectores de archivos PDF deberían empezar leyendo un archivo PDF desde el final, ya que es aquí donde reside está sección.

Comienzo de la sección "Trailer"

En la sección podríamos encontrar información como:

/size <integer>: Indica el número de objetos contenidos en todas las tablas de referencias existentes en el documento.

NOTA: El número usado NO debería ser una referencia de tipo de objeto.

/Prev <integer>: Indica el offset de las anterior tabla de referencia cruzada

/Root <objeto>: Indica el objeto "catalogo" o raíz del documento.

/Encrypt <objeto>:  Indica un objeto que se encuentra cifrado

/Info <objeto>:  Indica un objeto que contiene información sobre el documento.

startxref <offset>: Indica el offset respecto del inicio del documento donde se encuentra la tabla de referencias cruzadas

No hay comentarios:

Publicar un comentario