Guida all'uso di JPGScan
aggiornata al 05/01/05





Cos'è JPGScan?
JPGScan è un programma realizzato per essere eseguito in ambiente MS-DOS o sotto il prompt dei comandi in ambiente Windows e serve per analizzare i file .jpg alla ricerca di contenuto sospetto o per verificare la presenza di potenziali exploit.
Come si usa?
Da una finestra del prompt dei comandi digitare:

jpgscan percorso_nome_file

dove percorso_nome_file sta per il nome comprensivo del percorso relativo alla jpeg da analizzare. Esempio:

jpgscan c:\immagini\prova.jpg

Essendo creato in QuickBasic 4.5 non sono previsti i nomi di file lunghi, percui sara' cura del utente modificare tali nomi o indicarli nel formato MS-DOS corrispondente (tipo prova~1.jpg).
Premuto <invio> il programma inizia la scansione del file jpeg riportando cio' che trova in termini di argomenti, salti, byte e commenti.
Durante l'analisi viene riportato nei commenti cio' a cui serve l'argomento, cosa indica.
Per facilitare il riconoscimento degli argomenti presenti nel file, vengono utilizzati colori differenti a seconda se si tratti di argomenti che possono o meno contenere dati potenzialmente pericolosi o informazioni nascoste.

Codici colori

  • Giallo
  • Verde
  • Blu
  • Bianco
  • Rosso

Il colore giallo indica l'inizio o la fine del file jpeg e deve essere presente solo all'inizio e alla fine del file stesso.
Il colore verde indica un argomento normalmente presente in tutti i file jpeg, che è necessario per la corretta visualizzazione della immagine.
Il colore blu indica un argomento giudicato 'insolito', ovvero che non e' necessario per la visualizzazione, ma che potrebbe contenere codice arbitrario.
Il colore bianco indica un argomento non considerato dal programma, non riconosciuto.
Il colore rosso indica che l'argomento potrebbe contenere qualsiasi tipo di dati, dannosi e/o nascosti.

Il programma, per gli argomenti FFFE e FFEE, riporta nella sezione commenti parte del contenuto del argomento stesso, includendo i tre puntini di sospensione nel caso che la lunghezza ecceda un determinato limite. Il contenuto di questi argomenti viene reinterpretato, onde evitare problemi di visualizzazione. Tutti i caratteri di controllo inferiori al carattere 32 (0x20) vengono indicati con un singolo carattere, il carattere 19 (0x13) tranne che il carattere 0 (0x0) che viene indicato con il carattere 20 (0x14).

Importanza nella distinzione dei caratteri
La distinzione tra i caratteri e il carattere 0 (null) è di grande importanza.
L'argomento FFFE che è la sezione destinata ai commenti nei file jpeg puo' includere qualsiasi tipo di dato, sia testuale che non. Alcuni programmi di grafica che visualizzano i commenti interrompono la visualizzazione del testo quando incontrano il carattere null, che viene usato come fine stringa. Questo è un grosso problema se non si è dotati di programmi in grado di riportare per intero il testo in quanto nella parte restante potrebbe esserci scritto qualcosa di importante, di qualsiasi tipo.

La complessità nella determinazione dei contenuti
A una analisi superficiale potrebbe risultare semplice affermare che è di bassa difficoltà determinare cosa sia pericoloso e cosa no.
Per pericoloso qui vogliamo intendere tutto ciò che non è determinabile e che non risulta necessario alla corretta visualizzazione della jpeg.
Il formato JPEG è tanto flessibile quanto problematico in quanto impone che i visualizzatori non controllino quegli argomenti che loro non riescono o non vogliono processare, forzando un jump all'argomento successivo.
E' proprio grazie a questo fatto che è possibile includere quanti argomenti vogliamo, magari anche tutti dello stesso tipo come i commenti più gli argomenti base per l'immagine.
Un altro aspetto importante risulta anche dal fatto che a volte in presenza di un numero arbitrario di argomenti di commento i programmi di grafica tendono a visualizzare solo l'ultimo o il primo.
Nei file JPEG viene definita una serie di argomenti FFEx che servono per ampliare le informazioni riguardo il file, i contenuti, l'autore e informazioni sul tipo e modo d'uso della macchina fotografica digitale dove x va da 0 a F per un totale di 16 diversi tipi di applicazioni differenti.
Il tipo comune è lo 0 (FFE0) che è l'header JFIF. L'altro tipo piu comune che riguarda le macchine digitali è l'header Exif (FFE1) che include ogni sorta di informazione a riguardo, dal nome dell'autore alle specifiche sull'esposizione e modalità utilizzata.
Gli altri tipi sono a discrezione di chi produce i software per la visualizzazione e la creazione delle immagini JPEG. Il più comune è stato introdotto dalla Adobe ed è il FFED insieme al FFEE, utilizzati con Photoshop.
Essendo non determinabili gli altri argomenti applicazione, non è possibile risalire al tipo di contenuto e al suo indirizzamento. Qui sorge un problema.
Come possiamo capire se un contenuto può essere un dato importante o meno?
L'unico modo risiede nello stare in dei limiti prefissati, ovvero ciò che ci si aspetta di trovare di nascosto.

Due esempi pratici di steganografia
  1. Un privato che vuole trasferire i suoi file piu sensibili della sua attivita' aziendale senza che vengano riconosciuti durante il trasporto.
  2. Un brigatista che vuole comunicare l'ora e il posto in cui avverrà il prossimo attentato.

Per comprendere la difficoltà si son scelti gli estremi e le relative difficoltà nella ricerca e nella classificazione dei contenuti.
Analizziamo caso per caso.

Nel primo caso abbiamo molto probabilmente una grossa quantità di dati da trasferire e quindi le modalità di inserimento all'interno di un file jpg sono le seguenti:
  • Utilizzo di molti argomenti, per esempio di commento all'interno del file.
  • Inserimento a fine file, dopo l'ultimo dichiaratore di fine immagine.
Naturalmente di tutto questo noi non ci accorgeremmo senza avere un programma specifico.
JPGScan visualizza tutti gli argomenti presenti nel file quindi in presenza di molti argomenti noi ce ne accorgeremmo subito a vista, senza grossi problemi. Un numero accettabile di argomenti normalmente si aggira sugli 6-11, non ripetuti.
Gli argomenti riportati in codice rosso e blu possono essere loggati e trascritti nel report di JPGScan per una successiva analisi.
Si veda la sezione riguardante il livello paranoia e i falsi positivi per saperne di più.
Nel caso in cui i dati vengano inseriti a fine immagine il programma lo indicherebbe subito e non vi è possibilità di confondere il programma in quanto ricerca manualmente la fine della immagine.
In questo caso i dati sarebbero esportati dal programma e successivamente si potrebbero analizzare in dettaglio.

Nel secondo caso, il caso del brigatista, le cose cambiano sostanzialmente.

Un'ora e una data, un luogo e un nome, sono tutti dettagli che occupano molto poco spazio in termini di byte e quindi possono essere nascosti molto più facilmente.

A questo punto si pone un grosso problema.
Come possiamo ricercare e catalogare una parola o una frase di senso potenzialmente compiuto o meno in uno spazio cosi grosso come possono essere l'insieme dei descrittori applicazione FFEx e commenti?
Il brigatista ha bisogno di poche lettere e numeri per trasmettere un informazione:
'101104 milano 0950' può essere gia abbastanza per compiere una strage.
Ciò può risiedere nei commenti come in un header Exif o in un altro dei 16 tipi applicazione esistenti e richiede solo 18 byte per l'esempio riportato.
Il caso può essere estremizzato ancora se si considera che tale stringa può essere compressa o codificata utilizzando un algoritmo specifico come può essere un AES-192.
La risposta alla domanda 'Come possiamo capire se un contenuto può essere un dato importante o meno?' è questa:
da ciò che ci aspettiamo e dal contesto in cui stiamo lavorando.

Se stessimo lavorando a un caso di indagine su presunto attentato allora dovremo lavorare con dettagli estremi, precisi e microscopici;
se stessimo lavorando a un caso di spionaggio industriale allora i dettagli saranno piu rarefatti e potremmo lavorare su scala macroscopica.

Il livello paranoia e falsi positivi
Dopo ciò che si è detto riguardo il livello a cui si sta lavorando si può iniziare a definire quindi altrettanti livelli di lavoro del programma, relativamente al nostro grado di ricerca.
Il programma prevede 3 livelli di logging.
Il logging avviene tutto nel file jpgscan.dat che viene creato al volo ad ogni sessione di jpgscan. Ogni avvio determina una sovrascrittura o cancellazione del file.
Il livello può essere dichiarato usando il comando /pX a fine stringa, sulla linea di comando al prompt, dove X indica un numero da 0 a 2 indicante il livello a cui vogliamo farlo lavorare.

0.    Livello base, logging dei soli eventuali dati accodati al file
1.    Livello intermedio, logging degli eventuali dati accodati e codici rossi
2.    Livello massimo. Logging di dati accodati, codici rossi e codici blu.

Non specificando alcun livello, il livello previsto di default è l'1.
Essendo i più comunemente usati, i commenti vengono visualizzati a schermo con le modifiche sopra riportate, onde evitare di dover per forza analizzare il file di report per poi scoprire che si trattava soltanto di semplici commenti.
In presenza dei tre puntini di sospensione, però, è tuttavia necessaria una analisi del report per verificare che dopo tali puntini non ci sia nulla di anomalo.
Si raccomanda sempre di fare molta attenzione alla presenza di caratteri nulli all'interno di una stringa, per i motivi già detti sopra.

Il file jpgscan.dat
All'avvio di ogni sessione di JPGScan il programma crea un file contenente tutti i dati raccolti ritenuti sospetti della jpg in esame.
Questi dati vengono trascritti dal file contenente l'immagine esattamente nel formato in cui sono riportati nel file. Ogni sezione ha il suo argomento, la sua lunghezza espressa in formato a due byte e i dati contenuti.
Le uniche eccezioni sono date dagli argomenti di inizio e fine immagine che non hanno lunghezza dati.
Quando il programma incontra dei dati 'appesi' in fondo al file li allega con l'argomento di fine immagine FFD9.



Inviaci i tuoi commenti,le segnalazioni, bugs e quant'altro a:
jpgscan-project@kernel32.it

Su


Copyright ©2005 kernel32