PNG, pas TXT : identifier un fichier grâce à ses octets de signature
Le défi
Un fichier nommé notes.txt est apparu dans un dossier de téléchargements, mais un éditeur de texte n'affiche que du charabia. Ouvrez-le dans la visionneuse hexadécimale, comparez les premiers octets aux signatures de référence, et indiquez le vrai type de fichier.
Ce que tu vas apprendre
- Reconnaître la signature PNG de 8 octets 89 50 4E 47 0D 0A 1A 0A
- Lire les octets 50 4E 47 comme les lettres ASCII PNG
- Expliquer qu'un fichier texte n'a pas de signature fixe et ne peut donc pas correspondre à cet en-tête
- Repérer le bloc IHDR qui suit chaque en-tête PNG
- Distinguer PNG de GIF, PDF et ZIP grâce à leurs premiers octets
Compétences testées
Prérequis
- Être à l'aise avec la lecture de valeurs hexadécimales
- Savoir que renommer un fichier ne modifie pas son contenu
Comment ça marche
L'extension d'un fichier ne fait que partie de son nom et peut être changée en une seconde, mais les octets à l'intérieur suivent un format. La plupart des formats binaires commencent par une signature fixe (nombre magique) qui les identifie indépendamment du nom. Un fichier texte brut est l'exception : il n'a pas d'en-tête obligatoire, seulement des caractères. Donc si un fichier .txt commence par une signature binaire connue, l'extension est fausse.
La signature PNG fait huit octets : 89 50 4E 47 0D 0A 1A 0A. Les trois octets du milieu, 50 4E 47, sont les lettres ASCII PNG. Les octets qui les entourent forment un contrôle d'intégrité astucieux : l'octet initial 89 est un octet non-ASCII qui casse si le fichier est traité par erreur comme du texte, et la fin 0D 0A 1A 0A détecte la corruption des fins de ligne lors de transferts qui altèrent les retours à la ligne. Juste après la signature vient le bloc IHDR (on peut voir 49 48 44 52 = 'IHDR' dans les octets), qui porte les dimensions de l'image.
La liste de référence oppose PNG à d'autres images et documents. GIF commence par 47 49 46 38 ('GIF8'), PDF par 25 50 44 46 ('%PDF'), et ZIP par 50 4B 03 04 ('PK'). Aucun ne correspond, donc la seule réponse cohérente est PNG.
Erreurs fréquentes
- Faire confiance à l'extension .txt. Le nom indique du texte, mais les fichiers texte n'ont pas de signature magique, et celui-ci en a clairement une.
- Mal lire l'octet initial 89. C'est un octet non imprimable délibéré ; ne le laissez pas masquer le
PNGlisible qui suit. - Confondre PNG avec GIF. Les deux sont des images, mais GIF commence par
47 49 46 38, pas89 50 4E 47. - Répondre 'image' de façon générique. La consigne demande le type précis, et la signature en désigne exactement un : PNG.
Comment s'en protéger
Les systèmes qui acceptent ou stockent des fichiers doivent les identifier par leur contenu, jamais par le nom ou l'extension fournis.
- Utilisez une vérification de type basée sur le contenu (libmagic ou équivalent) sur les téléversements plutôt que de faire confiance à l'extension.
- Si vous n'autorisez que le texte, rejetez les fichiers dont les premiers octets correspondent à une signature binaire connue.
- Lors du rendu de contenu utilisateur, définissez le type de réponse à partir du type réel validé, pas du type déclaré, pour éviter toute confusion de content-type.
- Mettez en quarantaine et examinez les fichiers dont l'extension et le type détecté ne correspondent pas, car un décalage est souvent délibéré.