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