Detectar y prevenir el comportamiento de "teléfono en casa" en archivos PDF

19

He recibido varios documentos PDF por correo electrónico de alguien en quien no confío. Necesito leer los documentos y responderlos. No están encriptados.

Quiero asegurarme de que los documentos sean completamente seguros.

Los escanee con varios productos antivirus. No se detectaron problemas.

Puedo verlos desde mi correo web, pero quiero descargarlos y verlos directamente y guardarlos para mis registros.

Me preocupa que si abro los archivos en un lector / visor / editor de PDF, es posible que los documentos contengan algo que intente conectarse a un servidor para enviar un "ping" que indique que he abierto el documento.

¿Es posible que un documento PDF haga eso? Si es así, ¿cómo puedo determinar si alguno de estos documentos está configurado para hacer eso? Además, además de desconectarme de Internet, ¿cómo puedo evitarlo?

    
pregunta Tim 19.12.2014 - 05:00
fuente

4 respuestas

20

¿Es posible que los documentos PDF marquen en casa?

Sí, al menos con los productos de Adobe Reader (consulte aquí ):

  

Además de los enlaces visibles en un documento PDF, los campos de formulario pueden contener llamadas de JavaScript ocultas que abren una página en un navegador o solicitan silenciosamente datos de Internet.

¿Cómo puedo saber si un pdf en particular hace esto?

Estoy seguro de que hay una manera de hacer esto, pero no sé qué es. Posiblemente el lector de pdf de adobe le muestre qué funciones utiliza un documento en particular, pero no las uso, por lo que realmente no sé. Yo diría que la pregunta más importante es ...

¿Cómo me protejo de un archivo PDF que llama a mi casa?

Primero, debo decir que el análisis antivirus NO es la forma de hacerlo. Por un lado, "marcar a casa" no es un virus en un pdf, solo es el uso de una característica "legítima". Por otra parte, el escaneo de virus es un modelo de seguridad roto: un nuevo virus superará los escáneres cada vez.

Afortunadamente, es posible deshabilitar varias opciones, como enlaces web y JavaScript, utilizando las preferencias del lector (consulte aquí , por ejemplo, tenga en cuenta que el término de Adobe" enlaces a Internet "no se refiere a los hipervínculos habituales, como la web, sino a las conexiones reales). Probablemente desee deshabilitar permanentemente el acceso a Internet y JavaScript: muy rara vez necesita estas funciones, y solo exponen posibles problemas.

Hablando en términos prácticos, esto es realmente todo lo que necesita hacer para mantenerse a salvo.

Sin embargo ...

A lo largo de los años, también se han descubierto vulnerabilidades en varios visores de pdf, lo que hace posible que un pdf especialmente diseñado haga cosas desagradables como ejecutar código arbitrario. También hay formas de mitigar esto: las versiones modernas de adobe reader tienen un sandbox incorporado que puede habilitar, consulte aquí .

Suponiendo que está ejecutando en un sistema que mantiene parcheado, esto probablemente no sea un gran riesgo. Si necesita asegurarse extra, utilice una máquina virtual (como VMWare o VirtualBox ). Sugeriría este procedimiento:

  • Cree una máquina virtual e instale el software de lector de pdf en ella
  • Configure una carpeta compartida entre la máquina host y la máquina virtual
  • Use esta carpeta compartida para copiar los archivos pdf a la máquina virtual.
  • Apague la máquina virtual, deshabilite su red y las carpetas compartidas
  • Tome una instantánea del estado del disco duro de la máquina virtual
  • reinicie la máquina virtual y vea los archivos pdf. Dado que la red y los archivos compartidos están deshabilitados, no debería haber manera de que nada desagradable en los archivos pdf salga de la máquina virtual.
  • cuando haya terminado, apague la máquina virtual y vuelva al estado de control. Ahora, todo lo malo que los archivos PDF podrían haber hecho en nuestra máquina virtual se ha ido.

Sin embargo ...

Dicho todo esto, teóricamente podría ser posible que existan fallas en el software de virtualización que permitan que se escape algo más desagradable en el archivo pdf. Estábamos en el ámbito de la paranoia extrema con la máquina virtual, IMHO, y ahora estamos muy lejos, pero por el bien de la integridad, una máquina física con espacio de aire sería una opción aún más segura.

(Como sugiere el comentario de Deer Hunter, usar hardware físico que no esté conectado a ninguna red que destruyas después sería aún más seguro, aunque nos estamos volviendo paranoicos exponencialmente por minuto).

    
respondido por el stochastic 19.12.2014 - 06:52
fuente
12

No tengo suficiente reputación para comentar, pero me gustaría agregar a la respuesta de dotancohen. Si quieres leer un PDF en texto plano, pdftk es una herramienta gratuita increíble.

Simplemente ejecuta un comando como:

pdftk input.pdf output out.pdf uncompress

y todas las secuencias de contenido comprimido se descomprimirán. La estructura (como los números de objetos) puede cambiar un poco, pero esto permitirá un análisis simple de cadenas conocidas como '/ JavaScript' con sus herramientas favoritas.

Es posible que deba revisar la especificación de PDF para ver si es suficiente, pero debería comenzar. Una herramienta lista para usar o una máquina virtual con firewall es más segura si no tiene el tiempo o el interés para esto.

    
respondido por el Nick P 19.12.2014 - 11:54
fuente
4

Para esta página puede descargar archivos PDF con scripts de ejemplo. . Descargué éste .

Como experimento, ejecuté el archivo a través de strings y usé grep para buscar JavaScript:

$ strings JSPopupCalendar.pdf | grep -i java
<</JavaScript 251 0 R/EmbeddedFiles 243 0 R>>
<</S/JavaScript/JS 253 0 R>>
<</S/JavaScript/JS(\n\r\n       /* Set day 18 */\r\n    FormRouter_SetCurrentDate\("18"\);\r)>>
<</S/JavaScript/JS(\nFormRouter_PlaceCalendar\(this.getField\("FormDateField"\), false, "mmmm dd, yy"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 17 */\r\n    FormRouter_SetCurrentDate\("17"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 26 */\r\n    FormRouter_SetCurrentDate\("26"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 16 */\r\n    FormRouter_SetCurrentDate\("16"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 31 */\r\n    FormRouter_SetCurrentDate\("31"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 15 */\r\n    FormRouter_SetCurrentDate\("15"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 25 */\r\n    FormRouter_SetCurrentDate\("25"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 14 */\r\n    FormRouter_SetCurrentDate\("14"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /*  Set day 13 */\r\n   FormRouter_SetCurrentDate\("13"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 24 */\r\n    FormRouter_SetCurrentDate\("24"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 12 */\r\n    FormRouter_SetCurrentDate\("12"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 30 */\r\n    FormRouter_SetCurrentDate\("30"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 21 */\r\n    FormRouter_SetCurrentDate\("21"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 23 */\r\n    FormRouter_SetCurrentDate\("23"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 10 */\r\n    FormRouter_SetCurrentDate\("10"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 9 */\r\n     FormRouter_SetCurrentDate\("9"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 22 */\r\n    FormRouter_SetCurrentDate\("22"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 8 */\r\n     FormRouter_SetCurrentDate\("8"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 29 */\r\n    FormRouter_SetCurrentDate\("29"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 7 */\r\n     FormRouter_SetCurrentDate\("7"\);\r)>>
<</S/JavaScript/JS(\n/* Set day 1 */\r\nFormRouter_SetCurrentDate\("1"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 6 */\r\n     FormRouter_SetCurrentDate\("6"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 28 */\r\n    FormRouter_SetCurrentDate\("28"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 5 */\r\n     FormRouter_SetCurrentDate\("5"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 20 */\r\n    FormRouter_SetCurrentDate\("20"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 4 */\r\n     FormRouter_SetCurrentDate\("4"\);\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 3 */\r\n     FormRouter_SetCurrentDate\("3"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 19 */\r\n    FormRouter_SetCurrentDate\("19"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n/* Set day 2 */\r\nFormRouter_SetCurrentDate\("2"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 27 */\r\n    FormRouter_SetCurrentDate\("27"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 11 */\r\n    FormRouter_SetCurrentDate\("11"\);\r)>>
<</S/JavaScript/JS(\nFormRouter_PlaceCalendar\(this.getField\("DateTest2"\), true, "ddd mmm d, yyyy"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 23 */\r\n    FormRouter_SetCurrentDate\("23"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 24 */\r\n    FormRouter_SetCurrentDate\("24"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 25 */\r\n    FormRouter_SetCurrentDate\("25"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 26 */\r\n    FormRouter_SetCurrentDate\("26"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 27 */\r\n    FormRouter_SetCurrentDate\("27"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 28 */\r\n    FormRouter_SetCurrentDate\("28"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 29 */\r\n    FormRouter_SetCurrentDate\("29"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 30 */\r\n    FormRouter_SetCurrentDate\("30"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 31 */\r\n    FormRouter_SetCurrentDate\("31"\);\r)>>
<</S/JavaScript/JS(\n/* Set day 1 */\r\nFormRouter_SetCurrentDate\("1"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\nFormRouter_PlaceCalendar\(this.getField\("FormDateField.1"\), false, "mmm d, yyyy"\);\r\n\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\nFormRouter_PlaceCalendar\(this.getField\("DateTest1"\), false, "mm/dd/yyyy"\);\r\n\r\n\r\n\r\n\r)>>
<</S/JavaScript/JS(\n/* Set day 2 */\r\nFormRouter_SetCurrentDate\("2"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 3 */\r\n     FormRouter_SetCurrentDate\("3"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 4 */\r\n     FormRouter_SetCurrentDate\("4"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 5 */\r\n     FormRouter_SetCurrentDate\("5"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 6 */\r\n     FormRouter_SetCurrentDate\("6"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 7 */\r\n     FormRouter_SetCurrentDate\("7"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 8 */\r\n     FormRouter_SetCurrentDate\("8"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 9 */\r\n     FormRouter_SetCurrentDate\("9"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 10 */\r\n    FormRouter_SetCurrentDate\("10"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 11 */\r\n    FormRouter_SetCurrentDate\("11"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 12 */\r\n    FormRouter_SetCurrentDate\("12"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /*  Set day 13 */\r\n   FormRouter_SetCurrentDate\("13"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 14 */\r\n    FormRouter_SetCurrentDate\("14"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 15 */\r\n    FormRouter_SetCurrentDate\("15"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 16 */\r\n    FormRouter_SetCurrentDate\("16"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 17 */\r\n    FormRouter_SetCurrentDate\("17"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 18 */\r\n    FormRouter_SetCurrentDate\("18"\);\r)>>
<</S/JavaScript/JS(\n\r\n\r\n   /* Set day 19 */\r\n    FormRouter_SetCurrentDate\("19"\);\r\n\r\n\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 20 */\r\n    FormRouter_SetCurrentDate\("20"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 21 */\r\n    FormRouter_SetCurrentDate\("21"\);\r)>>
<</S/JavaScript/JS(\n\r\n       /* Set day 22 */\r\n    FormRouter_SetCurrentDate\("22"\);\r)>>
<</S/JavaScript/JS(\n\r\n\r)>>
<</S/JavaScript/JS 233 0 R>>
<</S/JavaScript/JS(\n\r\nif\(!event.willCommit\)\r\n{\r\n  FormRouter_SetDays\(parseInt\(event.changeEx\), parseInt\(getField\("FR_00000_Calendar.CalendarYear"\).value\)\);\r\n}\r\n\r\n\r\n\r\n\r\n\r)>>
               <rdf:li>JavaScript</rdf:li>

No puedo asegurar que todos los archivos PDF con Javascript tengan el Javascript visible con strings . Sin embargo, marcar de esta manera sería un buen primer paso.

    
respondido por el dotancohen 19.12.2014 - 10:58
fuente
0

Como se ha indicado, es posible hacer que un documento PDF llame a casa.

Esto normalmente se hace iniciando una URL, principalmente cuando se abre el documento.

Probablemente, el enfoque más sencillo y pragmático sería utilizar un visor de PDF muy tonto (que no conoce Acciones, etc.) y desconectar la máquina de la red antes de iniciar el visor (y volver a conectar después de salir).

Sin embargo, desea conservar el PDF para sus registros. En este caso, tendría que "sanearlo", y para eso necesitaría algo mejor que un visor de PDF.

Una posibilidad sería utilizar Acrobat (mientras la máquina está desconectada de la red), busque el PDFOptimizer (en Acrobat XI, acceda al menú Archivo - > Guardar como otro ... - > PDF optimizado) . En ese cuadro de diálogo, tiene bastantes opciones para eliminar elementos activos, etc. Se dice que esto es lo suficientemente confiable y que debería hacerlo.

Si tiene una mayor cantidad de archivos para procesar, puede consultar algunos productos de Appligent; si recuerdo correctamente, hay una utilidad que elimina correctamente el PDF de cualquier elemento activo (y, como no es un visor de PDF, el documento no tiene posibilidad de llamar a casa).

    
respondido por el Max Wyss 20.12.2014 - 20:24
fuente

Lea otras preguntas en las etiquetas