Bản cập nhật Honda Civic thế hệ 10 bị phát hiện dùng khóa kiểm thử AOSP

Phần mềm14 tháng 6, 2026·8 phút đọc

Một nhà nghiên cứu bảo mật đã tiết lộ rằng hệ thống thông tin giải trí (headunit) của Honda Civic thế hệ 10 sử dụng khóa kiểm thử công khai của AOSP để ký các bản cập nhật. Lỗ hổng này cho phép kẻ tấn công có tiếp xúc vật lý cài đặt mã độc thông qua cổng USB, một phương thức được gọi là "Evil Valet".

Ba năm trước, tôi đã bắt đầu công trình nghiên cứu nhằm hiểu và phân tích ngược chiếc xe của mình, cụ thể là hệ thống headunit (đầu phát thông minh) trên Honda Civic 2021. Sau những phản hồi tích cực từ cộng đồng, tôi viết bài này để cung cấp bản cập nhật quan trọng về tiến độ của dự án.

Chìa khóa của vương quốc

Bước tiến bộ lớn nhất nằm ở việc ánh xạ quy trình cập nhật phần mềm. Honda hỗ trợ cập nhật headunit qua USB. Mặc dù có nhiều kiểm tra đặc thù của Honda, nhưng cuối cùng ổ USB chứa một tệp cập nhật AOSP đã được ký, sau đó được đưa vào trạng thái chờ và áp dụng qua chế độ recovery của Android.

Tin tốt là gì? Họ đã để lại khóa kiểm thử AOSP công khai (publicly-known AOSP test key) trong res/keys. Mặc dù họ đã sửa đổi binary recovery, nhưng logic xác thực chữ ký verify_file vẫn khớp với AOSP gốc.

Do đó, miễn là bạn có thể định dạng đúng ổ USB và ký tệp bằng khóa kiểm thử AOSP công khai này, bạn có thể cài đặt bất cứ thứ gì lên headunit mà không cần quyền root theo cách truyền thống (không cần su với setuid).

Điều này có nghĩa là, miễn là headunit có điện và kẻ tấn công có quyền truy cập vật lý vào cổng USB phía trước, chúng có thể thực thi mã tùy ý (arbitrary code execution) trên headunit thông qua đường dẫn cập nhật.

Đây là một cuộc tấn công kiểu "evil maid" (quý cô độc ác). Tuy nhiên, vì nó yêu cầu quyền truy cập vật lý vào nội thất xe hơi thay vì phòng khách sạn, tôi gọi nó là cuộc tấn công "Evil Valet" (Nhân viên bãi xe độc ác). Hãy tưởng tượng một nhà báo lái xe đến khách sạn và giao xe cho nhân viên bãi xe. Người này, làm việc cho một cơ quan tình báo, cài đặt một bản cập nhật qua USB. Khi xe được trả lại, nhà báo không hề biết headunit đã bị chỉnh sửa.

Bài viết blog này không phải là một báo cáo kỹ thuật chi tiết. Nếu bạn muốn biết các chi tiết "máu me", hãy xem tài liệu kỹ thuật đi kèm.

Tôi cũng đã công bố một công cụ mới, ota-builder, cho phép mọi người dễ dàng chuẩn bị các tệp cập nhật được headunit chấp nhận. Dù còn ở giai đoạn sơ khai, việc xây dựng một tệp cập nhật để cài đặt binary su với setuid (tức là root thiết bị) giờ đây là hoàn toàn khả thi.

Tôi có cơ sở mạnh để tin rằng tất cả các bản cập nhật đều được ký bằng khóa kiểm thử AOSP công khai, nhưng tôi không có quyền truy cập vào mọi tệp cập nhật chính thức hay mọi biến thể headunit. Headunit của tôi có khóa kiểm thử AOSP trong res/keys, dù tôi cũng đã cài HondaHack nên có thể nó đã chèn khóa vào keystore. Tuy nhiên, tôi cũng đã xác nhận rằng tệp MRC_EU_SW_v12_4.zip, một bản cập nhật phần mềm khu vực EU có sẵn công khai, được ký bằng test key. Tệp này được tải xuống từ một diễn đàn công khai và chưa bao giờ bị tôi sửa đổi. Vì vậy, rất có thể tất cả các bản cập nhật đều dùng khóa kiểm thử AOSP.

Xây dựng công cụ

Ngoài quy trình cập nhật, công việc hữu ích nhất đã được thực hiện trên apk-rebuilder. Nó có một nhiệm vụ rất quan trọng: nhận tệp cập nhật Honda Civic từ Internet và tạo ra cây tệp đầu ra sạch sẽ, tự động hóa mọi thứ mà một kỹ sư phân tích ngược thường phải làm thủ công, bao gồm:

  • Giải quyết tài nguyên (resolving resources)
  • Tái tạo mã .smali
  • Đóng gói lại tệp APK
  • Trích xuất ramdisk
  • Và nhiều hơn nữa

Công cụ này cũng đóng vai trò quan trọng vì chúng ta không thể công bố mã nguồn thực tế của Honda. Chúng tôi công bố một hàm nhận tệp cập nhật (mà chúng tôi không lưu trữ) và xuất ra mã .smali, tài nguyên hình ảnh của Honda, v.v. Kết quả đầu ra tuân theo cấu trúc thư mục rõ ràng có thể được tham chiếu trong tài liệu mà không cần tải lên các tệp nhạy cảm thực tế.

Công việc còn lại - Kêu gọi đóng góp

Vẫn còn một số việc cần làm để hoàn thiện dự án.

Các phiên bản đã biết (Known Versions)

Quy trình cập nhật khá mong manh và phụ thuộc nhiều vào số phiên bản. Điều này không giới hạn khả năng chạy mã không ký, vì số phiên bản có thể được "giả mạo" (xem tài liệu kỹ thuật). Nhưng để xây dựng tệp cập nhật, bạn cần biết headunit của mình mong đợi phiên bản nào. Hơn nữa, bất kỳ thay đổi nào đối với phần mềm headunit không khớp với bản build của tôi có thể dẫn đến hành vi không mong muốn và vòng lặp recovery.

Nếu bạn lái Honda Civic thế hệ 10 và có kiến thức công nghệ, tôi khuyến khích bạn đóng góp vào phần "Known Versions, Display Audio Software" của kho lưu trữ.

Nếu bạn cảm thấy đặc biệt dũng cảm, hãy đọc mã ota-builder và thử flash một bản cập nhật. Nhưng hãy tự chịu rủi ro; nếu headunit của bạn khác với của tôi, bạn có thể bị kẹt trong vòng lặp recovery và làm hỏng phần mềm (softbrick) thiết bị.

Chuỗi công cụ (Toolchain)

Tôi có một chuỗi công cụ thử nghiệm đang phát triển trên máy cục bộ. Nó nhận mã .c ứng viên và biên dịch cho ARMv7, sử dụng phiên bản trình biên dịch và cờ xây dựng giống như các binary gốc của nhà sản xuất. Điều này proved vô giá trong công việc hiểu quy trình cập nhật. Nó sử dụng Docker nhiều. Phiên bản hiện tại khá lộn xộn và chủ yếu dành cho quy trình làm việc của tôi, nhưng tôi muốn xuất bản một bản triển khai sạch sẽ.

Chủ đề tùy chỉnh (Custom Themes)

Tôi đã khám phá điều này một chút khi phát triển apk-renderer. Việc vận chuyển các chủ đề tùy chỉnh có lẽ khó khăn vì chúng nằm trong bản fork AOSP framework của Mitsubishi, và các ứng dụng headunit được rút gọn (minified) để mong đợi các ID tài nguyên được mã hóa cứng. Bất kỳ nỗ lực nào để vận chuyển chủ đề tùy chỉnh có thể sẽ liên quan đến việc chỉnh sửa khung khối nhà cung cấp một cách phẫu thuật (và viết một công cụ để thực hiện việc đó tự động).

Không có điều nào trong số này là đơn giản và có thể không xứng đáng với công sức, nhưng tôi hoan nghênh những người đóng góp.

Cải thiện aidl-rebuilder

Tôi đã bắt đầu làm việc trên một công cụ để phân tích tệp .smali và tạo/sơ đồ hóa tất cả các giao diện AIDL trên headunit. Công cụ này hoạt động nhưng tôi chưa xem xét đầy đủ độ chính xác. Nó mở ra cánh cửa cho các ứng dụng tùy chỉnh như đồng hồ tốc độ ảo. Người đóng góp được hoan nghênh.

Suy nghĩ về Tài liệu và LLMs

Tôi đã chú trọng ít hơn vào tài liệu tham khảo và tập trung hơn vào công cụ. Ý tưởng là nếu tôi có thể cung cấp các công cụ đáng tin cậy, xác định ánh xạ mã headunit sang các dạng dễ tiêu hóa hơn, thì mọi người có thể sử dụng LLM để truy vấn các dạng đó để trả lời bất kỳ câu hỏi cụ thể nào của họ. Điều này tránh được việc phải duy trì tài liệu tham khảo có thể đi chệch khỏi mã headunit thực tế, vì mã headunit mới là nguồn sự thật chính xác.

Ví dụ, hướng dẫn sử dụng giải thích cách kết nối với headunit qua ADB vẫn được coi là hữu ích. Nhưng một tài liệu giải thích cách một đoạn mã Java hoạt động, khi chính đoạn mã Java đó có sẵn cho LLM, dường như là một gánh nặng bảo trì.

Kết luận và Lời cảm ơn

Tại thời điểm này, tôi đã thực hiện hầu hết công việc điều tra mà tôi dự định làm trên headunit.

Đây là một trong những dự án mà tôi có thể mải mê làm việc mãi mãi, nhưng tôi có lẽ sẽ chuyển sang các dự án khác.

Tuy nhiên, kho lưu trữ chắc chắn không bị bỏ rơi. Các PR (Pull Request) luôn được hoan nghênh.

Đặc biệt cảm ơn Tunas vì những kỷ niệm, và Hackaday đã đưa tin về công việc ban đầu của tôi.

Hẹn gặp mọi người vào một ngày nào đó trong tương lai 🌱

Eric CONTENT_VI_END

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗