Passer au contenu
Les risques de sécurité liés aux métadonnées des photos

Les risques de sécurité liés aux métadonnées des photos

14 août 2019 vulnérabilité  métadonnées 

En photographie numérique, les métadonnées sont stockées à l'intérieur d'un fichier JPG et permettent de décrire un certain nombre d'informations complémentaires.

Elles sont réparties en 3 catégories (Source imatag.com) :

1 EXIF (Exchangeable image file format)

Le type EXIF contient principalement des informations techniques liées à la prise de vue.

  • Marque et Modèle
  • Date du cliché
  • Vitesse d'obturation
  • Exposition
  • Ouverture du diaphragme
  • Sensibilité (ISO)
  • Distance focale
  • Objectif
  • Flash activé ou désactivé
  • Source lumineuse
  • Coordonnées GPS
  • Copyright

2 IPTC (International Press Telecommunications Council)

Le type IPTC contient des informations enrichies manuellement par le photographe ou par des agences.

  • Nom de l'auteur
  • Adresse
  • Numéro de téléphone
  • Adresse email
  • Site web
  • Licence
  • Pays où a été prise la photo
  • Mots-clés

3 XMP (Extensible Metadata Platform)

Ce nouveau type permet de définir l'ensemble des informations précédentes et de les enrichir. Le format étant en XML, celui-ci peut être étendu simplement.

Les risques

Ces informations sont très utiles pour les photographes. Elles permettent d'enrichir les photos, améliore la traçabilité et la recherche par mots clés. Mais il est possible d'insérer dans ces données, grâce à des logiciels comme Exiftool, du code PHP qui pourra ensuite être exécuté une fois envoyé sur votre serveur.

exiftool -documentname='<?php echo "test"; ?>'

Si votre site contient le code suivant, alors le code PHP contenu dans le fichier exemple.jpg va s'exécuter :

include("exemple.jpg");

Solutions

Il est donc fortement déconseillé d'utiliser les fonctions include, require ou include_once pour intégrer une image depuis le PHP.

Il est également possible de supprimer toutes métadonnées d'une photo avec la librairie Gmagick :

$imageFilePath = 'exemple.jpg';
$i = new Gmagick();
$i->readImage($imageFilePath);
$i->setImageFormat('JPG');
$i->stripImage();
$i->profileImage('*', null);
$i->writeImage($imageFilePath);
$i->destroy();

La librairie Imagick permet également de faire la même chose :

$imageFilePath = 'exemple.jpg';
$img = new Imagick(realpath($imageFilePath));
$profiles = $img->getImageProfiles("icc", true);
$img->stripImage();

if(!empty($profiles)) {
	$img->profileImage("icc", $profiles['icc']);
}

Lors de l'envoi de fichiers depuis un formulaire (photos ou tout type de fichiers), il est obligatoire de vérifier sa validité. Ne jamais faire confiance à l'utilisateur ni à son navigateur. Côté serveur, on met en place plusieurs niveaux de vérification :

  • On vérifie l'extension du fichier pour qu'elle soit celle attendue. *.jpg ou *.png pour une photo, *.pdf pour un document...
  • On vérifie son type mime, si le fichier est réellement au format souhaité
  • On vérifie la taille du fichier
  • On supprime les métadonnées dans le cas d'envoi de photos
  • On envoie le fichier dans un répertoire non accessible, en dehors de la racine du site web, ou dans un répertoire ou il est interdit de lancer du php
  • On renomme le fichier pour éviter de garder le nom initial
  • Si possible, on lance une analyse anti-malware
Note : 5 - 9 votes Evaluer cet article
5

Par Thibaut Pietri

Ingénieur informatique spécialisé réseau, basé à Toulouse, j'ai plus de 20 ans d'expérience en développement et sécurisation de sites Internet, Extranet & applications mobiles autour des technologies LAMP (Linux/Apache/MySQL/PHP) sur différents outils de gestion de contenu (Wordpress, Prestashop, Drupal, Isens Evolution...).

Derniers articles

Aucun commentaire, soyez le premier !

 
Retour en haut de la page