- Suara sistem saat pairing, terhubung, dan terputus pada earbud Tozo T6 terlalu keras, jadi masalah ini diselesaikan dengan langsung menurunkan gain file audio di dalam firmware
- Chipsetnya diduga berasal dari lini Airoha AB1562, dan melalui aplikasi AirReps156X dikonfirmasi adanya kemungkinan untuk mengunggah informasi diagnostik serta firmware yang dimodifikasi
- Trafik pengecekan pembaruan dari aplikasi Tozo dicegat dengan mitmproxy, lalu tautan binari firmware earbud didapat dari respons
/api/v1/getOtaVersionV3 - Firmware terdiri dari dua FotaPackage dan dua FileSystemImage untuk earbud kiri/kanan, dan di dalam image filesystem yang menjadi target modifikasi terdapat file mp3 dalam bentuk aslinya
- Dengan
mp3gain, mp3 diturunkan hanya sebesar -19.5dB tanpa re-encoding atau mengubah durasi, lalu byte di dalam image diganti dan di-flash; perangkat tetap berfungsi normal dan suaranya menjadi jauh lebih kecil
Suara sistem yang terlalu keras dan asumsi awal
- Earbud Tozo T6 memutar suara setiap kali pairing, terhubung, dan terputus, dan suara ini terlalu keras dibanding tingkat yang diinginkan pengguna
- Menurunkan seluruh rentang beberapa dB di equalizer tidak menyelesaikan masalah, dan setelah menghubungi Tozo lewat email, perusahaan menjawab bahwa tidak ada yang bisa mereka lakukan
- Tujuannya adalah memodifikasi firmware yang berjalan di perangkat untuk menurunkan volume file suara terkait
- Pada awalnya, pendekatannya didasarkan pada beberapa asumsi
- Binari firmware untuk perangkat bisa didapatkan secara online
- Firmware mungkin memiliki struktur binari yang mudah dipahami seperti ELF
- File audio disertakan di dalam firmware, dan bisa dimodifikasi jika offset serta panjangnya diketahui
- Audionya mungkin memakai format sederhana seperti PCM
- Firmware yang dimodifikasi bisa di-flash dengan alat untuk perangkat atau chipset tersebut
- Dalam praktiknya, banyak asumsi ternyata meleset, dan lebih banyak waktu dihabiskan untuk menyiapkan infrastruktur analisis seperti proxy dan mencari jalur alternatif dibanding reverse engineering itu sendiri
Identifikasi perangkat dan chipset
- Pada perangkat elektronik murah, biasanya ada beberapa pihak dan lapisan yang saling terkait
- Vendor yang menjual produk dengan mereknya, dalam kasus ini Tozo
- Ada chipset, yaitu hardware inti yang menjalankan firmware
- Chipset dapat menggunakan ISA yang diturunkan dari teknologi dasar seperti ARM atau MIPS
- Fitur untuk koprosesor tambahan atau antarmuka hardware dapat terintegrasi
- Saat membongkar aplikasi Android Tozo, ditemukan referensi ke Airoha SDK, model chip tertentu, serta fungsi-fungsi dasar untuk berkomunikasi dengan perangkat
- Informasi tentang arah investigasi diperoleh dari komunitas Reddit terkait replika AirPods,
/r/airreps, dan aplikasi AirReps156X juga diperiksa - Aplikasi AirReps156X menggunakan Airoha SDK dan dapat menyediakan informasi diagnostik perangkat Airoha
- Saat perangkat dihubungkan ke aplikasi tersebut, string diagnostik
QW_1562U_SDK1.5.1ditampilkan, dan berdasarkan ini chipset perangkat dinilai sebagai seri Airoha AB1562 - Aplikasi AirReps156X juga memiliki fungsi untuk mem-flash firmware baru, sehingga syarat utama untuk mengunggah firmware yang dimodifikasi ke perangkat terpenuhi
Menemukan URL firmware dari trafik aplikasi Tozo
- Aplikasi Tozo menampilkan versi firmware saat ini dan apakah itu versi terbaru ketika terhubung ke earbud
- Karena aplikasi tampaknya berkomunikasi dengan server untuk mengecek informasi firmware terbaru, diputuskan untuk mencari URL file firmware sebenarnya dalam proses pengecekan pembaruan
- Alih-alih analisis statis dengan membaca kode hasil dekompilasi sampai tuntas, dipilih analisis dinamis dengan melihat request jaringan secara langsung
- Proxy penyadap dibuat menggunakan NIC nirkabel,
hostapd, danmitmproxy - APK Tozo dipatch dengan
apktooldanuber apk signeragar mempercayai sertifikat TLS mitmproxy di penyimpanan CA pengguna- Aplikasi Android sering kali secara default hanya melihat penyimpanan CA sistem
- Melalui patch APK, aplikasi dibuat agar juga menggunakan penyimpanan CA pengguna, lalu ditandatangani ulang agar bisa dijalankan di Android
- Konfigurasi proxy mencakup penyiapan AP, pengalihan trafik 80/443 ke port mitmproxy dengan
iptables, dan pengaturan NAT - Saat aplikasi menampilkan “current” di sebelah versi firmware, aplikasi mengirim request ke endpoint
/api/v1/getOtaVersionV3, dan responsnya berisi tautan bin firmware yang dibutuhkan
Struktur dan analisis file firmware
- Firmware yang diperoleh terdiri dari total 4 file
FotaPackageuntuk masing-masing earbud kiri dan kananFileSystemImageuntuk masing-masing earbud kiri dan kanan
- Kedua image filesystem identik, sehingga file uniknya adalah dua FotaPackage untuk kiri/kanan dan satu image filesystem, total 3 file
file,strings,hexdump, danbinwalkdigunakan untuk mencoba memeriksa format serta file tertanam- Pada image filesystem terlihat sebagian string nama file, tetapi
binwalktidak menemukan file mp3 yang diharapkan - mp3 tidak memiliki magic number atau footer yang jelas, sehingga sulit menentukan offset dan panjangnya dalam binari sembarang
- Awal file bisa berupa
0xFFFFatau0xFFFE - Keduanya tidak cukup unik sebagai penanda identifikasi file
- Awal file bisa berupa
- Jika struktur image filesystem dapat diketahui, awal dan akhir tiap file seharusnya bisa diketahui, sehingga fokus dialihkan untuk memahami format image tersebut
Analisis entropi dan ROFS
- Analisis entropi berguna untuk memvisualisasikan bagian file mana yang mendekati konstanta, noise acak, atau teks ASCII, serta titik transisinya
- Image filesystem tampak memiliki struktur yang terlihat, tetapi file FotaPackage tampak terkompresi atau terenkripsi
- FotaPackage kiri dan kanan hanya berbeda sesekali pada sebagian header, isi utamanya hampir identik, lalu berbeda sepenuhnya pada sekitar 7KB di bagian akhir
- Arti persis dari perbedaan ini tidak berhasil dipastikan, tetapi karena ada transformasi yang buram, dinilai sulit mendapatkan informasi bermakna tanpa usaha besar
- Image filesystem diawali dengan string ASCII
ROFS - Tidak ditemukan dokumentasi publik atau informasi format yang cocok untuk
ROFS, dan Airoha SDK yang ditemukan kemudian berisi implementasi antarmuka untuk membaca image ini - Sempat dicoba jalur untuk mendekripsi FotaPackage, tetapi hanya sampai memastikan bahwa SDK tidak mentransformasi firmware sebelum dikirim, tanpa hasil berarti
Menurunkan volume tanpa re-encoding mp3
- Fakta bahwa file-nya adalah mp3 awalnya menjadi faktor risiko
- Encoder mp3 memiliki banyak opsi, dan decoder yang tidak diketahui bisa saja gagal memproses file tertentu yang sebenarnya valid
- Jika audio yang diputar tepat setelah koneksi menyebabkan masalah, perangkat bisa crash sebelum bisa tersambung kembali, sehingga masuk ke kondisi yang tidak dapat dipulihkan
- Jika mp3 diencode ulang, panjang file bisa berubah, dan itu mungkin mengharuskan modifikasi informasi panjang di dalam image filesystem secara tepat
- Untungnya, mp3 dapat disesuaikan gain-nya tanpa re-encoding, perubahan panjang, atau perubahan metadata
- Ini mirip dengan cara memutar JPEG tanpa re-encoding, yaitu hanya memodifikasi sebagian struktur data internal
Petunjuk krusial dari SDK
- Dengan mencari nama chipset, ditemukan salinan Airoha SDK, dan di dalamnya ada file
.mp3yang sama dengan yang terdengar dari perangkat - Program Python sederhana
bincontains.pydibuat untuk memeriksa file mana yang disertakan apa adanya di dalam binari lain - Diverifikasi bahwa file mp3 dari SDK masuk ke image filesystem dalam bentuk aslinya
- Tidak dikompresi
- Tidak dipecah menjadi blok
- Karena itu offset dan panjangnya di dalam image dapat dihitung
- Kode SDK terkait ROFS ditinjau sekilas, dan tidak terlihat simbol yang sangat mengindikasikan adanya checksum
- Pada titik ini, syarat yang dibutuhkan untuk modifikasi sudah terpenuhi tanpa reverse engineering tambahan
- Ada file firmware dan metode flashing
- Lokasi dan panjang file mp3 di dalam image diketahui
- Gain mp3 bisa disesuaikan tanpa mengubah panjang
- Diasumsikan bahwa mengganti hanya rentang byte di dalam file tidak akan merusak metadata filesystem
Memodifikasi image filesystem dan flashing
- Skrip Bash menelusuri file-file mp3 dari SDK dan mencari file yang tertanam di dalam image filesystem
- mp3 yang tertanam disalin ke file sementara, lalu gain-nya diturunkan dengan
mp3gain - Nilai penyesuaian yang digunakan adalah -19.5dB
- Setelah memastikan ukuran mp3 yang dimodifikasi sama dengan aslinya,
dddigunakan untuk menimpa byte pada offset terkait di image filesystem - Image firmware akhir, sesuai perkiraan, hanya berbeda beberapa byte pada diff binari
- Firmware yang dimodifikasi di-flash ke perangkat, perangkat berfungsi normal, dan suara sistem menjadi jauh lebih pelan dibanding sebelum dimulai
Hasil dan keterbatasan
- Tidak perlu mendekripsi enkripsi firmware atau memahami seluruh format filesystem
ROFS - Dalam praktiknya, banyak waktu reverse engineering dipakai untuk jalur alternatif yang tidak langsung diperlukan bagi solusi akhir
- Jika pengaturan volume suara sistem adalah fitur bawaan perangkat, modifikasi seperti ini tidak akan diperlukan
- Untuk perangkat yang memutar audio, lebih tepat jika kontrol volume untuk semua suara yang keluar dari perangkat disediakan di tingkat UI
- Dalam kasus ini, menurunkan gain mp3 di dalam image firmware saja sudah cukup sebagai solusi sementara
1 komentar
Komentar Hacker News
Semoga ada yang memperbaiki masker tidur Bluetooth milikku seperti ini juga
Secara umum sebenarnya cukup bagus, tetapi saat baterainya lemah atau ketika akan mati, perangkat itu memberi tahu dengan volume maksimum
Di masker tidur, begitu lagi
Aku pernah memakai jam alarm dengan cacat serupa, yang punya fitur sinkronisasi waktu radio MSF
Tetapi setiap kali menyinkronkan ulang dengan sinyal waktu MSF, jam itu mengeluarkan suara yang sama seperti alarm selama 2–3 detik, dan tidak bisa dimatikan
Selalu berbunyi sekitar pukul 3 pagi, di jam yang mengerikan seperti itu, jadi akhirnya kubuka dan kupotong antena MSF-nya, lalu tidur lebih nyenyak sambil tahu bahwa jam itu akan selalu sedikit tidak akurat
Selama itu, aku berusaha mengejar lagi apa yang dikatakan lawan bicara beberapa detik tadi, tetapi biasanya gagal
Notifikasi ini jauh lebih buruk daripada tidak melakukan apa-apa. Kalau tidak ada peringatan, skenario terburuknya adalah audio putus dan aku melewatkan ucapan lawan bicara; ear clip itu justru sengaja menciptakan efek yang sama dengan jadwal yang lebih cepat
Tidak ada alasan mengapa ini tidak bisa dicampur ke aliran audio yang sudah ada dalam bentuk semacam pola bunyi bip yang tidak mengganggu. Tidak sampai 1 detik, dan juga tidak akan menciptakan sendiri masalah yang katanya ingin dicegah
Perilaku Bluetooth buruk lain yang sulit dibayangkan adalah saat memakai voice chat, semua audio komputer biasa ikut hilang. Jika voice chat memakai input mikrofon, perangkat Bluetooth berpindah ke mode “headset”, dan mode ini mengubah stereo menjadi mono serta menjadi satu-satunya output yang diizinkan selama sedang menyediakan atau mungkin akan menyediakan input audio
Aplikasi yang tidak memakai input audio terus mencoba memutar ke perangkat headphone Bluetooth yang sudah tidak ada lagi, sehingga semuanya jadi tidak bisa mengeluarkan suara
Aku tidak paham kenapa harus ada banyak mode perangkat. Tidak ada alasan aku ingin kehilangan fungsi sebagai efek samping dari berbicara dengan keluarga. Aku juga tidak paham kenapa memutar sinyal audio berbeda ke kedua telinga secara bersamaan harus jadi sesuatu yang sulit hanya karena ada kemungkinan mikrofon akan aktif. Perangkat non-Bluetooth bisa menangani ini, dan bahkan tidak dianggap sebagai fitur yang layak diperhatikan. Kenapa “headphone tidak mati saat memakai mikrofon” harus menjadi sesuatu yang istimewa?
Keren! Salut untuk penulis aslinya yang menuntaskan ini sampai akhir
Karena topik earbud yang terlalu keras sudah muncul, sepertinya aku mungkin punya masalah sebaliknya. Di treadmill, aku memakai earbud olahraga Bose pada tingkat yang menurutku nyaman dan konservatif, tetapi iPhone memberiku peringatan bahwa volumenya terlalu tinggi dan sedang merusak pendengaran
Apakah ponselnya benar? Kalau iya, demi kesehatan telinga aku bersedia mengorbankan sedikit kesenangan. Tetapi ada hipotesis lain yang juga masuk akal. Pada pengaturan volume yang sama, earbud ini memang jelas menghasilkan volume fisik yang lebih rendah dibanding produk lain yang pernah kupakai, jadi bisa saja pemodelan malas Apple menghasilkan peringatan keliru seperti yang kuterima
Kalau Apple benar-benar membuat database yang memetakan model produk dan pengaturan volume ke volume fisik nyata, aku ingin memuji mereka. Tetapi notifikasi dan penjelasan fiturnya sama sekali tidak memberi detail, jadi sulit dipercaya, dan aku juga tidak ingin pengalaman olahraga jadi lebih buruk hanya karena Apple memasukkan model setingkat tugas kuliah ke produk nyata
Apakah ada yang tahu apakah data science di balik notifikasi ini benar-benar solid?
Pertama, di iOS volume minimum earbud Bluetooth-ku terlalu besar. Itu terjadi di semua headphone pihak ketiga yang pernah kucoba, dan keluhan yang sama sudah muncul online selama 10 tahun. Uni Eropa bahkan sudah meloloskan aturan untuk memaksa perbaikannya, tetapi spoiler: tidak ada efeknya
Tolong, volume minimum di UI harus dipetakan ke integer volume hardware 1
Kedua, aplikasi pihak ketiga tidak bisa mengekspos musik atau podcast ke menu penelusuran media Bluetooth di mobil. Di Android, itu bisa
Jadi di Android aku bisa mendengarkan podcast dan streaming Tidal dengan jog wheel mobil, tetapi di iOS tidak bisa
Ada juga keluhan Bluetooth lain. Kenapa Apple Watch-ku mem-blacklist stereo mobil? Bluetooth di iOS versi N dan N-1 benar-benar penuh bug
Ini jelas cuma fitur yang bodoh. Kalau saja aku bisa root, mungkin aku bisa mematikan switch itu di file konfigurasi di suatu tempat, tetapi di Samsung Galaxy J1 (2016) aku tidak pernah berhasil
Bose milikku juga berperilaku berbeda tergantung chipset Bluetooth-nya. Di Linux, aku harus menaikkan volume ke 150% supaya bisa mendengar apa pun dengan layak
Tapi juga tidak ada alasan untuk percaya bahwa mereka benar-benar melakukan itu. Kalau produsen headphone melaporkan rentang dB saat koneksi Bluetooth sehingga fitur seperti itu dimungkinkan, itu akan menarik, tetapi aku belum pernah mendengar hal semacam itu. Tidak seperti jack 3,5 mm, Bluetooth setidaknya berada di ranah yang bisa memungkinkan fitur seperti itu
Dengan peredam bising, volume bisa dijaga di bawah 20% dan tetap mendapatkan pengalaman mendengar yang nyaman tanpa menyiksa telinga
Dalam kasusku, beberapa tahun lalu telingaku mulai sakit setelah olahraga panjang, jadi menurutku peringatan Apple kemungkinan memang benar. Sejak memakai peredam bising, masalah itu hilang sepenuhnya
Pekerjaan seperti ini benar-benar bagus. Tiba-tiba model earbud ini terasa cukup menarik
Sebagai tambahan, suara sistem yang dikeluarkan perangkat Bluetooth adalah salah satu faktor yang paling membedakan antarproduk. Ada yang benar-benar mengerikan: https://youtu.be/J2wPsH64JEM
Namun, saya belum pernah melihat ulasan atau halaman produk yang memberi tahu suara seperti apa yang dikeluarkan produk tersebut. Padahal harus didengar berkali-kali setiap hari, dan tidak ada cara untuk mematikannya
Hanya dengan memungkinkan suara ini diubah saja rasanya sudah bisa menjadi pembeda yang cukup mudah
Saat memakai penyumbat telinga di tempat kerja yang bising, itu sempurna, tetapi di kantor yang tenang saat saya memutar musik pelan untuk berkonsentrasi, itu terasa mengganggu dan mengagetkan
Saya tidak paham mengapa suara sistem tidak mengikuti pengaturan volume
Akan bagus jika headset yang terhubung ke ponsel bisa diketahui apakah itu set speaker, in-ear monitor, bone conduction, dan sebagainya
Saat memakai set speaker biasa dan sengaja memutarnya keras agar terdengar dari mana saja di rumah, peringatan “volume terlalu tinggi” itu menjengkelkan
Pada headphone bone conduction, volume yang cukup besar memang dibutuhkan agar terdengar jelas, jadi itu dua kali lebih menjengkelkan
Untungnya ini menargetkan Airoha yang tidak memakai enkripsi firmware
Kalau penasaran, ada juga template 010 Editor untuk format firmware
https://github.com/ramikg/airoha-firmware-parser
Saya akui keahliannya, tetapi tetap disayangkan bahwa untuk melakukan hal mendasar seperti sedikit mengubah volume pemutaran file saja perlu usaha sebesar ini
Rasanya tidak seharusnya dibutuhkan kerja sebanyak ini hanya untuk membuat alat berfungsi sesuai keinginan
Ini bukan soal “bisa dimengerti”. Produk ini sudah dibayar, dan ini adalah masalah produk yang harus diperbaiki
Setelah membaca ini saya membeli Tozo T6 bekas, yang dari tampilannya tampak diproduksi cukup baru, tetapi saya tidak bisa mereproduksinya
Aplikasi resmi Tozo bahkan tidak mengenali headset tersebut, dan saya juga tidak bisa memastikan apakah itu memakai chipset Airoha yang diidentifikasi lewat dukungan AAC. Milik saya hanya mendukung SBC
Mungkin saya membeli yang palsu, atau ada perubahan internal setelah penulis membelinya
Sebagian file audio terdengar sama seperti yang ada dalam SDK Airoha parsial yang beredar di internet, tetapi perangkat itu juga memutar beberapa file suara baru lainnya
Jika ingin memverifikasi hasil ini secara independen atau sekadar bereksperimen, AirPods palsu mungkin bisa menjadi jalur yang lebih baik
Saya berharap lebih banyak orang mengeluhkan suara sistem yang besar dan buruk
Sony WH-1000XM4 saya juga punya masalah yang persis sama, tetapi tampaknya Sony mengenkripsi payload firmware dan mendekripsinya di perangkat
Saya hampir saja membongkarnya total untuk dump semuanya dan menjelajahinya, tetapi tangan saya gemetar dan kemungkinan merusaknya terlalu besar
Saya bersedia membayar cukup mahal untuk headset noise-cancelling yang bisa di-hack