PEM, pas JPG : repérer une clé privée derrière une extension d'image
Le défi
Un fichier nommé avatar.jpg a été trouvé dans le dossier d'uploads d'une application web, mais il ne s'affiche jamais comme une photo. Ouvrez-le dans la visionneuse hexadécimale, lisez les premiers octets en texte, comparez-les aux signatures de référence, et indiquez le vrai type de fichier.
Ce que tu vas apprendre
- Lire les premiers octets en ASCII et reconnaître l'en-tête PEM '-----BEGIN'
- Expliquer que PEM est une enveloppe texte en base64 pour les clés, certificats et CSR
- Reconnaître le préfixe base64 'MIIE' comme le début d'une clé encodée en DER
- Expliquer pourquoi un JPEG ne peut pas commencer par du texte imprimable (il débute par FF D8 FF)
- Distinguer PEM de JPEG, PNG et GZIP à partir de leurs premiers octets
Compétences testées
Prérequis
- Notions de base sur les clés privées et les certificats
- Aisance à convertir des octets hexadécimaux en caractères ASCII
Comment ça marche
Toutes les signatures ne sont pas binaires. PEM (Privacy-Enhanced Mail) est un format texte qui enveloppe du matériel cryptographique binaire - clés privées, certificats, demandes de signature de certificat - dans des lignes base64 encadrées par des lignes d'en-tête et de pied de page lisibles par un humain. Chaque bloc PEM commence par cinq tirets, le mot BEGIN, un libellé, puis cinq tirets supplémentaires, par exemple -----BEGIN PRIVATE KEY-----.
Dans ce fichier, les octets 2D 2D 2D 2D 2D sont cinq tirets, 42 45 47 49 4E correspond à BEGIN, et la suite forme PRIVATE KEY-----, suivi d'un saut de ligne et d'une ligne base64 commençant par MIIE. Ce préfixe MIIE est le signe caractéristique du début d'une clé RSA/PKCS encodée en DER une fois convertie en base64. Le fichier entier est donc du texte imprimable : une clé privée enveloppée en PEM.
Un vrai JPEG commencerait par FF D8 FF, des octets qui ne sont pas du tout du texte imprimable, donc le nom .jpg est un déguisement. La liste de référence met en contraste la signature à tirets de PEM avec JPEG (FF D8 FF), PNG (89 50 4E 47) et GZIP (1F 8B). Seuls les tirets correspondent. Une clé privée qui se trouve dans le dossier d'uploads d'une application web est une exposition grave : quiconque peut la lire peut usurper l'identité du serveur ou déchiffrer son trafic.
Erreurs fréquentes
- Faire confiance à l'extension .jpg. Le nom suggère une image, mais les JPEG commencent par
FF D8 FF, pas par des tirets imprimables. - Ne lire que l'hexadécimal en ignorant l'ASCII. Le moyen le plus rapide est de lire les octets comme du texte, où
-----BEGINsaute aux yeux. - Dire que c'est 'juste un fichier texte'. C'est du texte, mais le format spécifique avec l'enveloppe BEGIN/END est le PEM, et il contient une clé privée.
- Confondre PEM et DER. DER est le binaire brut ; PEM est l'enveloppe texte en base64 et tirets que vous observez ici.
Comment s'en protéger
Les clés privées ne doivent jamais se trouver dans un stockage accessible aux utilisateurs, et les uploads doivent être validés selon leur type de contenu réel.
- Analysez les dossiers d'uploads et d'assets à la recherche d'en-têtes PEM (
-----BEGIN) et d'autres motifs de secrets, et déclenchez une alerte à chaque correspondance. - Validez les uploads en vérifiant les magic bytes par rapport aux types autorisés, en rejetant tout ce qui n'est pas le format d'image attendu.
- Conservez les clés privées dans un gestionnaire de secrets ou un coffre-fort de clés restreint, jamais dans un dossier servi par le web, et faites une rotation de toute clé exposée.
- Servez les uploads utilisateurs depuis un domaine séparé ou avec un type de contenu forçant le téléchargement, afin qu'une clé divulguée ne soit jamais exécutée ni interprétée dans le contexte de l'application.