2 points par GN⁺ 2024-05-26 | 1 commentaires | Partager sur WhatsApp
  • Le Samsung WB850F est le premier modèle à utiliser à la fois le SoC DRIMeIII et le Wi-Fi ; grâce à partialImage.o.map inclus dans le ZIP du firmware, il est devenu possible d’analyser le firmware du SoC principal et de contourner la détection de hotspot
  • WB850F_FW_210086.zip contient WB850-FW-SR-210086.bin, qui renferme 6 partitions, ainsi qu’un dump de l’éditeur de liens de plus de 300 000 lignes, ce qui a permis de confirmer que Main_Image est bien le véritable firmware ARM
  • Dans l’analyse avec Ghidra, les étapes clés ont été de trouver l’adresse de base 0xc0004000 de Main_Image à partir des écarts entre adresses de chaînes, puis de convertir les noms de fonctions .text pour les importer comme symboles
  • La fonction de décision de hotspot DevHTTPResponseStart détermine si l’AP est authentifié à partir d’un cookie de domaine Yahoo dans une réponse HTTP 200, ou de la chaîne yahoo. au début de l’URL de redirection 301/302/307
  • Comme Yahoo redirige désormais vers HTTPS, la position de yahoo. est sortie de la plage autorisée par le code ; après le patch de samsung-nx-emailservice, l’envoi de photos depuis le WB850F a réussi

Structure du ZIP du firmware WB850F

  • Le Samsung WB850F est l’un des rares modèles pour lesquels Samsung publie encore le firmware et les fichiers de support, même après l’abandon de l’application iLauncher
  • WB850F_FW_210086.zip contient les fichiers suivants
    • GPS_FW/BASEBAND_FW_Flash.mbin
    • GPS_FW/BASEBAND_FW_Ram.mbin
    • GPS_FW/Config.BIN
    • GPS_FW/flashBurner.mbin
    • FWUP
    • partialImage.o.map
    • WB850-FW-SR-210086.bin
    • wb850f_adj.txt
  • FWUP ne contient que la chaîne upgrade all, qui ressemble à un script pour un module de test/automatisation du firmware
  • wb850f_adj.txt est un script plus complexe qui met à jour le firmware GPS et supprime les fichiers associés
  • Les scripts liés au GPS et le dossier GPS_FW sont exclus de cette analyse

partialImage.o.map : la carte d’un dump de l’éditeur de liens

  • partialImage.o.map est un fichier texte de plus de 300 000 lignes ; il contient la sortie de l’éditeur de liens pour partialImage.o et la carte mémoire complète du fichier lié
  • La section .text contient des noms de fonctions comme sysInit, archPwrDown, DevHTTPResponseStart, DevHTTPResponseData et DevHTTPResponseEnd
  • La section .data contient des symboles de données comme sysBus, sysCpu et sysBootLine
  • Ce fichier sert de carte des symboles pour faire correspondre le code du firmware avec les noms de fonctions

En-tête et table de partitions de WB850-FW-SR-210086.bin

  • Avec binwalk sur WB850-FW-SR-210086.bin, on voit des en-têtes HTML, PNG, JPEG et VxWorks, ainsi que plusieurs chemins Unix, mais aucune partition ni aucun système de fichiers clair n’apparaît
  • Un dump hexadécimal du premier kilo-octet montre, après la version de firmware 210086, 0x00 0x06, puis des noms de fichiers comme FW_UP/ONBL1.bin
  • Chaque enregistrement semble avoir une structure de 60 octets, composée d’une chaîne sur 32 octets complétée par des zéros, de deux entiers little-endian et d’un nom de partition sur 20 octets complété par des zéros
  • Les deux entiers sont interprétés respectivement comme la longueur et l’offset dans le fichier
  • Il y a au total 6 enregistrements ; 0x00 0x06 est donc interprété comme l’octet de fin ou de padding de la chaîne de version du firmware, suivi d’un compteur de partitions sur 1 octet
  • Partitions reconstituées

    • FW_UP/ONBL1.bin
      • Taille : 196 octets, offset : 0x0000800, nom de partition : ONBL1
    • FW_UP/ONBL2.bin
      • Taille : 46 Ko, offset : 0x00008c4, nom de partition : ONBL2
    • [WB850]DSC_5KEY_WB850
      • Taille : 30 Mo, offset : 0x000bef4, nom de partition : Main_Image
    • RomFS/SPID.Rom
      • Taille : 48 Mo, offset : 0x1d2b32c, nom de partition : Resource
    • FW_UP/WB850.HEX
      • Taille : 19 Ko, offset : 0x4c75f2c, nom de partition : OIS
    • FW_UP/skin.bin
      • Taille : 36 Mo, offset : 0x4c7acb2, nom de partition : SKIN
    • L’extraction des partitions a été réalisée avec un outil d’extraction de partitions de firmware DRIMeIII écrit pour l’occasion

Distinguer les partitions de code et de données

  • L’outil d’extraction extrait les fichiers selon le nom de partition et ajoute .bin
  • Les résultats de file sont d’une utilité limitée : Main_Image.bin est par exemple identifié à tort comme une clé secrète OpenPGP
  • ONBL1 et ONBL2 sont supposés être les bootloaders de première et deuxième étapes, d’après la chaîne "BootLoader(ONBL1, ONBL2) Update Done" présente dans Main_Image
  • Main_Image est le véritable firmware, et binwalk -A y signale de nombreux prologues de fonctions ARM
  • Resource et SKIN sont de grands conteneurs ; ils pourraient correspondre à une configuration fournie par le fabricant du SoC et liée au skin de l’interface de l’appareil photo
  • OIS, malgré son nom de fichier, n’est pas réellement un HEX ; il pourrait s’agir du firmware du dispositif dédié de stabilisation optique de l’image
  • Le cœur de l’analyse est Main_Image

Mapper Main_Image dans Ghidra

  • Les trois partitions ONBL1, ONBL2 et Main_Image contiennent du vrai code ARM
  • Un firmware ARM classique place une table de vecteurs de reset à l’adresse 0x0000000, mais les trois binaires commencent par du code linéaire et doivent donc être remappés à une adresse encore inconnue
  • Pour analyser la fausse détection de hotspot, il fallait effectuer les tâches suivantes
    • trouver la bonne adresse mémoire où mapper Main_Image
    • charger dans Ghidra les noms de symboles de partialImage.o.map
    • analyser la fonction qui déclenche à tort la décision de connexion au hotspot
  • Dans l’onglet Defined Strings de Ghidra, une recherche de "yahoo" a fait apparaître des éléments qui semblent être des chaînes de debug de DevHTTPResponseStart()
    • DevHTTPResponseStart: url=%s, handle=%x, status=%d
    • DevHTTPResponseStart: This is YAHOO check !!!
    • DevHTTPResponseStart: THIS IS GOOGLE/YAHOO/SAMSUNG PAGE!!!! 111
    • 301/302/307! cannot find yahoo!
  • Dans partialImage.o.map, DevHTTPResponseStart se trouve à 0x321a84, et Ghidra trouve aussi une fonction au même offset
  • L’écart entre la valeur du pointeur de chaîne de debug et l’offset réel de la chaîne correspond à 0xc0004000, ce qui permet de conclure que l’adresse de base de Main_Image est 0xc0004000
  • Comme Ghidra ne permet pas de modifier l’adresse de base après coup, il a fallu retirer le binaire du projet, le réimporter et définir l’adresse de base

Importer les noms de fonctions et analyser DevHTTPResponseStart

  • ImportSymbolScript.py de Ghidra permet d’importer en masse des symboles depuis un tableau texte
  • Le script attend, sur chaque ligne, un nom de symbole, une adresse hexadécimale et f pour indiquer une fonction ou l pour indiquer un label
  • Dans partialImage.o.map, seuls les fonctions de la section .text courante étaient nécessaires ; il fallait donc exclure les éléments suivants
    • lignes vides
    • offsets de fichiers objets
    • labels de section comme .text
    • labels avec le préfixe L$_
    • symboles locaux avec le préfixe $
  • Pour faire correspondre les adresses avec l’adresse de base de Ghidra, 0xc0004000 est ajouté aux adresses
  • Le résultat converti, sous une forme comme sysInit c0004000 f ou archPwrDown c0004094 f, a été chargé depuis le Script Manager de Ghidra
  • Une fois les noms de fonctions présents, plusieurs champs DAT_ ont été définis comme pointeurs et les noms de paramètres ont été changés en fonction des chaînes de debug, ce qui rend le résultat de décompilation de DevHTTPResponseStart lisible

Conditions de détection du hotspot

  • DevHTTPResponseStart détermine, à partir du statut de la réponse HTTP, de l’URL et des en-têtes, si l’AP Wi-Fi est authentifié
  • Pour une réponse HTTP 200 OK, l’en-tête de réponse doit contenir un cookie de domaine Yahoo pour être traité comme une authentification réussie
    • Les valeurs testées sont domain=.yahoo, Domain=.yahoo, domain=kr.yahoo et Domain=kr.yahoo
    • Si la condition est satisfaite, p_request_ongoing passe à 0 et, si le navigateur n’est pas authentifié, safnotify_auth_ap(0) est appelé
  • Pour une redirection HTTP 301/302/307, la chaîne yahoo. est recherchée dans l’URL
    • Si yahoo. est absent ou se trouve après url + 11, Yahoo est considéré comme introuvable
    • Si le framebuffer du navigateur n’est pas activé et que l’authentification n’est pas non plus faite, safnotify_auth_ap(1) est appelé
    • Si yahoo. se trouve au début, safnotify_auth_ap(0) traite l’authentification comme réussie
  • Un statut négatif renvoie false, comme pour une requête interrompue
  • Pour un statut positif qui n’est ni 200 ni une redirection, le résultat dépend de l’état du framebuffer du navigateur

Le test Yahoo cassé après TLS et son contournement

  • L’URL interrogée par l’appareil photo est http://www.yahoo.co.kr/
  • Lorsqu’on l’interroge directement, le serveur répond HTTP/1.1 301 Moved Permanently avec Location: https://www.yahoo.com/
  • Dans https://www.yahoo.com/, la sous-chaîne yahoo. se trouve à la position 12
  • Le code exige que yahoo. se trouve dans les 11 premières positions, ce qui casse ce test après le passage à HTTPS
  • Pour réussir le test de hotspot, il faut faire pointer l’enregistrement DNS vers un autre serveur, et que ce serveur redirige en HTTP vers un nom qui ressemble davantage à Yahoo, ou définisse un cookie de domaine Yahoo
  • Après le patch de samsung-nx-emailservice, l’appareil photo se connecte réellement et envoie les photos

Autres appareils photo auxquels le même contournement a été appliqué

  • Cette analyse a permis de comprendre et de contourner la détection de hotspot de l’appareil photo Wi-Fi Samsung WB850F à partir d’une seule fonction rétro-ingéniérée
  • Le patch final était petit, mais en raison de la méthode de détection mise en œuvre par les ingénieurs de Samsung, il aurait été difficile de deviner le contournement à partir de la seule trace des paquets
  • Une fois le bon élément à chercher identifié, le même contournement a aussi été appliqué à des appareils photo qui interrogent MSN.com
  • En conséquence, les EX2F, ST200F, WB3xF et WB1100F ont été ajoutés à la liste des appareils photo pris en charge
  • Main_Image contient plus de 77 000 fonctions, ce qui laisse encore beaucoup de matière à analyser pour mieux comprendre le fonctionnement des appareils photo numériques

1 commentaires

 
GN⁺ 2024-05-26
Commentaires sur Hacker News
  • J’ai davantage apprécié https://op-co.de/blog/posts/samsung_nx_cryptofail/#index3h3
    C’est un cas vraiment stupéfiant d’échec du chiffrement du firmware

  • Travail impressionnant. Je me demande s’il est prévu d’en faire un tutoriel sur la méthode de reverse engineering

    • En réalité, j’espérais que cet article fournisse déjà assez d’informations pour faire office de tutoriel
      J’ai seulement omis les parties faciles à retrouver via Google
  • Tout ce que je veux, c’est prendre des photos de dSLR avec le bouton de l’appareil, puis retrouver l’image peu après dans Apple Photos

    • Il existait autrefois des cartes SD avec Wi-Fi intégré permettant la synchronisation automatique des photos, mais Eye-Fi, l’acteur principal du secteur, a fermé, et il ne semble pas y avoir de nouveau produit fonctionnant avec des services cloud modernes
      Les smartphones ont pratiquement détruit le marché des appareils photo grand public, donc la demande semble insuffisante. Comme idée de projet, on peut chercher un moyen de faire entrer un ESP32 dans une carte SD
    • Les Canon dSLR avec Wi-Fi semblent pouvoir utiliser le FTP
      Ils peuvent aussi se connecter à un téléphone, une tablette ou un site web, mais cela nécessite une application ou un service. Documentation pour l’envoi direct en FTP depuis l’appareil : https://gdlp01.c-wss.com/gds/5/0300024975/01/eos5d-mk4-wff-i... page 113. Le lien renvoie au manuel EOS 5D Mark IV (WG) Wi-Fi (Wireless Communication) Function Instruction Manual
    • Les Samsung NX1 et NX500 sous Linux peuvent être scriptés assez facilement pour envoyer des JPEG ou des RAW vers n’importe quel service en ligne, dès lors qu’un réseau Wi-Fi est disponible
      Malheureusement, ce sont des modèles vieux de 10 ans et ils sont aussi rares sur le marché de l’occasion
    • La série Nikon Z avec Snapbridge est à peu près ce qui se fait de mieux dans ce domaine
      L’appairage se fait en Wi-Fi ou en Bluetooth, et on peut, si on le souhaite, piloter l’appareil à distance depuis un iPad et voir l’écran
    • Puisque c’est déjà possible pour Google Photos, cela devrait aussi l’être pour ça : https://www.stg-uploader.xyz/