- Die Samsung WB850F ist das erste Modell, das den DRIMeIII-SoC zusammen mit Wi-Fi nutzte; dank der in der Firmware-ZIP enthaltenen partialImage.o.map wurden die Analyse der Haupt-SoC-Firmware und das Umgehen der Hotspot-Erkennung möglich
WB850F_FW_210086.zipenthältWB850-FW-SR-210086.binmit 6 Partitionen sowie einen Linker-Dump mit mehr als 300.000 Zeilen, wodurch bestätigt werden konnte, dassMain_Imagedie eigentliche ARM-Firmware ist- In der Ghidra-Analyse war entscheidend, über Differenzen bei String-Adressen die Basisadresse 0xc0004000 von
Main_Imagezu finden und die Funktionsnamen aus.textumzuwandeln und als Symbole zu importieren - Die Hotspot-Prüffunktion
DevHTTPResponseStartentscheidet anhand eines Yahoo-Domain-Cookies bei HTTP 200 oder anhand des Stringsyahoo.am Anfang einer Redirect-URL bei 301/302/307, ob ein AP authentifiziert ist - Nachdem Yahoo auf HTTPS weiterleitete, lag die Position von
yahoo.außerhalb des im Code erlaubten Bereichs; nach dem Patch vonsamsung-nx-emailservicegelang der Foto-Upload der WB850F
Aufbau der WB850F-Firmware-ZIP
- Die Samsung WB850F ist eines der wenigen Modelle, für die Samsung auch nach der eingestellten iLauncher-Anwendung weiterhin Firmware und Support-Dateien veröffentlicht
WB850F_FW_210086.zipenthält folgende DateienGPS_FW/BASEBAND_FW_Flash.mbinGPS_FW/BASEBAND_FW_Ram.mbinGPS_FW/Config.BINGPS_FW/flashBurner.mbinFWUPpartialImage.o.mapWB850-FW-SR-210086.binwb850f_adj.txt
FWUPenthält nur den Stringupgrade allund wirkt wie ein Skript für ein Firmware-Test-/Automatisierungsmodulwb850f_adj.txtist ein komplexeres Skript, das die GPS-Firmware aktualisiert und zugehörige Dateien löscht- Die GPS-bezogenen Skripte und der Ordner
GPS_FWsind nicht Gegenstand dieser Analyse
partialImage.o.map: ein Linker-Dump als Karte
partialImage.o.mapist eine Textdatei mit mehr als 300.000 Zeilen und enthält die Linker-Ausgabe zupartialImage.osowie die vollständige Speicherkarte der verlinkten Datei- Die Sektion
.textenthält Funktionsnamen wiesysInit,archPwrDown,DevHTTPResponseStart,DevHTTPResponseData,DevHTTPResponseEnd - Die Sektion
.dataenthält Datensymbole wiesysBus,sysCpu,sysBootLine - Diese Datei wird als Symbolkarte genutzt, um Code und Funktionsnamen in der Firmware zuzuordnen
Header und Partitionstabelle von WB850-FW-SR-210086.bin
- Betrachtet man
WB850-FW-SR-210086.binmitbinwalk, erscheinen HTML-, PNG- und JPEG-Header, VxWorks-Header sowie mehrere Unix-Pfade, aber keine klaren Partitionen oder Dateisysteme - Ein Hex-Dump der ersten 1 KB zeigt nach der Firmware-Version
210086die Bytes0x00 0x06, gefolgt von Dateinamen wieFW_UP/ONBL1.bin - Jeder Record scheint eine 60-Byte-Struktur zu sein, bestehend aus einem 32-Byte-String mit Null-Padding, zwei Little-Endian-Integern und einem 20-Byte-Partitionsnamen mit Null-Padding
- Die beiden Integer werden jeweils als Länge und Offset innerhalb der Datei interpretiert
- Da es insgesamt 6 Records gibt, wird
0x00 0x06als Abschluss- oder Padding-Byte des Firmware-Version-Strings plus 1-Byte-Partitionsanzahl interpretiert -
Rekonstruierte Partitionen
FW_UP/ONBL1.bin- Größe: 196 Byte, Offset:
0x0000800, Partitionsname:ONBL1
- Größe: 196 Byte, Offset:
FW_UP/ONBL2.bin- Größe: 46 KB, Offset:
0x00008c4, Partitionsname:ONBL2
- Größe: 46 KB, Offset:
[WB850]DSC_5KEY_WB850- Größe: 30 MB, Offset:
0x000bef4, Partitionsname:Main_Image
- Größe: 30 MB, Offset:
RomFS/SPID.Rom- Größe: 48 MB, Offset:
0x1d2b32c, Partitionsname:Resource
- Größe: 48 MB, Offset:
FW_UP/WB850.HEX- Größe: 19 KB, Offset:
0x4c75f2c, Partitionsname:OIS
- Größe: 19 KB, Offset:
FW_UP/skin.bin- Größe: 36 MB, Offset:
0x4c7acb2, Partitionsname:SKIN
- Größe: 36 MB, Offset:
- Zum Extrahieren der Partitionen wurde das DRIMeIII-Firmware-Partitionsextraktionstool geschrieben und verwendet
Code- und Datenpartitionen unterscheiden
- Das Extraktionstool zieht Dateien anhand des Partitionsnamens heraus und hängt
.binan - Allein die Ausgabe von
fileist nur begrenzt nützlich, etwa weilMain_Image.binfälschlich als OpenPGP Secret Key erkannt wird ONBL1undONBL2werden anhand des Strings"BootLoader(ONBL1, ONBL2) Update Done"inMain_Imageals Bootloader der ersten und zweiten Stufe vermutetMain_Imageist die eigentliche Firmware, undbinwalk -Ameldet in dieser Datei zahlreiche ARM-FunktionsprologeResourceundSKINsind große Container und könnten vom SoC-Hersteller bereitgestellte Konfigurationen für den Kamera-UI-Skin seinOISist trotz des Dateinamens kein echtes HEX und könnte Firmware für eine dedizierte optische Bildstabilisierungseinheit sein- Im Mittelpunkt der Analyse steht
Main_Image
Main_Image in Ghidra mappen
- Die drei Partitionen
ONBL1,ONBL2undMain_Imageenthalten echten ARM-Code - Übliche ARM-Firmware hat an Adresse
0x0000000eine Reset-Vektortabelle, doch alle drei Binärdateien beginnen mit linearem Code und müssen daher auf eine noch unbekannte Adresse neu gemappt werden - Um die fehlerhafte Hotspot-Erkennung zu analysieren, waren folgende Schritte nötig
- die korrekte Speicheradresse finden, auf die
Main_Imagegemappt werden muss - die Symbolnamen aus
partialImage.o.mapin Ghidra laden - die Funktion analysieren, die die Hotspot-Login-Erkennung falsch auslöst
- die korrekte Speicheradresse finden, auf die
- Eine Suche nach
"yahoo"im Tab Defined Strings von Ghidra brachte Einträge hervor, die wie Debug-Strings vonDevHTTPResponseStart()aussehenDevHTTPResponseStart: url=%s, handle=%x, status=%dDevHTTPResponseStart: This is YAHOO check !!!DevHTTPResponseStart: THIS IS GOOGLE/YAHOO/SAMSUNG PAGE!!!! 111301/302/307! cannot find yahoo!
- In
partialImage.o.mapliegtDevHTTPResponseStartbei0x321a84, und Ghidra findet an demselben Offset ebenfalls eine Funktion - Die Differenz zwischen den Pointer-Werten der Debug-Strings und den tatsächlichen String-Offsets passte zu
0xc0004000, sodass die Basisadresse vonMain_Imageals0xc0004000bestimmt wurde - Da sich die Basisadresse in Ghidra nachträglich nicht ändern lässt, musste die Binärdatei aus dem Projekt entfernt, erneut importiert und dabei die Basisadresse gesetzt werden
Funktionsnamen importieren und DevHTTPResponseStart analysieren
- Ghidras ImportSymbolScript.py kann Symbole massenhaft aus einer Texttabelle importieren
- Das Skript erwartet pro Zeile den Symbolnamen, eine Hex-Adresse und ein
ffür eine Funktion oder einlfür ein Label - Da aus
partialImage.o.mapnur die Funktionen der aktuellen.text-Sektion benötigt wurden, mussten folgende Einträge ausgeschlossen werden- leere Zeilen
- Offsets von Objektdateien
- Sektionslabels wie
.text - Labels mit dem Präfix
L$_ - lokale Symbole mit dem Präfix
$
- Zu den Adressen wird
0xc0004000addiert, um sie an die Ghidra-Basisadresse anzupassen - Das konvertierte Ergebnis wird in einem Format wie
sysInit c0004000 f,archPwrDown c0004094 ferstellt und über Ghidras Script Manager geladen - Nachdem die Funktionsnamen vorhanden sind, lässt sich das dekompilierte Ergebnis von
DevHTTPResponseStartlesen, indem mehrereDAT_-Felder als Pointer markiert und die Parameternamen passend zu den Debug-Strings umbenannt werden
Bedingungen der Hotspot-Erkennung
DevHTTPResponseStartentscheidet anhand von HTTP-Antwortstatus, URL und Headern, ob ein Wi-Fi-AP authentifiziert wurde- Bei einer HTTP-200-OK-Antwort muss im Response-Header ein Yahoo-Domain-Cookie vorhanden sein, damit dies als erfolgreiche Authentifizierung gewertet wird
- Geprüft werden
domain=.yahoo,Domain=.yahoo,domain=kr.yahoo,Domain=kr.yahoo - Ist die Bedingung erfüllt, wird
p_request_ongoingauf 0 gesetzt und, falls der Browser noch nicht authentifiziert ist,safnotify_auth_ap(0)aufgerufen
- Geprüft werden
- Bei HTTP-301/302/307-Redirects wird der String
yahoo.in der URL geprüft- Fehlt
yahoo.oder steht er hinterurl + 11, wird dies so behandelt, als sei Yahoo nicht gefunden worden - Wenn der Browser-Framebuffer nicht eingeschaltet und auch keine Authentifizierung erfolgt ist, wird
safnotify_auth_ap(1)aufgerufen - Steht
yahoo.am Anfang, wird mitsafnotify_auth_ap(0)eine erfolgreiche Authentifizierung gemeldet
- Fehlt
- Ein negativer Status gibt wie eine abgebrochene Anfrage
falsezurück - Bei einem positiven Status, der weder 200 noch ein Redirect ist, hängt das Ergebnis vom Zustand des Browser-Framebuffers ab
Durch TLS gebrochene Yahoo-Prüfung und Umgehung
- Die von der Kamera abgefragte URL ist
http://www.yahoo.co.kr/ - Bei einer direkten Anfrage antwortet der Server mit
HTTP/1.1 301 Moved Permanentlyund leitet perLocation: https://www.yahoo.com/weiter - In
https://www.yahoo.com/steht der Teilstringyahoo.an Position 12 - Der Code verlangt, dass
yahoo.unter den ersten 11 Positionen vorkommt; diese Prüfung ist daher nach der Umstellung auf HTTPS defekt - Um die Hotspot-Prüfung zu bestehen, muss man DNS-Records auf einen anderen Server zeigen lassen, der per HTTP auf einen Yahoo-ähnlicher aussehenden Namen weiterleitet oder ein Yahoo-Domain-Cookie setzt
- Nach dem Patch für samsung-nx-emailservice verbindet sich die Kamera tatsächlich und lädt Fotos hoch
Andere Kameras, bei denen dieselbe Umgehung angewendet wurde
- Diese Analyse hat es geschafft, anhand einer einzigen per Reverse Engineering untersuchten Funktion die Hotspot-Erkennung der Samsung-WB850F-Wi-Fi-Kamera zu verstehen und zu umgehen
- Der finale Patch war klein, doch wegen der von Samsung-Ingenieuren implementierten Erkennungsmethode war es schwierig, die Umgehung allein aus Paketmitschnitten abzuleiten
- Nachdem klar war, wonach gesucht werden musste, wurde dieselbe Umgehung auch auf Kameras angewandt, die MSN.com abfragen
- Dadurch wurden EX2F, ST200F, WB3xF und WB1100F zur Liste unterstützter Kameras hinzugefügt
Main_Imageenthält mehr als 77.000 Funktionen, sodass noch reichlich Analysepotenzial besteht, um die Funktionsweise der Digitalkamera besser zu verstehen
1 Kommentare
Meinungen auf Hacker News
https://op-co.de/blog/posts/samsung_nx_cryptofail/#index3h3 hat mir besser gefallen
Ein wirklich erstaunlicher Fall von fehlgeschlagener Firmware-Verschlüsselung
Großartige Arbeit. Ich frage mich, ob du darüber nachdenkst, aus der Vorgehensweise beim Reverse Engineering ein Tutorial zu machen
Ich habe nur die Teile weggelassen, die sich leicht googeln lassen
Alles, was ich will: Wenn ich mit der Kamerataste ein dSLR-Foto aufnehme, soll dieses Bild kurz darauf in Apple Photos landen
Smartphones haben den Markt für Consumer-Kameras fast ausgelöscht, daher scheint die Nachfrage zu gering zu sein. Als Projektidee: herausfinden, wie man einen ESP32 in eine SD-Karte quetscht
Man kann sie auch mit Telefonen, Tablets und Websites verbinden, braucht dafür aber eine App oder einen Dienst. Dokumentation zum direkten Senden per FTP von der Kamera: https://gdlp01.c-wss.com/gds/5/0300024975/01/eos5d-mk4-wff-i... Seite 113. Der Link führt zum EOS 5D Mark IV (WG) Wi-Fi (Wireless Communication) Function Instruction Manual
Leider sind es 10 Jahre alte Modelle und selbst auf dem Gebrauchtmarkt selten
Sie koppelt sich per WLAN oder Bluetooth, und wenn man möchte, kann man die Kamera vom iPad aus fernsteuern und auch das Livebild sehen