2 điểm bởi GN⁺ 2024-05-26 | 1 bình luận | Chia sẻ qua WhatsApp
  • Samsung WB850F là mẫu đầu tiên dùng đồng thời SoC DRIMeIII và Wi‑Fi, và nhờ partialImage.o.map có trong file ZIP firmware nên có thể phân tích firmware của SoC chính và vượt qua cơ chế phát hiện hotspot
  • WB850F_FW_210086.zip chứa WB850-FW-SR-210086.bin gồm 6 phân vùng cùng một bản dump linker hơn 300 nghìn dòng, qua đó xác nhận Main_Image chính là firmware ARM thực sự
  • Trong quá trình phân tích bằng Ghidra, điểm then chốt là tìm địa chỉ base 0xc0004000 của Main_Image bằng chênh lệch địa chỉ chuỗi, rồi chuyển tên hàm trong .text thành symbol để import
  • Hàm xác định hotspot DevHTTPResponseStart phán đoán trạng thái xác thực AP dựa trên cookie domain Yahoo trong HTTP 200 hoặc chuỗi yahoo. ở đầu URL redirect 301/302/307
  • Khi Yahoo chuyển hướng sang HTTPS, vị trí của yahoo. vượt ra ngoài phạm vi mà mã cho phép; sau khi vá samsung-nx-emailservice, WB850F đã tải ảnh lên thành công

Cấu trúc của file ZIP firmware WB850F

  • Samsung WB850F là một trong số ít mẫu máy mà Samsung vẫn công khai firmware và các tệp hỗ trợ ngay cả sau khi ứng dụng iLauncher bị ngừng cung cấp
  • WB850F_FW_210086.zip chứa các tệp sau
    • 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 chỉ chứa chuỗi upgrade all, có vẻ là script cho mô-đun kiểm thử/tự động hóa firmware
  • wb850f_adj.txt là một script phức tạp hơn để nâng cấp firmware GPS và xóa các tệp liên quan
  • Các script liên quan đến GPS và thư mục GPS_FW không nằm trong phạm vi phân tích lần này

partialImage.o.map: bản đồ linker dump

  • partialImage.o.map là tệp văn bản hơn 300 nghìn dòng, chứa đầu ra linker cho partialImage.o và toàn bộ memory map của các tệp được liên kết cùng nhau
  • Phần .text chứa tên hàm như sysInit, archPwrDown, DevHTTPResponseStart, DevHTTPResponseData, DevHTTPResponseEnd
  • Phần .data bao gồm các data symbol như sysBus, sysCpu, sysBootLine
  • Tệp này được dùng như bản đồ symbol để khớp mã và tên hàm trong firmware

Header và bảng phân vùng của WB850-FW-SR-210086.bin

  • Khi dùng binwalk với WB850-FW-SR-210086.bin, có thể thấy header HTML, PNG, JPEG, VxWorks và nhiều đường dẫn Unix, nhưng không lộ ra phân vùng hay filesystem rõ ràng
  • Nếu hex dump 1KB đầu tiên, sau phiên bản firmware 210086 sẽ xuất hiện 0x00 0x06, tiếp theo là tên tệp như FW_UP/ONBL1.bin
  • Mỗi record có vẻ là cấu trúc 60 byte, gồm chuỗi đệm 0 dài 32 byte, hai số nguyên little-endian, và tên phân vùng đệm 0 dài 20 byte
  • Hai số nguyên này được diễn giải lần lượt là độ dàioffset trong tệp
  • Có tổng cộng 6 record, nên 0x00 0x06 được diễn giải là byte kết thúc hoặc byte đệm của chuỗi phiên bản firmware cộng với số lượng phân vùng 1 byte
  • Các phân vùng được dựng lại

    • FW_UP/ONBL1.bin
      • Kích thước: 196 byte, offset: 0x0000800, tên phân vùng: ONBL1
    • FW_UP/ONBL2.bin
      • Kích thước: 46KB, offset: 0x00008c4, tên phân vùng: ONBL2
    • [WB850]DSC_5KEY_WB850
      • Kích thước: 30MB, offset: 0x000bef4, tên phân vùng: Main_Image
    • RomFS/SPID.Rom
      • Kích thước: 48MB, offset: 0x1d2b32c, tên phân vùng: Resource
    • FW_UP/WB850.HEX
      • Kích thước: 19KB, offset: 0x4c75f2c, tên phân vùng: OIS
    • FW_UP/skin.bin
      • Kích thước: 36MB, offset: 0x4c7acb2, tên phân vùng: SKIN
    • Việc trích xuất phân vùng được thực hiện bằng công cụ trích xuất phân vùng firmware DRIMeIII

Phân biệt phân vùng mã và dữ liệu

  • Công cụ trích xuất lấy tệp dựa trên tên phân vùng và thêm hậu tố .bin
  • Chỉ với kết quả từ file thì tính hữu dụng khá hạn chế, chẳng hạn Main_Image.bin còn bị nhận nhầm là OpenPGP Secret Key
  • ONBL1ONBL2 được suy đoán là bootloader giai đoạn 1 và 2 từ chuỗi "BootLoader(ONBL1, ONBL2) Update Done" bên trong Main_Image
  • Main_Image là firmware thực sự, và binwalk -A báo cáo nhiều ARM function prologue trong tệp này
  • ResourceSKIN là các container lớn, có thể là cấu phần do nhà sản xuất SoC cung cấp liên quan đến skin UI của máy ảnh
  • OIS dù có tên tệp như vậy nhưng thực tế không phải HEX, mà có thể là firmware cho bộ ổn định hình ảnh quang học chuyên dụng
  • Trọng tâm phân tích là Main_Image

Ánh xạ Main_Image trong Ghidra

  • Ba phân vùng ONBL1, ONBL2, Main_Image đều chứa mã ARM thực sự
  • Firmware ARM thông thường đặt bảng reset vector tại địa chỉ 0x0000000, nhưng cả ba binary đều bắt đầu bằng mã tuyến tính, nên cần remap về một địa chỉ khác chưa biết
  • Để phân tích lỗi nhận diện hotspot, cần thực hiện các việc sau
    • Tìm đúng địa chỉ bộ nhớ để ánh xạ Main_Image
    • Nạp tên symbol từ partialImage.o.map vào Ghidra
    • Phân tích hàm kích hoạt sai việc đánh giá đăng nhập hotspot
  • Khi tìm "yahoo" trong tab Defined Strings của Ghidra, xuất hiện các mục trông như chuỗi debug của 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!
  • Trong partialImage.o.map, DevHTTPResponseStart nằm tại 0x321a84, và Ghidra cũng tìm thấy hàm ở cùng offset này
  • Chênh lệch giữa giá trị con trỏ chuỗi debug và offset chuỗi thực tế khớp với 0xc0004000, nên kết luận địa chỉ base của Main_Image0xc0004000
  • Trong Ghidra không thể đổi địa chỉ base sau đó, nên phải xóa binary khỏi project rồi import lại với địa chỉ base đã đặt

Import tên hàm và phân tích DevHTTPResponseStart

  • ImportSymbolScript.py của Ghidra có thể import hàng loạt symbol từ bảng văn bản
  • Script này mong đợi mỗi dòng có tên symbol, địa chỉ hex, và f để chỉ hàm hoặc l để chỉ label
  • Trong partialImage.o.map, vì hiện tại chỉ cần các hàm trong phần .text, nên cần loại bỏ các mục sau
    • Dòng trống
    • Offset của object file
    • Label của section như .text
    • Label có tiền tố L$_
    • Symbol cục bộ có tiền tố $
  • Cần cộng thêm 0xc0004000 vào địa chỉ để khớp với địa chỉ base của Ghidra
  • Kết quả chuyển đổi được tạo dưới dạng như sysInit c0004000 f, archPwrDown c0004094 f rồi nạp trong Script Manager của Ghidra
  • Sau khi có tên hàm, việc gán nhiều trường DAT_ thành con trỏ và đổi tên tham số theo chuỗi debug giúp đọc được kết quả decompile của DevHTTPResponseStart

Điều kiện phát hiện hotspot

  • DevHTTPResponseStart xác định AP Wi‑Fi đã được xác thực hay chưa bằng cách xem trạng thái HTTP response, URL và header
  • Với phản hồi HTTP 200 OK, header phản hồi phải có cookie domain Yahoo thì mới được coi là xác thực thành công
    • Các giá trị được kiểm tra là domain=.yahoo, Domain=.yahoo, domain=kr.yahoo, Domain=kr.yahoo
    • Nếu thỏa điều kiện, p_request_ongoing sẽ được đổi thành 0, và nếu trình duyệt đang ở trạng thái chưa xác thực thì gọi safnotify_auth_ap(0)
  • Với redirect HTTP 301/302/307, mã sẽ kiểm tra chuỗi yahoo. trong URL
    • Nếu không có yahoo. hoặc nó nằm sau url + 11, hệ thống sẽ coi là không tìm thấy Yahoo
    • Nếu framebuffer của trình duyệt chưa bật và cũng chưa xác thực, nó sẽ gọi safnotify_auth_ap(1)
    • Nếu yahoo. xuất hiện sớm trong URL, nó sẽ xử lý là xác thực thành công bằng safnotify_auth_ap(0)
  • Trạng thái âm trả về false như một yêu cầu bị hủy
  • Với trạng thái dương không phải 200 hay redirect, kết quả thay đổi tùy theo trạng thái framebuffer của trình duyệt

Kiểm tra Yahoo bị hỏng sau TLS và cách vượt qua

  • URL mà máy ảnh truy vấn là http://www.yahoo.co.kr/
  • Khi gửi yêu cầu trực tiếp, máy chủ trả về HTTP/1.1 301 Moved Permanently cùng Location: https://www.yahoo.com/
  • Trong https://www.yahoo.com/, chuỗi con yahoo. nằm ở vị trí 12
  • Mã yêu cầu yahoo. phải nằm trong 11 vị trí đầu tiên, nên việc kiểm tra này đã bị phá vỡ sau chuyển đổi sang HTTPS
  • Để vượt qua kiểm tra hotspot, cần trỏ bản ghi DNS sang máy chủ khác, rồi để máy chủ đó trả redirect HTTP với tên trông giống Yahoo hơn hoặc đặt cookie domain Yahoo
  • Sau bản vá samsung-nx-emailservice, máy ảnh thực sự kết nối và tải ảnh lên thành công

Các máy ảnh khác áp dụng cùng cách vượt qua

  • Từ việc reverse engineering một hàm này, cuối cùng đã hiểu và vượt qua được cơ chế phát hiện hotspot trên máy ảnh Wi‑Fi Samsung WB850F
  • Bản vá cuối cùng khá nhỏ, nhưng do cách phát hiện do kỹ sư Samsung triển khai, rất khó đoán ra phương pháp vượt qua chỉ bằng packet trace
  • Sau khi biết cần tìm gì, cùng cách vượt qua đó cũng được áp dụng cho các máy ảnh truy vấn MSN.com
  • Kết quả là EX2F, ST200F, WB3xF, WB1100F đã được thêm vào danh sách máy ảnh được hỗ trợ
  • Main_Image có hơn 77 nghìn hàm, nên vẫn còn rất nhiều mục tiêu để tiếp tục phân tích nhằm hiểu rõ hơn hoạt động của máy ảnh số

1 bình luận

 
GN⁺ 2024-05-26
Các ý kiến trên Hacker News
  • Tôi thích bài ở https://op-co.de/blog/posts/samsung_nx_cryptofail/#index3h3 hơn
    Đây đúng là một ví dụ đáng kinh ngạc về thất bại trong mã hóa firmware

  • Công trình tuyệt vời. Tôi tò mò không biết bạn có định biến phương pháp reverse engineering này thành một tutorial không

    • Thực ra tôi đã hy vọng bài viết này cung cấp đủ thông tin để đóng vai trò như một tutorial
      Tôi chỉ bỏ qua những phần dễ Google thôi
  • Điều tôi muốn chỉ là khi chụp ảnh dSLR bằng nút trên máy ảnh, một lúc sau ảnh đó xuất hiện trong Apple Photos

    • Trước đây từng có thẻ SD tích hợp Wi-Fi có thể tự động đồng bộ ảnh, nhưng Eye-Fi, một trong những công ty lớn trong lĩnh vực đó, đã đóng cửa, và có vẻ chưa có ai làm sản phẩm mới hoạt động với các dịch vụ đám mây hiện đại
      Có lẽ nhu cầu không đủ vì smartphone gần như đã xóa sổ thị trường máy ảnh tiêu dùng. Một ý tưởng dự án là thử tìm cách nhét ESP32 vào trong thẻ SD
    • Canon dSLR có Wi-Fi có vẻ có thể dùng FTP
      Cũng có thể kết nối với điện thoại, máy tính bảng và website, nhưng cần ứng dụng hoặc dịch vụ. Tài liệu gửi trực tiếp từ máy ảnh qua FTP: https://gdlp01.c-wss.com/gds/5/0300024975/01/eos5d-mk4-wff-i... trang 113. Liên kết là sách hướng dẫn chức năng Wi-Fi (Wireless Communication) của EOS 5D Mark IV (WG)
    • Samsung NX1 và NX500 chạy Linux có thể được script hóa khá dễ để tải JPEG hoặc RAW lên bất kỳ dịch vụ online nào, miễn là có mạng Wi-Fi
      Đáng tiếc là chúng là các mẫu đã 10 năm tuổi và cũng hiếm trên thị trường đồ cũ
    • Dòng Nikon Z có Snapbridge gần như là lựa chọn tốt nhất theo hướng đó
      Có thể ghép đôi qua Wi-Fi hoặc Bluetooth, và nếu muốn còn có thể điều khiển máy ảnh từ xa bằng iPad và xem màn hình
    • Việc này đã làm được với Google Photos, nên trường hợp này cũng phải làm được: https://www.stg-uploader.xyz/