Mở khóa chế độ Developer ẩn trên Wahoo Bolt: Từ lỗi đồng bộ đến lỗ hổng bảo mật Bluetooth
Một lập trình viên đã phát hiện lỗ hổng bảo mật nghiêm trọng trên thiết bị Wahoo ELEMNT Bolt v3 trong quá trình khắc phục lỗi đồng bộ dữ liệu. Bằng cách phân tích ngược gói tin Bluetooth, anh đã mở khóa thành công chế độ Developer ẩn chỉ với 3 byte dữ liệu mà không cần xác thực phức tạp.

Mọi chuyện bắt đầu từ việc các chuyến đạp xe của tôi không còn đồng bộ lên điện thoại nữa. Đó chính là lý do duy nhất khiến tôi đi sâu vào việc phân tích ngược (reverse engineering) các gói tin Bluetooth, dịch ngược file APK Android và nhận được thông báo chào mừng đầy bất ngờ "WELCOME TO HELL DEVELOPER" trên máy đạp xe của mình.
Tôi sử dụng Wahoo ELEMNT Bolt v3, một thiết bị máy tính đạp xe GPS khá chất lượng với đầy đủ bản đồ, cảm biến và các tính năng cần thiết. Tuy nhiên, tại một thời điểm nào đó, dữ liệu chuyến đi của tôi ngừng tự động đồng bộ với ứng dụng đồng hành trên điện thoại. Điều này khá bực bội, nhưng không phải là tận thế. Tôi suy nghĩ rằng có thể thiết bị này có chế độ debug (gỡ lỗi) hoặc một chẩn đoán ẩn nào đó có thể giúp tôi tìm ra nguyên nhân.
Vì vậy, tôi đã làm điều mà bất kỳ người lý trí nào cũng sẽ làm: trích xuất file APK từ thiết bị và bắt đầu "soi" nó.
Đi sâu vào hệ thống
Bolt v3 chạy trên một bản dựng Android tùy chỉnh. Bạn có thể kết nối nó qua USB và nó sẽ hiện lên như một thiết bị MTP. Ứng dụng chính có tên gói là com.wahoofitness.bolt — tôi đã lấy file APK và ném vào công cụ jadx để dịch ngược mã nguồn.
Những gì tôi tìm thấy lại thú vị hơn nhiều so với việc sửa một lỗi đồng bộ đơn giản.
Chôn sâu trong mã nguồn đã dịch ngược, tôi tìm thấy một class tên là CruxAppProfileType. Thiết bị này có một hệ thống profile nội bộ dùng để khóa các tính năng:
- Thiết bị bán lẻ (Retail) được cài đặt chế độ STD (0).
- Nếu nâng cấp lên DEV (3), một menu debug hoàn toàn mới sẽ được mở khóa trong phần Cài đặt > Thiết bị > Nâng cao (Advanced).
Nghe có vẻ chính xác là thứ tôi cần — một cách để can thiệp vào hệ thống nội bộ và có thể tìm ra lý do tại sao đồng bộ bị lỗi.
Bài toán con gà và quả trứng
Profile này được lưu trữ trong SharedPreferences trên bộ nhớ trong của thiết bị — nghĩa là không thể truy cập qua giao thức MTP. ADB sẽ cho phép bạn thay đổi nó, nhưng chính quyền truy cập ADB lại bị khóa phía sau profile ALPHA+. Một tình huống "con gà và quả trứng" kinh điển.
Tuy nhiên, sau đó tôi nhận ra một điều trong mã BLE (Bluetooth Low Energy). Ứng dụng có một đặc tính (characteristic) gọi là BOLT_CFG cho phép ứng dụng đồng hành đọc và ghi cấu hình thiết bị qua Bluetooth. Và điều đáng nói là giao thức này có xác thực tầng ứng dụng bằng không. Không HMAC, không nonce, không cơ chế thách thức-phản hồi (challenge-response). Bảo mật hoàn toàn dựa vào việc pairing Bluetooth.
Đây là lúc tôi hợp tác với Claude (Opus 4.6) để phân tích mã Java đã dịch ngược và tìm ra định dạng gói tin chính xác. Dưới đây là những gì chúng tôi chắp ghép được:
Đặc tính BOLT_CFG sử dụng một giao thức nhị phân đơn giản. Để ghi một giá trị cấu hình, bạn gửi một gói SEND_PREFS:
APP_PROFILElà mã cấu hình 66 (0x42), được mã hóa dưới dạng một byte duy nhất.DEVlà giá trị 3.
Vậy toàn bộ gói tin để mở khóa chế độ nhà phát triển chỉ gồm ba byte:
[0x42, 0x03, 0x00]
Đó là tất cả. Chỉ ba byte qua Bluetooth để mở khóa một chế độ nhà phát triển ẩn trên một máy tính đạp xe bán lẻ.
Thông báo Welcome to Hell Developer trên màn hình thiết bị
Thực thi khai thác
Tôi đã viết một script Python sử dụng thư viện bleak (một thư viện BLE đa nền tảng) để tự động hóa toàn bộ quá trình này. Script sẽ quét thiết bị Wahoo, kết nối và gửi gói tin.
Chúng tôi đã gặp phải một vài vấn đề nhỏ cần giải quyết:
- Đăng ký thông báo là bắt buộc: Thiết bị sẽ âm thầm bỏ qua các lệnh ghi trừ khi bạn đã đăng ký nhận thông báo (subscribe notifications) trên đặc tính đó trước đó. Tôi mất một lúc để hiểu ra điều này — các lệnh ghi cứ thế biến mất vào hư không.
- Chỉ hỗ trợ ghi không cần phản hồi: Đặc tính này không hỗ trợ ghi có phản hồi (write-with-response), nên bạn phải sử dụng
response=False. - Yêu cầu kết nối đôi (Bonding): Bạn cần phải được kết nối (paired) với thiết bị trước khi nó chấp nhận các lệnh ghi — vì vậy đây không phải là điều một người lạ đi ngang qua có thể làm mà không có sự tham gia của chủ sở hữu.
Sau khi chạy script và khởi động lại Bolt, tôi điều hướng đến Cài đặt > Thiết bị > Nâng cao, và nó ở đó — một tùy chọn Menu Debug hoàn toàn mới chưa từng tồn tại trước đó. Và trên màn hình, một cửa sổ bật hiện ra:
WELCOME TO HELL DEVELOPER
Ngoài menu debug, chế độ DEV còn kích hoạt:
- Truy cập ADB (Android Debug Bridge).
- Khả năng cài đặt ứng dụng APK từ bên ngoài.
- Các tùy chọn ghi log chi tiết hơn.
Bài học về bảo mật
Những gì bắt đầu như một vấn đề đồng bộ hỏng đã trở thành một cái nhìn kỹ lưỡng về nội dung của Bolt. Giao thức cấu hình qua BLE không có xác thực tầng ứng dụng — một khi bạn đã kết nối đôi, bạn có thể ghi bất kỳ giá trị cấu hình nào mà ứng dụng có thể ghi. Không có HMAC, không nonce, không challenge-response nào ở phía trên lớp BLE.
Tôi đã kết thúc bằng việc tài liệu hóa toàn bộ giao thức BLE, hệ thống chuyển file và một số phát hiện khác trong các bài viết riêng.
Còn về vấn đề đồng bộ ban đầu của tôi? Sau tất cả những công sức đó — dịch ngược APK, phân tích giao thức nhị phân, viết script khai thác BLE — thì hóa ra vấn đề nằm ở chiếc điện thoại của tôi cả thời gian qua. Không phải máy tính đạp xe. Chính là chiếc điện thoại.
Bài viết liên quan

Phần cứng
Khung ảnh kỹ thuật số Aura Aspen đang được giảm giá 30 USD cuối tuần này
02 tháng 5, 2026

Phần cứng
Motorola Razr Ultra 2026: Đắt hơn nhưng vẫn là chiếc điện thoại gập đẹp nhất hiện nay
29 tháng 4, 2026

Phần cứng
Cẩm nang mua sắm Mini PC chạy Local LLM năm 2026: Giá tăng gấp đôi và đâu là lựa chọn tốt nhất?
02 tháng 5, 2026
