Obfuscation and (non-)detection of malicious PDF files

Hace ya más de dos meses que hablé en la Rooted CON (Madrid) sobre diferentes técnicas para ocultar y ofuscar archivos PDF maliciosos. El viernes pasado volví a realizar la misma presentación en el CARO 2011 (Praga), aunque actualizando los datos y con demo de peepdf incluida.
 

 
La idea es usar ciertas malformaciones de los documentos, comentadas en las ponencias de Julia Wolf, y la propia especificación del formato PDF para evitar que los motores antivirus y los parsers de PDFs lleguen a encontrar el contenido malicioso. Para esta tarea hay que tener en cuenta diferentes aspectos de la estructura de este tipo de documentos y mezclarlos para obtener el deseado archivo no detectado. Algunas de las más importante son las siguientes:
 

  • Evitar el elemento /OpenAction para ejecutar acciones al abrir el documento. Se pueden usar los elementos /Names y /AcroForm del objeto Catalog en su defecto.
     
  • Evitar cadenas de caracteres identificables como pueden ser los metadatos o trazas que dejan ciertas herramientas para modificar archivos.
     
  • Si el contenido a ocultar se encuentra en un objeto de tipo string es posible su ocultación gracias a la codificación octal.
     
  • Si en cambio, el contenido malicioso se encuentra en un objeto de tipo stream, se pueden usar filtros (elemento /Filter) no implementados habitualmente como /JBIG2Decode o /DCTDecode, evitando siempre los más usados como /FlateDecode o /ASCIIHexDecode.
     
  • En el caso de usar los filtros /FlateDecode o /LZWDecode es posible añadir parámetros para que el proceso de decodificación sea más difícil.
     
  • Evitar la codificación hexadecimal en objetos de tipo name, ya que son considerados sospechosos por muchos motores antivirus.
     
  • Dividir el código malicioso en diferentes partes en el documento. En el caso de código Javascript se puede colocar en el elemento /Names del Catalog o usar funciones que obtienen el contenido de ciertos elementos del documento, como getAnnots(), getPageNthWord, etc.
     
  • No usar el tag de fin de objeto, endobj, para confundir a los parsers.
     
  • Introducir un byte nulo en la cabecera del documento.
     
  • Comprimir los objetos maliciosos dentro de los llamados object streams para añadir un nivel más de dificultad.
     
  • Cifrar el archivo con el password “por defecto”.
     
  • Embeber el archivo malicioso dentro de uno legítimo. De esta forma es posible abrir el documento malicioso de forma transparente cuando el documento legítimo es abierto por el usuario.

 
La demo mostrada el pasado viernes consistió en la modificación de un archivo PDF ampliamente detectado por los motores Antivirus (34/43) para reducir su detección, siendo detectado después únicamente por uno de ellos. En las pruebas realizadas en el mes de febrero ninguno de los motores antivirus probados era capaz de detectar dicha modificación.

La herramienta que he desarrollado para el análisis de archivos PDF maliciosos, peepdf, fue liberada también el pasado viernes, y soporta la mayor parte de las técnicas comentadas, por lo que es una buena opción a la hora de analizar este tipo de archivos. Se trata de la primera versión, por lo que todos los comentarios y posibles bugs son bienvenidos! ;)