Firmware Patch: Skipping U-Boot and Kernel Verification

cuongtm
7 months agoWed, Mar 12, 2025 4:56 PM

Trong quá trình nghiên cứu bảo mật các thiết bị IoT, chắc hẳn ai cũng sẽ gặp trường hợp thiết bị không có Log, không có shell, Khiến việc phân tích firmware trở nên khó khăn. Vậy vấn đề đặt ra liệu ta có thể sửa dữ liệu, thêm các option tùy ý để thuận tiện quá trình phân tích thiết bị hay không????

Bài viết này tôi sẽ không đề cập tới việc decrypt/encrypt firmware hay các vấn đề liên quan mà sẽ tập trung vào quá trình verify của Uboot và Kernel.

U-boot

Sau khi có được firmware đã decypt, extract firmware để lấy filesystem, thử thêm một lệnh bất kỳ vào /etc/init.d và nạp lại vào thiết bị. Lúc này chương trình báo lỗi trong quá trình Boot (ERROR: Kernel Secure Check Falied, Can't StartUp)

Vậy có thể kết luận nhanh là Uboot đã check kernel, ta sẽ phải phân tích Uboot đầu tiên.

Sau thời gian reverse ta sẽ tìm được nơi mà bước check này được xử lý.

image.png

Có 3 nguyên nhân dẫn tới Kernel Secure Check Falied, Can't StartUp

  • Image null
  • No Signature
  • Verify Data Fail

Khi biết rõ nguyên nhân, ta có 2 giải pháp:

  • Patch 3 hàm xử lý check
  • Patch hàm chính gọi tới 3 hàm check này (đây là cách tốt nhất)

image.png

Verify_data failed nhưng chương trình vẫn tiếp tục và gọi kernel. Coi như vấn đề này đã xong, khi chương trình khởi động lên thì nó bị reset liên tục, theo phán đoán thì lúc này kernel đã tiếp tục check Filesystem.

Kernel

Kernel nằm trong file có tên uImage, sau khi decrypt ta có những phân đoạn sau.

image.png

Nó được nén gzip, ta cắt ra và giải nén thì có được các module xử lý của kernel, tiến hành reverse nào.

image.png

Danh sách các filesystem được kernel kiểm tra sẽ nằm trong /etc/SigFilePartition, chương trình sẽ đọc và lưu danh sách filesystemvào bộ đệm rootlistbuff và lưu lại vào file /etc/SigFileList

image.png

Nội dung các file nằm trong /etc/SigFileList này sẽ được đọc và hash thành 1 giá trị 32-bytes.

image.png

Trong firmware tồn tại 1 file /etc/Data_signature, file này chứa giá trị hash filesystem gốc của firmware khi được sản xuất.

image.png

Hai kết quả hash của quá trình này sẽ được so sánh với nhau, nếu kết quả khác thì chương trình đã bị thay đổi và sẽ nhảy vào reliableenv_rebooot(). Và đó là lý do sau khi ta thêm thử 1 lệnh thì chương trình bị reset liên tục. Lý do đã rõ, thì ta có thể patch đoạn check và tùy ý thêm sửa nội dung trong filesystem.

Thử nghiệm

Mặc định Telnet của thiết bị không thể truy cập.

image.png

Tôi sẽ thêm 1 Binary mới vào thư mục bin và chạy dịch vụ Telnet để lấy shell trên port 5555.

image.png

Và đây là kết quả, ta đã có shell trên thiết bị, tha hồ debug và tìm lỗi.

image.png

Recent Articles