Je publie mes photos sous licence Creative Common Attribution-Noncommercial-ShareAlike qui permet leur réutilisation pourvue que celle-ci ne soit pas commerciale, que la provenance en soit citée et qu'elles soient redistribuée sous les mêmes conditions. Si on peut discuter l'aspect non commercial du blog en question, il n'y est clairement pas fait mention de l'auteur des photos. Alors non, je ne vais bien sûr pas en faire une jaunisse. C'est comme ça. Il est des gens qui ne respectent pas les licences. Et d'autres, comme Nico Waisman, qui le font spontanément. Et je les en remercie.

Mais ce n'est pas l'effet Calimero qui motive ce billet, ou si peu. C'est surtout un excellent prétexte pour vous parler d'une source apparemment méconnue de fuite d'information dans les images JPEG. J'ai nommé les données EXIF[1]. Ce sont des métadonnées ajoutées à certains formats, en particulier le format JPEG, lors de la génération de l'image. Ces données fournissent des informations supplémentaires sur l'image, sous forme de tags, lesquels peuvent être lus et/ou altérés par les logiciels utilisés pour visionner ou modifier les images. Et il existe évidemment des logiciels spécifiquement dédiés à l'affichage et la manipulation de ces tags. Mon préféré est Exiv2, et c'est celui que j'utiliserai dans la suite du billet.

Ainsi, si on regarde les tags de l'image qui me châtouille l'égo, dont vous pouvez trouver une copie sur ce serveur[2], voici ce qu'on obtient :

~$ exiv2 pacsec2007_dragos_small.jpg 
File name       : pacsec2007_dragos_small.jpg
File size       : 109425 Bytes
Camera make     : PENTAX Corporation 
Camera model    : PENTAX K100D       
Image timestamp : 2007:11:30 06:18:29
Image number    :
Exposure time   : 1/15 s
Aperture        : F5.6
Exposure bias   : 0
Flash           : No, compulsory
Flash bias      :
Focal length    : 55.0 mm
Subject distance:
ISO speed       : 800
Exposure mode   : Auto
Metering mode   : Multi-segment
Macro mode      :
Image quality   :
Exif Resolution : 3008 x 2000
White balance   :
Thumbnail       : JPEG, 5086 Bytes
Copyright       :
Exif comment    :

On y trouve donc une foule d'informations comme le nom et la taille de l'image, le type d'appareil utilisé, les conditions de prise de la photographie, la résolution, etc. Il y en a d'autres qui ne sont pas affichées ici, ayant choisi de vous montrer la sortie simple. Si maintenant vous prenez la photo que je soupsonne être l'originale de la précédente, voici les informations obtenues :

~$ exiv2 img-167.jpg 
File name       : dscf0697123.jpg
File size       : 2093695 Bytes
Camera make     : PENTAX Corporation 
Camera model    : PENTAX K100D       
Image timestamp : 2007:11:30 06:18:29
Image number    :
Exposure time   : 1/15 s
Aperture        : F5.6
Exposure bias   : 0
Flash           : No, compulsory
Flash bias      :
Focal length    : 55.0 mm (35 mm equivalent: 82.0 mm)
Subject distance:
ISO speed       : 800
Exposure mode   : Auto
Metering mode   : Multi-segment
Macro mode      :
Image quality   :
Exif Resolution : 3008 x 2000
White balance   :
Thumbnail       : JPEG, 5086 Bytes
Copyright       :
Exif comment    :

Que remarque-t-on ? Qu'à part le nom et la taille de l'image, tous les autres tags ont la même valeur. À supposer que ce ne soit pas la même photo, l'auteur possèderait donc le même appareil que moi, aurait pris sa photo au même moment[3] et dans les mêmes conditions. Autant dire que c'est très peu probable. Évidemment, on voit bien que l'image a été redimensionnée. C'est confirmé par un autre tag EXIF qui n'apparait qu'avec une sortie plus étoffée : Exif.Image.Software.

Leur image :

~$ exiv2 -pt pacsec2007_dragos_small.jpg 
[...]
Exif.Image.Software               Ascii      16  Paint.NET v3.20

La mienne :

~$ exiv2 -pt img-167.jpg
[...]
Exif.Image.Software                Ascii      24  K100D Ver 1.00

On sait donc que c'est Paint.NET, dernière version, qui a été utilisé pour effectuer cette opération. Mais ce n'est pas tout. Vous aurez sans doute remarqué le tag Thumbnail. Ce tag indique que le bloc de données EXIF contient un aperçu de l'image, et que sa taille est approximativement de 5Ko. Dans le deux cas, le thumbnail fait la même taille. Et si on les comparait ? On s'apercevrait évidemment qu'il s'agit des mêmes :

~$ exiv2 -et pacsec2007_dragos_small.jpg
~$ exiv2 -et img-167.jpg
~$ diff pacsec2007_dragos_small-thumb.jpg img-167-thumb.jpg
~$ echo $?
0

Avec autant d'indices, il me semble difficile de nier la provenance de cette image, ammésie ou pas.


Mais ce que je veux vous montrer ici, c'est que non seulement les images JPEG embarquent des données EXIF, mais qu'en plus, elles peuvent survivre aux manipulations qu'on peut leur faire subir. Ce qui permet souvent d'en tracer l'origine, comme ici, et les modification, mettant à défaut les tentatives de modification ou de dissimulation d'éléments. Ainsi, à l'instar de l'étude des entêtes binaires de documents électroniques, l'étude des aperçus EXIF peut révéler des informations intéressantes sur la source d'une image JPEG.

C'est cet aspect qu'avaient étudié en 2004 Maximilian Dornseif et Steven J. Murdoch suite à quelque incident resté célèbre depuis. Leurs conclusions ont fait l'objet d'une présentation au CCC Congress et même d'un advisory. C'est dire si ça avait pu surprendre du monde à l'époque, dans la mesure où la plupart des gens pensaient que le thumbnail était systématiquement regénéré après retouche. De nombreux autres exemples peuvent être trouvés sur le net. Je vous laisse en tirer les conclusions que vous voulez...

Forcément, la question qui suit sera probablement de savoir comment on peut supprimer ou modifier ce satané thumbnail. Avec Exiv2, c'est relativement simple :

~$ exiv2 -dt pacsec2007_dragos_small.jpg
~$ exiv2 pacsec2007_dragos_small.jpg
[...]
Thumbnail       : None

Notez qu'on peut également insérer, et donc remplacer, un thumbnail dans une image existante. Ainsi, pour réintégrer le thumbnail extrait précédemment dans notre image[4], on procède ainsi :

~$ exiv2 -it pacsec2007_dragos_small.jpg
~$ exiv2 pacsec2007_dragos_small.jpg
[...]
Thumbnail       : JPEG, 5086 Bytes


De manière plus générale, modifier un document électronique quel qu'il soit demande bien souvent un peu plus qu'une simple édition. C'est en particulier le cas des formats propriétaires ou aux fonctionnalités étendues. C'est ce qu'ont appris à leur dépens les militaires américains lors de la publication du rapport d'enquête sur la mort de Nicola Calipari lors de la libération de la journaliste italienne Giuliana Sgrena. Ce document, initialement rédigé sous Word, avait vu des portions de texte, en particulier les noms des protagonistes, masquées par des blocs noirs. Il avait ensuite été converti au format PDF avec Acrobat PDFMaker.

Sauf que ce faisant, PDFMaker a conservé l'ensemble du texte original sous forme de texte, et les blocs sous forme d'objets graphiques. Jusque là, rien de bien méchant. Sauf que... Sauf que si vous faites un copier-coller du texte du document, vous copiez tout le texte, y compris celui caché par les blocs, mais sans les blocs, s'agissant d'objets graphiques. Une sélection complète du texte suivi d'un copier-coller donne donc l'intégralité du document original. Pas de bol. C'est le journal italien Corriere Della Serra qui avait à l'époque publié l'information ainsi que les documents. Ceci dit, rien que l'étude des propriétés du PDF retournait déjà un nom...

Plus loin dans le passé, on se souviendra du communiqué de presse au format Word publié par Alcatel suite à l'annonce de vulnérabilités sur les modem ADSL Speedtouch. Il suffisait d'activer le suivi des modifications pour voir apparaître plusieurs retouches du document, avec des passages pour le moins croustillants...

Et si on revient à nos images JPEG et leur thumbnail, que penser des photos publiées avec un visage masqué, une URL brouillée, ou tout autre élément que l'auteur aurait voulu garder confidentiel en modifiant l'image ? Quand vous vous balladez sur le web, amusez-vous à étudier les images dont certaines parties sont cachées. Vous verrez, c'est édifiant...


Au-delà du prétexte que cet incident m'a donné de vous parler des données EXIF et des fuites d'informations associées, il m'a aussi fait prendre conscience qu'on ne pouvait pas juste se contenter d'afficher sa licence de publication en bas de la page web donnant accès aux images. Il faut l'ajouter directement dans les données EXIF, dans le champ Exif.Image.Copyright typiquement. C'est donc ce que j'ai fait pour l'ensemble des images de ma gallerie de photos. Avec Exiv2, évidemment...

Ça n'empêchera certes pas les gens de me voler mes photos, mais bon...


Et s'il fallait encore démontrer que les données EXIF sont une source d'inspiration :

Notes

[1] Exchangeable Image File Format.

[2] M'en fout, c'est mon image, je peux la copier et la rediffuser ;)

[3] Avec le même décalage horaire au passage...

[4] Le thumbnail doit être au format JPEG et s'appeler file-thumb.jpg, donc pacsec2007_dragos_small-thumb.jpg ici.