CVE-2025-43300 : Corruption mémoire dans le traitement d'images DNG sur iOS/macOS
Aperçu
CVE-2025-43300 est une vulnérabilité critique de corruption mémoire dans le framework de traitement d'images d'Apple qui affecte iOS 18.6.1 et les systèmes macOS. La vulnérabilité réside dans le code de décompression JPEG Lossless du bundle RawCamera.bundle, déclenchée par des incohérences entre les métadonnées TIFF et les paramètres du flux JPEG dans les fichiers DNG.
Détails de la vulnérabilité
Cause racine
La vulnérabilité provient d'une incohérence métadonnées/flux dans les fichiers DNG (Digital Negative) :
- SamplesPerPixel : les métadonnées de l'en-tête TIFF indiquent les composantes de couleur attendues
- Nombre de composantes SOF3 : les flux JPEG Lossless spécifient les composantes de données réelles
- Lorsque ces valeurs diffèrent, l'allocation et le traitement deviennent désalignés.
Flux de corruption mémoire
1. Parser reads SamplesPerPixel from TIFF metadata (e.g., 2 components)
2. System allocates buffer: width × height × 2 components
3. JPEG decoder reads SOF3 component count (e.g., 1 component)
4. Decoder writes data based on inconsistent assumptions
5. Buffer overflow occurs when more data is written than allocated
Vecteur d'attaque
- Vulnérabilité zero-click : aucune interaction utilisateur requise
- Traitement automatique : déclenché par la visualisation, l'importation ou la réception de fichiers DNG
- Impact multiplateforme : affecte les systèmes iOS et macOS
- Corruption mémoire : peut conduire à des crashs d'applications ou à une exécution de code potentielle
Présentation des outils
Ce dépôt contient deux outils Python pour analyser et reproduire CVE-2025-43300 :
1. DNG Vulnerability Analyzer (dng_vulnerability_analyzer.py)
Objectif : Analyse la structure des fichiers DNG pour identifier les conditions de vulnérabilité
Fonctionnalités clés :
- Analyse la structure des fichiers TIFF/DNG, y compris les IFD et les SubIFD
- Localise les balises de métadonnées SamplesPerPixel
- Identifie les marqueurs SOF3 JPEG Lossless et le nombre de composantes
- Détecte les incohérences métadonnées/flux
- Rapporte les offsets d'octets exacts pour la modification
Utilisation :
python3 dng_vulnerability_analyzer.py <dng_file>
Sortie :
- Analyse de la structure du fichier
- Emplacements et valeurs des balises de métadonnées
- Informations sur les composantes du flux JPEG
- Évaluation de la vulnérabilité
- Offsets spécifiques pour la création du POC
2. Safe Hex Modifier (hex_modifier.py)
Objectif : Crée des fichiers de preuve de concept en modifiant en toute sécurité des octets spécifiques
Fonctionnalités clés :
- Vérifie les valeurs d'octets attendues avant modification
- Crée des hachages SHA256 pour le suivi des fichiers
- Génère des rapports de différence binaire
- Implémente des contrôles de sécurité pour éviter toute corruption accidentelle
- Prend en charge la création de POC manuelle et automatisée
Utilisation :
# Create POC using known vulnerable offsets
python3 hex_modifier.py create-poc <input.dng>
# Manual byte modification
python3 hex_modifier.py modify <input.dng> <offset> <old_byte> <new_byte> <output.dng>
# Generate diff report
python3 hex_modifier.py diff <original.dng> <modified.dng>
Processus de création du POC
Étape 1 : Analyser le fichier cible
python3 dng_vulnerability_analyzer.py IMGP0847.DNG
Cela identifie :
- L'emplacement des métadonnées SamplesPerPixel
- Les emplacements du nombre de composantes JPEG SOF3
- Les valeurs actuelles et les modifications suggérées
Étape 2 : Créer un échantillon vulnérable
Le POC nécessite deux modifications d'octets spécifiques :
- Augmenter les métadonnées SamplesPerPixel (généralement de 1 à 2)
- Diminuer le nombre de composantes SOF3 (généralement de 2 à 1)
python3 hex_modifier.py create-poc IMGP0847.DNG
Étape 3 : Vérifier le POC
python3 dng_vulnerability_analyzer.py vuln_poc_IMGP0847.dng
Confirme que l'incohérence existe et que la vulnérabilité est déclenchée.
Pourquoi le POC fonctionne
Mécanisme technique
-
Phase d'allocation :
- Le parseur d'images lit SamplesPerPixel = 2
- Alloue un tampon pour 2 composantes de données de pixels
- Taille du tampon = largeur_image × hauteur_image × 2
-
Phase de traitement :
- Le décodeur JPEG Lossless rencontre un SOF3 avec 1 composante
- La logique d'analyse devient confuse quant à la taille réelle vs attendue des données
- Tente d'écrire des données sur la base d'hypothèses incohérentes
-
Corruption mémoire :
- Plus de données sont écrites dans le tampon que ce qui a été alloué initialement
- Le dépassement de tampon corrompt les régions mémoire adjacentes
- Entraîne un crash de l'application ou une exécution de code potentielle
Les fichiers DNG utilisent le format conteneur TIFF avec des flux JPEG Lossless intégrés :
- Métadonnées TIFF : décrivent les propriétés de l'image et les informations de couleur
- Flux JPEG : contiennent les données de pixels compressées
- Relation de confiance : existe entre les métadonnées et le contenu du flux
- Faille de validation : permet à des valeurs incohérentes d'atteindre le code de traitement
Évaluation de l'impact
Sévérité : Critique
- Score CVSS : élevé (zero-click, corruption mémoire, large impact)
- Systèmes affectés : iOS 18.6.1, systèmes macOS avec traitement d'images similaire
- Vecteur d'attaque : transfert de fichiers réseau/local
- Interaction utilisateur : aucune requise
- Périmètre : tous les appareils traitant des fichiers DNG
Scénarios concrets
- Pièces jointes d'e-mails contenant des fichiers DNG
- Transferts AirDrop
- Synchronisation de photos dans le cloud
- Téléchargements web d'échantillons de photographes
- Partage de médias dans les applications de messagerie
Atténuations et correctifs
Réponse du fournisseur
- Corrigé dans iOS 18.6.2 : Apple a implémenté une validation appropriée des métadonnées
- Mises à jour macOS : des correctifs similaires appliqués au traitement d'images de macOS
- Cause racine : ajout de contrôles de cohérence entre les métadonnées et les paramètres du flux
Atténuations recommandées
- Mettre à jour les systèmes : installer iOS 18.6.2 ou version ultérieure
- Validation des entrées : vérifier la cohérence des métadonnées dans les parseurs personnalisés
- Contrôle des limites : implémenter une validation stricte de la taille des tampons
- Fuzzing : tester régulièrement les parseurs de formats de fichiers
Structure du fichier et détails techniques
Structure TIFF/DNG
TIFF Header → IFD Chain → SubIFDs → Image Data
├── Metadata Tags (SamplesPerPixel, Compression, etc.)
├── JPEG Lossless Streams (SOF3 markers)
└── Pixel Data (compressed)
Emplacements clés de la vulnérabilité
- Balise SamplesPerPixel : balise TIFF 0x0115 dans les structures IFD
- Marqueurs SOF3 : début de trame JPEG Lossless (0xFFC3)
- Nombre de composantes : octet à l'offset +9 du marqueur SOF3
- Désalignement critique : lorsque la valeur de la balise ≠ nombre de composantes
Directives de test
Environnement de test sûr
- Utiliser des systèmes isolés : machines virtuelles ou appareils de test dédiés
- Créer des instantanés : avant de tester les fichiers POC
- Surveiller les crashs : vérifier les journaux système et les rapports de crash
- Isolation réseau : empêcher le partage involontaire de fichiers
Comportement attendu
- Systèmes vulnérables : crash de l'application, erreurs de corruption mémoire
- Systèmes corrigés : gestion d'erreur élégante ou traitement correct
- Indicateurs de journaux : violations d'accès mémoire, erreurs de segmentation
Références techniques
- Spécification TIFF 6.0 : structure des balises et format IFD
- Spécification DNG : format Adobe Digital Negative
- Norme JPEG : compression sans perte (ITU-T T.87)
Recherche en sécurité
- Techniques de corruption mémoire : principes fondamentaux du dépassement de tampon
- Fuzzing de formats de fichiers : découverte automatisée de vulnérabilités
- Sécurité des parseurs : bonnes pratiques de validation des entrées
Avertissement : Cette recherche est fournie à des fins éducatives et de sécurité défensive uniquement. Les utilisateurs sont responsables du respect des lois applicables et des directives éthiques.
REMARQUE
Le crash prend environ 1 à 3 minutes avant d'être déclenché. Amusez-vous bien.
Et pour le POC, vous pouvez exécuter open vuln_file.dng pour lancer le fichier ou simplement l'apercevoir et il sera exécuté.