2 पॉइंट द्वारा GN⁺ 2024-05-26 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Samsung WB850F DRIMeIII SoC और Wi‑Fi का साथ में इस्तेमाल करने वाला पहला मॉडल था, और फ़र्मवेयर ZIP में शामिल partialImage.o.map की वजह से main SoC फ़र्मवेयर का विश्लेषण और hotspot detection bypass संभव हुआ
  • WB850F_FW_210086.zip में 6 partitions वाला WB850-FW-SR-210086.bin और 3 लाख से अधिक लाइनों का linker dump है, जिससे यह पुष्टि हुई कि Main_Image असली ARM फ़र्मवेयर है
  • Ghidra विश्लेषण में string address के अंतर का उपयोग करके Main_Image का base address 0xc0004000 ढूंढना और .text function names को बदलकर symbols के रूप में import करना मुख्य था
  • hotspot जाँच फ़ंक्शन DevHTTPResponseStart HTTP 200 के Yahoo domain cookie या 301/302/307 redirect URL की शुरुआती yahoo. string के आधार पर AP authentication स्थिति तय करता है
  • Yahoo के HTTPS पर redirect होने के बाद yahoo. की स्थिति code की allowed range से बाहर चली गई, और samsung-nx-emailservice patch के बाद WB850F से photo upload सफल हुआ

WB850F फ़र्मवेयर ZIP की संरचना

  • Samsung WB850F उन गिने-चुने मॉडलों में से एक है जिनके लिए iLauncher application बंद होने के बाद भी Samsung अब तक फ़र्मवेयर और support files सार्वजनिक रूप से उपलब्ध कराता है
  • WB850F_FW_210086.zip में ये फ़ाइलें शामिल हैं
    • 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 में सिर्फ upgrade all string है, जो संभवतः firmware test/automation module के लिए script है
  • wb850f_adj.txt एक अधिक जटिल script है, जो GPS फ़र्मवेयर upgrade करती है और संबंधित फ़ाइलें हटाती है
  • GPS से जुड़ी scripts और GPS_FW folder इस विश्लेषण के दायरे से बाहर रखे गए हैं

partialImage.o.map: linker dump के रूप में एक नक्शा

  • partialImage.o.map 3 लाख से अधिक लाइनों वाली text file है, जिसमें partialImage.o के लिए linker output और linked files का पूरा memory map है
  • .text section में sysInit, archPwrDown, DevHTTPResponseStart, DevHTTPResponseData, DevHTTPResponseEnd जैसे function names हैं
  • .data section में sysBus, sysCpu, sysBootLine जैसे data symbols शामिल हैं
  • यह फ़ाइल फ़र्मवेयर के भीतर code और function names को मिलाने के लिए symbol map की तरह काम आती है

WB850-FW-SR-210086.bin header और partition table

  • binwalk से WB850-FW-SR-210086.bin देखने पर HTML, PNG, JPEG headers, VxWorks header और कई Unix paths दिखाई देते हैं, लेकिन कोई स्पष्ट partition या filesystem सामने नहीं आता
  • पहले 1KB का hex dump करने पर firmware version 210086 के बाद 0x00 0x06 दिखता है, और उसके बाद FW_UP/ONBL1.bin जैसे filenames दिखाई देते हैं
  • विश्लेषण से पता चला कि हर record संभवतः 60-byte structure है, जिसमें 32-byte zero-padded string, दो little-endian integers और 20-byte zero-padded partition name होता है
  • इन दो integers को क्रमशः length और file offset के रूप में समझा गया
  • कुल 6 records होने के कारण 0x00 0x06 को firmware version string के अंत या padding byte और 1-byte partition count के रूप में समझा गया
  • पुनर्निर्मित partitions

    • FW_UP/ONBL1.bin
      • आकार: 196 bytes, offset: 0x0000800, partition name: ONBL1
    • FW_UP/ONBL2.bin
      • आकार: 46KB, offset: 0x00008c4, partition name: ONBL2
    • [WB850]DSC_5KEY_WB850
      • आकार: 30MB, offset: 0x000bef4, partition name: Main_Image
    • RomFS/SPID.Rom
      • आकार: 48MB, offset: 0x1d2b32c, partition name: Resource
    • FW_UP/WB850.HEX
      • आकार: 19KB, offset: 0x4c75f2c, partition name: OIS
    • FW_UP/skin.bin
      • आकार: 36MB, offset: 0x4c7acb2, partition name: SKIN
    • partition extraction के लिए DRIMeIII फ़र्मवेयर partition extraction tool लिखा और इस्तेमाल किया गया

code और data partitions का विभाजन

  • extraction tool partition names के आधार पर files निकालता है और उनके साथ .bin जोड़ता है
  • सिर्फ file के output से उपयोगिता सीमित रही, जैसे Main_Image.bin को गलती से OpenPGP Secret Key समझ लिया गया
  • ONBL1 और ONBL2 को Main_Image के भीतर मौजूद "BootLoader(ONBL1, ONBL2) Update Done" string के आधार पर first-stage और second-stage bootloader माना गया
  • Main_Image असली फ़र्मवेयर है, और binwalk -A इस file में कई ARM function prologues रिपोर्ट करता है
  • Resource और SKIN बड़े containers हैं, और संभव है कि ये camera UI skin से संबंधित SoC vendor-provided configuration हों
  • OIS filename के बावजूद वास्तव में HEX नहीं है, और यह किसी dedicated optical image stabilization device का फ़र्मवेयर हो सकता है
  • विश्लेषण का मुख्य केंद्र Main_Image है

Ghidra में Main_Image को map करना

  • ONBL1, ONBL2, Main_Image इन तीनों partitions में वास्तविक ARM code है
  • सामान्य ARM फ़र्मवेयर address 0x0000000 पर reset vector table रखता है, लेकिन तीनों binaries की शुरुआत linear code से होती है, इसलिए इन्हें किसी अभी-अज्ञात address पर remap करना पड़ा
  • hotspot misdetection का विश्लेषण करने के लिए ये काम ज़रूरी थे
    • Main_Image को map करने के लिए सही memory address ढूंढना
    • partialImage.o.map के symbol names को Ghidra में load करना
    • उस function का विश्लेषण करना जो hotspot login detection को गलत तरीके से trigger करता है
  • Ghidra के Defined Strings tab में "yahoo" खोजने पर DevHTTPResponseStart() की debug strings जैसी entries मिलीं
    • 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!
  • partialImage.o.map में DevHTTPResponseStart 0x321a84 पर है, और Ghidra ने भी उसी offset पर function पाया
  • debug string pointer values और actual string offsets के बीच का अंतर 0xc0004000 निकला, इसलिए Main_Image का base address 0xc0004000 निष्कर्षित किया गया
  • Ghidra में base address बाद में बदला नहीं जा सकता था, इसलिए binary को project से हटाकर base address सेट करते हुए दोबारा import करना पड़ा

function names import करना और DevHTTPResponseStart का विश्लेषण

  • Ghidra की ImportSymbolScript.py text table से bulk में symbols import कर सकती है
  • script हर line में symbol name, hexadecimal address, और function होने के लिए f या label होने के लिए l की अपेक्षा करती है
  • partialImage.o.map में अभी सिर्फ .text section के functions चाहिए थे, इसलिए इन entries को हटाना पड़ा
    • खाली पंक्तियाँ
    • object file offsets
    • .text जैसे section labels
    • L$_ prefix वाले labels
    • $ prefix वाले local symbols
  • addresses में Ghidra base address से मिलाने के लिए 0xc0004000 जोड़ा गया
  • परिवर्तित output sysInit c0004000 f, archPwrDown c0004094 f जैसे format में बनाया गया और Ghidra के Script Manager से load किया गया
  • function names आने के बाद कई DAT_ fields को pointers के रूप में सेट करना और debug strings के हिसाब से parameter names बदलना पड़ा, तब DevHTTPResponseStart का decompiled output पढ़ना संभव हुआ

hotspot detection की शर्तें

  • DevHTTPResponseStart HTTP response status, URL और headers देखकर तय करता है कि Wi‑Fi AP authenticated है या नहीं
  • HTTP 200 OK response में response headers में Yahoo domain cookie होना authentication success माना जाता है
    • जाँची जाने वाली values हैं domain=.yahoo, Domain=.yahoo, domain=kr.yahoo, Domain=kr.yahoo
    • शर्त पूरी होने पर p_request_ongoing को 0 किया जाता है, और अगर browser अभी authenticated नहीं है तो safnotify_auth_ap(0) call होता है
  • HTTP 301/302/307 redirect में URL के भीतर yahoo. string की जाँच होती है
    • अगर yahoo. नहीं है या url + 11 से आगे है, तो Yahoo न मिलने के रूप में माना जाता है
    • अगर browser framebuffer चालू नहीं है और authentication भी नहीं हुआ है, तो safnotify_auth_ap(1) call होता है
    • अगर yahoo. शुरुआती हिस्से में है, तो safnotify_auth_ap(0) के साथ authentication success माना जाता है
  • negative status interrupted request की तरह false लौटाता है
  • 200 और redirect दोनों में न आने वाले positive status पर browser framebuffer state के आधार पर result बदलता है

TLS के बाद टूटी Yahoo जाँच और bypass

  • camera जिस URL को query करता है वह http://www.yahoo.co.kr/ है
  • सीधे request करने पर server HTTP/1.1 301 Moved Permanently के साथ Location: https://www.yahoo.com/ पर redirect करता है
  • https://www.yahoo.com/ में yahoo. substring position 12 पर है
  • code यह अपेक्षा करता है कि yahoo. शुरुआती 11 positions में से किसी एक में हो, इसलिए HTTPS migration के बाद यह जाँच टूट गई
  • hotspot check पास कराने के लिए DNS record को किसी दूसरे server की ओर मोड़ना होगा, और उस server को ऐसे HTTP redirect या Yahoo domain cookie देनी होगी जो अधिक Yahoo-जैसा दिखे
  • samsung-nx-emailservice patch के बाद camera ने वास्तव में connect किया और photos upload कीं

वही bypass इस्तेमाल करने वाले अन्य cameras

  • इस विश्लेषण में reverse-engineer किए गए सिर्फ एक function के आधार पर Samsung WB850F Wi‑Fi camera की hotspot detection को समझना और bypass करना सफल रहा
  • अंतिम patch छोटा था, लेकिन Samsung engineer द्वारा लागू detection method की वजह से सिर्फ packet tracing से bypass method का अनुमान लगाना मुश्किल था
  • क्या ढूंढना है यह पता चलने के बाद MSN.com query करने वाले cameras पर भी वही bypass लागू किया गया
  • नतीजतन EX2F, ST200F, WB3xF, WB1100F supported camera list में जोड़े गए
  • Main_Image में 77 हज़ार से अधिक functions हैं, इसलिए digital camera के व्यवहार को और समझने के लिए अभी भी बहुत विश्लेषण बाकी है

1 टिप्पणियां

 
GN⁺ 2024-05-26
Hacker News की राय
  • https://op-co.de/blog/posts/samsung_nx_cryptofail/#index3h3 वाला मुझे ज़्यादा पसंद आया
    यह वाकई हैरान करने वाला firmware encryption failure का उदाहरण है

  • शानदार काम। सोच रहा हूँ कि क्या reverse engineering के तरीके को tutorial के रूप में बनाने का कोई इरादा है

    • असल में उम्मीद थी कि यह लेख खुद tutorial की तरह काम करने लायक पर्याप्त जानकारी देगा
      सिर्फ वे हिस्से छोड़े हैं जिन्हें Google पर खोजना आसान है
  • मुझे बस इतना चाहिए कि कैमरा बटन से dSLR photo खींचूँ और थोड़ी देर बाद वह image Apple Photos में मौजूद हो

    • पहले Wi-Fi built-in SD cards हुआ करते थे जिनसे photos अपने-आप sync हो जाती थीं, लेकिन उस क्षेत्र की प्रमुख कंपनी Eye-Fi बंद हो गई, और लगता नहीं कि किसी ने modern cloud services के साथ चलने वाला नया product बनाया है
      लगता है smartphones ने consumer camera market को लगभग खत्म कर दिया, इसलिए demand कम है। एक project idea यह है कि ESP32 को SD card के अंदर ठूंसने का तरीका खोजा जाए
    • Wi-Fi वाला Canon dSLR शायद FTP कर सकता है
      Phone, tablet और website से भी connect कर सकते हैं, लेकिन app या service चाहिए। Camera से सीधे FTP भेजने का documentation: https://gdlp01.c-wss.com/gds/5/0300024975/01/eos5d-mk4-wff-i... page 113. यह link EOS 5D Mark IV (WG) Wi-Fi (Wireless Communication) Function Instruction Manual का है
    • Linux चलाने वाले Samsung NX1 और NX500 को सिर्फ Wi-Fi network होने पर JPEG या RAW किसी भी online service पर upload करने के लिए काफी आसानी से script किया जा सकता है
      अफसोस कि ये 10 साल पुराने models हैं और used market में भी दुर्लभ हैं
    • Snapbridge वाली Nikon Z series इस मामले में लगभग सबसे अच्छा विकल्प है
      Wi-Fi या Bluetooth से pair होती है, और चाहें तो iPad से camera को remotely control कर सकते हैं और screen भी देख सकते हैं
    • Google Photos के लिए यह पहले से संभव है, इसलिए यह भी संभव होना चाहिए: https://www.stg-uploader.xyz/