jueves, 30 de diciembre de 2010

Idiosincrasias de PDF

Después de la lección abreviada sobre PDF de Julia Wolf, ya no podré volver a leer un documento PDF de la misma manera.

Resulta que yo pensaba que PDF era simplemente una especie de evolución de Postscript para describir documentos y poder imprimirlos... Pues resulta que es mucho más, de hecho Adobe Acrobat tiene más líneas de código que Firefox y Linux juntos. O que Windows NT... Vamos, que Adobe no ha hecho un ordenador con AcrobatOS porque no ha querido (bueno, igual estaban ocupados al 100% en lugar de al 80%, 15 millones de líneas dan mucho trabajo).

A medida que las transparencias de todo lo que un documento PDF puede hacer iban pasando mi sorpresa era cada vez mayor: tiene la posibilidad de incuir OpenGL, Flash, audio, video, formularios, RFID (sí, se puede imprimir un campo a la etiqueta RFID del documento...), y cualquier fichero arbitrario. Eso sí, para los ficheros tiene que lanzar aplicaciones externas para interpretarlos... no sin antes pedir permiso.

Además de la sintaxis principal, que es parecida a la de Postscript, el formato también soporta código Javascript, lo que abre infinitas posibilidades... para bien y para mal. En concreto, los actuales virus esconden el código en cualquier campo informativo del documento del que lo saca un pequeño trozo de código Javascript.

Pero Julia ha mostrado nuevas maneras que podrían ser utilizadas para escaparse de los antivirus (y que por ahora son efectivas y pocos antivirus tienen contramedidas), basadas en la gran tolerancia a los fallos que tiene el formato.

En concreto, dado que el comienzo del fichero con %PDF-1.1 no necesita estar justo al principio del fichero, que Acrobat se salta todos los datos no reconocidos y que no verifica la tabla final de contenidos, Julia ha demostrado que se puede crear un fichero que según se mire es un fichero PDF o zip: la mayor parte de los antivirus piensan que es un fichero zip (y le aplican el procesamiento de zip) porque empiza como un fichero zip y así podría escapara a la vigilancia para ficheros PDF, pero si Acrobat abre el fichero buscará %PDF-1.1 y si lo encuentra en los 1024 primeros bytes, lo da por bueno y lo va a interpretar como PDF.


Y por supuesto, esto no sólo se puede aplicar a ficheros zip, sino que se puede introducir un fichero PDF en un fichero gif, html o incluso en un URI (aunque esto en realidad no funciona). ¿Consecuencia? La mayor parte de los antivirus no están bien preparados para detectar esto, y la mayor parte de los virus PDF hoy no son detectados... así que si ya les tengo un poco de manía a los PDF por lo que tardan en verse en Adobe Reader o su plug-in (en Mac OS X no pasa ;-p), cada vez los abriré menos.

La charla se termina con múltiples ejercicios interesantes que se podrían hacer con PDF, entre los que más interesantes estarían:
  • Escribir un quine en PDF. Aunque esto ya existe, entiendo que la dificultad está en que en lugar y/o además de imprimirse en el visor se duplique en otro fichero, aunque con ese punto de partida debería ser fácil (aunque hace falta más que la presentación y un par de horas... al menos para mí).
  • Dado que la capacidad gráfica de PDF es tan grande (puede multiplicar tensores de datos sin pestañear demasiado), otra manera  de esconder cosas dentro de un PDF es tener arrays de datos aparentemente inocentes y que mediante un par de operaciones gráficas extraigan su "shellcode".
  • Mi favorita: crear fractales dentro de PDF mediante las operaciones gráficas simil-Postscript. Ya va siendo hora de actualizar mi firma Postscript a un lenguaje más moderno...

No hay comentarios:

Publicar un comentario