1 poin oleh GN⁺ 2023-10-30 | 1 komentar | Bagikan ke WhatsApp
  • 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.1 ditampilkan, 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, dan mitmproxy
  • APK Tozo dipatch dengan apktool dan uber apk signer agar 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
    • FotaPackage untuk masing-masing earbud kiri dan kanan
    • FileSystemImage untuk 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, dan binwalk digunakan untuk mencoba memeriksa format serta file tertanam
  • Pada image filesystem terlihat sebagian string nama file, tetapi binwalk tidak 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 0xFFFF atau 0xFFFE
    • Keduanya tidak cukup unik sebagai penanda identifikasi file
  • 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 .mp3 yang sama dengan yang terdengar dari perangkat
  • Program Python sederhana bincontains.py dibuat 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, dd digunakan 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

 
GN⁺ 2023-10-30
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

    • Itu sebenarnya cukup lucu. Bisa dibayangkan betapa marahnya saat pertama kali menyadarinya
      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
    • Ear clip Bluetooth milikku berperilaku seperti ini saat memberi peringatan baterai lemah: mematikan audio yang sedang diputar, lalu hening dramatis, lalu berkata, “BATTERY LOW. PLEASE CHARGE NOW.”, lalu hening dramatis sekali lagi, baru kembali ke operasi normal
      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?
    • Akhirnya aku memakai speaker bantal dengan kabel jack 3,5 mm. Jadi bisa menghindari masalah seperti yang kualami di Bluetooth
    • Itu perangkat yang melakukan apa? Aku penasaran kenapa perlu koneksi Bluetooth saat mau tidur
    • Jadi teringat jam kota NNY di Futurama. Dalam cutscene, jam itu berteriak dengan volume maksimum, “THE TIME IS FOUR AM”
  • 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?

    • Ada tepat dua hal dari Android yang kurindukan di iOS, dan keduanya berkaitan dengan Bluetooth yang bekerja tidak seburuk ini
      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
    • Ponselku juga, Android 5, dan jujur hampir tidak pernah kupakai jadi aku tidak butuh yang baru sampai benar-benar rusak, melakukan hal yang sama setiap kali pertama kali terhubung ke mobil lewat Bluetooth setelah reboot
      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
    • Sepertinya sistem operasi tidak mungkin tahu berapa dB yang keluar di sisi seberang
      Bose milikku juga berperilaku berbeda tergantung chipset Bluetooth-nya. Di Linux, aku harus menaikkan volume ke 150% supaya bisa mendengar apa pun dengan layak
    • Bahkan kalau Apple membuat pemetaan seperti itu, datanya akan jadi usang sejak hari produk diluncurkan
      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
    • Headphone/earbud peredam bising menyelesaikan masalah ini
      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

    • Saya ingin bisa mengecilkan bunyi bip putar/jeda pada AfterShokz saya
      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