Rilevamento e prevenzione del comportamento di "casa del telefono" nei file PDF

19

Ho ricevuto diversi documenti PDF via email da qualcuno di cui non mi fido. Ho bisogno di leggere i documenti e rispondere a loro. Non sono crittografati.

Voglio assicurarmi che i documenti siano completamente al sicuro.

Li ho scansionati con più prodotti antivirus. Nessun problema rilevato.

Sono in grado di visualizzarli dalla mia webmail, ma voglio scaricarli e visualizzarli direttamente e conservarli per i miei record.

Sono preoccupato che se apro i file in un lettore / visualizzatore / editor PDF, i documenti potrebbero avere qualcosa in essi che proveranno a connettersi a un server per inviare un "ping" che indica che ho aperto il documento.

È possibile che un documento PDF lo faccia? In tal caso, come posso determinare se uno di questi documenti è impostato per farlo? Inoltre, oltre a disconnettermi da Internet, come posso impedirlo?

    
posta Tim 19.12.2014 - 05:00
fonte

4 risposte

20

È possibile comporre i documenti PDF a casa?

Sì, almeno con i prodotti di Adobe Reader (vedi qui ):

In addition to visible links in a PDF document, form fields can contain hidden JavaScript calls that open a page in a browser or silently requests data from the Internet.

Come posso sapere se un particolare file PDF fa questo?

Sono certo che c'è un modo per farlo, ma non so cosa sia. Forse il lettore di Adobe PDF ti mostrerebbe quali sono le caratteristiche di un particolare documento, ma io non li uso, quindi non lo so davvero. Direi che la domanda più importante è ...

Come faccio a proteggermi da un file PDF che chiama home?

In primo luogo, dovrei dire che la scansione anti-virus NON è il modo per farlo. Per prima cosa, "chiamare casa" non è un virus in un pdf, è solo l'uso di una funzionalità "legittima". Inoltre, la scansione antivirus è una specie di modello di sicurezza rotto: un nuovo virus supererà gli scanner ogni volta.

Fortunatamente, è possibile disabilitare un numero di opzioni come i collegamenti web e JavaScript usando le preferenze di Reader (vedi qui ad esempio, si noti che il termine Adobe" collegamenti a Internet "non si riferisce ai normali collegamenti ipertestuali come il web, ma le connessioni effettive). Probabilmente vuoi disabilitare permanentemente l'accesso a Internet e JavaScript: molto raramente hai bisogno di queste funzionalità, e loro espongono solo potenziali problemi.

In pratica, questo è tutto ciò che devi fare per restare al sicuro.

Tuttavia ...

Nel corso degli anni, inoltre, sono state scoperte vulnerabilità in vari visualizzatori di file PDF, rendendo possibile la realizzazione di un PDF appositamente predisposto per fare cose brutte come eseguire codice arbitrario. Ci sono modi per mitigare anche questo: le versioni moderne di Adobe Reader hanno una sandbox integrata che puoi abilitare, vedi here .

Supponendo che tu stia correndo su un sistema che mantieni una patch, questo probabilmente non è un grosso rischio. Se hai bisogno di fare extra extra sicuro, utilizzando una macchina virtuale (come VMWare o VirtualBox ). Vorrei suggerire questa procedura:

  • Crea una macchina virtuale e installa su di essa il software di lettura del pdf
  • Configura una cartella condivisa tra il computer host e la macchina virtuale
  • Utilizza questa cartella condivisa per copiare i file PDF sulla macchina virtuale.
  • Spegni la macchina virtuale, disattiva la sua rete e le cartelle condivise
  • Scatta un'istantanea dello stato del disco rigido della macchina virtuale
  • riavvia la macchina virtuale e visualizza i file pdf. Dal momento che la rete e i file condivisi sono disabilitati, non dovrebbe esserci modo di fare qualcosa di sgradevole nei file pdf per uscire dalla macchina virtuale.
  • una volta terminato, spegni la macchina virtuale e ripristina lo stato sul checkpoint. Ora tutto quello che potrebbe aver fatto il pdf alla nostra macchina virtuale è andato storto.

Tuttavia ...

Tutto ciò detto, potrebbe essere teoricamente possibile che ci siano dei difetti nel software di vitualizzazione che consente a qualcosa di extra fastidioso nel file pdf di sfuggire. Eravamo nel regno dell'estrema paranoia con la macchina virtuale, IMHO, e ora siamo fuori strada, ma per completezza, una macchina fisica con aria compressa sarebbe un'opzione ancora più sicura.

(Come suggerisce il commento di Deer Hunter, l'uso di hardware fisico non connesso a una rete che successivamente distruggi sarebbe ancora più sicuro, anche se in un momento esponenziale diventiamo sempre più paranoici).

    
risposta data 19.12.2014 - 06:52
fonte
12

Non ho abbastanza reputazione per commentare, ma vorrei aggiungere alla risposta di dotancohen. Se vuoi leggere un PDF in testo semplice pdftk è un fantastico strumento gratuito.

Esegui semplicemente un comando come:

pdftk input.pdf output out.pdf uncompress

e tutti i flussi di contenuti compressi non saranno compressi. La struttura (come i numeri dell'oggetto) potrebbe cambiare leggermente, ma ciò consentirà un semplice parsing di stringhe note come "/ JavaScript" con i tuoi strumenti preferiti.

Potrebbe essere necessario consultare le specifiche del PDF per vedere se è abbastanza, ma dovrebbe iniziare. Uno strumento pronto o una VM firewallata è più sicuro se non si ha il tempo o l'interesse per questo.

    
risposta data 19.12.2014 - 11:54
fonte
4

Per questa pagina è possibile scaricare file PDF con script di esempio . Ho scaricato questo .

Come esperimento ho eseguito il file attraverso strings e ho utilizzato grep per cercare 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>

Non posso garantire che tutti i file PDF con Javascript abbiano il Javascript visibile con strings . Tuttavia, il controllo in questo modo sarebbe un buon primo passo.

    
risposta data 19.12.2014 - 10:58
fonte
0

Come è stato affermato, è possibile effettuare una chiamata di un documento PDF a casa.

Normalmente questo viene fatto lanciando un URL, soprattutto quando il documento si apre.

Probabilmente l'approccio più semplice e pragmatico sarebbe utilizzare un visualizzatore PDF molto stupido (che non conosce Azioni ecc.) e disconnettere la macchina dalla rete prima di avviare il visualizzatore (e riconnetterti dopo aver chiuso).

Tuttavia, si desidera mantenere il PDF per i propri record. In questo caso, dovresti "sanitizzarlo", e per questo avresti bisogno di qualcosa di meglio di un visualizzatore PDF muto.

Una possibilità sarebbe usare Acrobat (mentre la macchina è disconnessa dalla rete), individuare il PDFOptimizer (in Acrobat XI, si ottiene con il menu File - > Salva come altro ... - > PDF ottimizzato) . In questa finestra di dialogo, ci sono alcune opzioni per rimuovere gli elementi attivi, ecc. Si dice che sia sufficientemente affidabile, e che dovrebbe farlo.

Se hai un numero maggiore di file da elaborare, potresti guardare alcuni prodotti da Appligent; se ricordo bene, c'è un'utilità che spoglia correttamente il PDF da qualsiasi elemento attivo (e, poiché non è un visualizzatore PDF, il documento non ha alcuna possibilità di chiamare casa).

    
risposta data 20.12.2014 - 20:24
fonte

Leggi altre domande sui tag