2 poin oleh GN⁺ 2024-07-18 | 1 komentar | Bagikan ke WhatsApp
  • Rabbit R1 adalah perangkat berbasis aplikasi yang berjalan di atas Android 13 AOSP seperti mode kiosk, dan berhasil dibuat jailbreak tethered untuk mendapatkan root shell tanpa membuka kunci bootloader atau mengubah penyimpanan internal
  • Jailbreak ini tetap melewati verifikasi rantai boot MediaTek, lalu mengganti image kustom yang diunggah lewat USB di memori tepat sebelum image boot terverifikasi benar-benar digunakan
  • R1 memakai MediaTek MT6765, DRAM 4GB, dan eMMC 128GB, dan akses uid=0(root) melalui TCP bind shell tetap dimungkinkan meski ro.boot.verifiedbootstate berada pada status green
  • Log di penyimpanan internal menyimpan lokasi GPS, nama WiFi, ID BTS di sekitar, IP eksternal, token pengguna untuk API backend Rabbit, serta MP3 suara Rabbit dan transkripsinya; pada RabbitOS v0.8.112 ditambahkan pengurangan logging dan opsi reset pabrik
  • Rabbit Inc. belum merilis source code driver roda gulir hall-effect dan motor kamera berputar yang ditautkan statis ke kernel Linux, sehingga berada dalam kondisi melanggar GPL2, dan belum menanggapi pertanyaan terkait per 22 Juli

Titik awal analisis Rabbit R1

  • Rabbit R1 mendapat penilaian negatif dari para pengulas, dan di pasar barang bekas unit baru tersegel dijual di bawah harga resmi 200 dolar
  • RabbitOS bukan model AI lokal terpisah, melainkan aplikasi yang berjalan di Android 13 AOSP seperti mode kiosk, dan berkomunikasi dengan cloud lewat API JSON di atas websocket
  • API key yang sebelumnya diberitakan bocor diketahui berasal dari source code sisi server, dan tidak disimpan di dalam perangkat
  • Setelah itu, pembaruan aplikasi diberi alat obfuscation komersial serta memuat logika untuk mendeteksi alat analisis seperti Magisk dan Frida, sekaligus memverifikasi apakah perangkat itu benar-benar R1
  • Karena pelacakan menjadi merepotkan bila hanya mengandalkan analisis statis, penulis membeli R1 di eBay seharga £122 dan melakukan analisis runtime sambil menjaga firmware pabrik sedekat mungkin dengan kondisi aslinya

Perangkat keras R1 dan status keamanan dasarnya

  • R1 menggunakan SoC MediaTek MT6765, DRAM 4GB, dan penyimpanan eMMC 128GB
    • MT6765 memiliki bootrom exploit kamakiri yang telah dikenal sejak 2019
    • Penyimpanan 128GB terlihat sebagai pilihan yang tidak biasa untuk perangkat yang tampaknya tidak banyak menyimpan data lokal
  • Pemilik R1 telah memastikan bahwa mereka bisa membuka kunci bootloader dengan mtkclient, mem-flash custom ROM, atau melakukan root
  • Tujuan analisis bukanlah menjalankan image sistem Android kustom, melainkan melihat isi perangkat sambil mempertahankan firmware yang dipasang pabrik sedekat mungkin dengan kondisi asli
  • Pendekatan membuka kunci bootloader dan memasang Magisk memiliki beberapa masalah
    • Pembaruan OTA delta bisa rusak
    • Bisa terdeteksi oleh kode anti-analisis yang ada saat ini
    • Pembaruan di masa depan bisa mendeteksinya dengan memeriksa nilai seperti ro.boot.verifiedbootstate
  • Karena itu diperlukan cara untuk mendapatkan hak root lokal sambil meminimalkan titik perubahan, sehingga permukaan yang bisa dideteksi logika anti-analisis juga sekecil mungkin

Rantai boot berbasis MediaTek

  • Rantai boot disusun dengan logika MediaTek, dan titik awalnya adalah bootrom yang tertanam di silikon CPU
  • Setelah inisialisasi perangkat keras dasar, bootrom memuat Preloader dari partisi eMMC boot0 ke SRAM
    • Preloader ditandatangani, dan tandatangannya diverifikasi oleh bootrom
    • Namun pada R1, ada kemungkinan verifikasi itu sebenarnya tidak dijalankan, sehingga perlu pemeriksaan tambahan
  • Preloader menginisialisasi DRAM lalu memuat tiga image dari partisi GPT eMMC ke DRAM
    • tee: Arm Trusted Firmware, EL3
    • gz: GenieZone Hypervisor, EL2
    • lk: Little Kernel, EL1
  • LK mengimplementasikan Android Verified Boot 2.0 dan dm-verity
    • Jika bootloader dalam keadaan locked, kegagalan verifikasi akan membuat boot ditolak
    • Jika unlocked, sistem menampilkan peringatan dan menetapkan flag terkait orange state
    • Jika verifikasi dm-verity gagal, boot tetap tidak akan berjalan meski bootloader unlocked
  • Jika verifikasi lolos, LK akan mengekstrak kernel Linux dan melakukan boot, lalu kernel menjalankan /init dari initramfs
  • R1 menggunakan partisi A/B, sehingga boot adalah boot_a atau boot_b tergantung slot aktif
  • Status lock/unlock bootloader disimpan di partisi GPT seccfg
    • seccfg terdiri dari beberapa flag dan hash terenkripsi
    • Byte terakhir partisi frp berpengaruh pada apakah unlock bootloader seperti fastboot flashing unlock diizinkan

carroot: jailbreak tethered tanpa menyentuh penyimpanan

  • Root of trust dari rantai kepercayaan berada pada hash sertifikat di efuse CPU dan kode bootrom yang memverifikasinya
  • MT6765 memang memiliki bootrom exploit kamakiri, tetapi pada R1 bahkan tanpa exploit pun mode USB bootloader di brom dan Preloader menerima image DA unsigned untuk dijalankan di memori
  • Dibuat payload DA sendiri agar dimuat oleh Preloader ke DRAM
  • Alur kerjanya sebagai berikut
    • Mengunggah image Android boot kustom ke DRAM melalui USB
    • Memasang hook tepat sebelum Preloader melompat ke LK
    • Kembali ke Preloader untuk melanjutkan proses boot normal
    • Preloader memuat dan memverifikasi image tee, gz, dan lk dari eMMC
    • Tepat sebelum masuk ke LK, hook dijalankan untuk memasang hook dan patch tambahan di dalam LK
    • LK memuat dan memverifikasi partisi boot asli dari eMMC
    • Saat image boot disalin dari kode AVB ke kode boot Linux, hook menggantinya dengan image boot kustom yang diunggah lewat USB
    • Pesan kustom juga ditampilkan di layar
  • Intinya, data yang menjadi target verifikasi tetap diverifikasi apa adanya, lalu data yang telah dipatch diganti setelah verifikasi selesai tetapi tepat sebelum digunakan
  • Penyimpanan flash sama sekali tidak dimodifikasi, dan seluruh proses jailbreak berlangsung hanya di memori
    • Setelah reboot, perangkat kembali ke keadaan bersih
    • Ini memudahkan pemulihan ke kondisi semula selama proses reverse engineering
  • Image boot kustom memakai flashable-android-rootkit
    • Ia mengganti biner /init bawaan untuk menyuntikkan payload berupa layanan user space dengan hak tertinggi
    • Alat patch image magiskboot diambil dari proyek Magisk
    • Untuk membangun dan menjalankan magiskboot di Linux biasa, digunakan magiskboot_build
  • Payload-nya adalah TCP bind shell sederhana
    • Ini bukan cara yang diam-diam dan bisa saja terdeteksi oleh aplikasi Rabbit
    • Jika perlu, pendekatan ini bisa disempurnakan nanti

Alat jailbreak berbasis WebSerial dan hasil eksekusinya

  • Untuk memanipulasi perangkat MediaTek, mtkclient sebenarnya sudah menyediakan fungsi yang diperlukan, tetapi demi memahami cara kerjanya penulis membuat klien USB Python sendiri
  • Lalu ini di-port ke js/WebSerial sehingga Rabbit R1 yang terhubung secara fisik bisa di-jailbreak langsung dari halaman web
  • Nama jailbreak ini dipilih sebagai carroot, permainan kata dari rabbit
  • Alat eksperimental ini dipublikasikan di r1_jailbreak
  • Hasil setelah boot dan terhubung lewat TCP bind shell adalah sebagai berikut
$ rlwrap nc 192.168.0.69 1337


# id
uid=0(root) gid=0(root) groups=0(root) context=u:r:rootkit:s0


# getprop ro.boot.verifiedbootstate
green
  • Sistem menganggap secure boot berada pada status green, tetapi tetap mengizinkan akses root shell
  • Domain SELinux rootkit disetel oleh flashable-android-rootkit

Antarmuka perangkat yang dipakai untuk analisis dan referensi

  • Foto bongkaran iFixit untuk R1 menunjukkan test pad bertanda TX dan RX, yang merupakan test pad UART
  • UART menyediakan log debug di seluruh rantai boot
    • tahap brom menggunakan 115200 baud
    • tahap setelahnya menggunakan 921600 baud
    • level logika adalah 1.8V, tetapi pada perangkat analisis 3.3V juga bekerja tanpa kerusakan
  • Preloader menonaktifkan UART logging jika tombol volume-up tidak ditekan
    • Karena R1 tidak memiliki tombol volume-up, Preloader dipatch untuk menonaktifkan pemeriksaan ini
    • Preloader yang telah dipatch bisa di-boot melalui USB download mode milik bootrom
  • Pada command line kernel Linux, flag berikut dipatch agar log kernel keluar lewat UART
earlycon console=ttyS1,921600

Data pribadi yang ditemukan dalam log internal

  • R1 menyimpan log teks harian di Android/data/tech.rabbit.r1launcher.r1/files/logs/ pada penyimpanan internal
  • Per 7 Juli 2024, direktori log berisi file .log dari berbagai tanggal, dan beberapa file berukuran beberapa MB
  • Log tersebut memuat data berikut
    • Lokasi GPS yang akurat
    • Nama jaringan WiFi
    • ID BTS di sekitar yang dikumpulkan bahkan tanpa kartu SIM
    • Alamat IP yang menghadap ke internet
    • Token pengguna yang dipakai untuk autentikasi API backend Rabbit
    • MP3 yang di-encode Base64 dari semua ucapan Rabbit kepada pengguna dan transkrip teksnya
  • Dari data ini, lokasi GPS dan ID BTS di sekitar juga dikirim ke server Rabbit
  • Ada dua masalah utama
    • Perangkat tanpa keamanan perangkat keras yang berarti ini melakukan logging data yang terlalu rinci
    • Pengguna biasa tidak punya cara untuk melakukan reset pabrik, sehingga log praktis tersisa secara permanen
  • Dalam situasi perdagangan barang bekas yang aktif, log pengguna sebelumnya bisa tertinggal saat perangkat dijual, disumbangkan, atau dibuang
  • Melalui advisori keamanan, RabbitOS v0.8.112 mengurangi logging dan menambahkan opsi reset pabrik di pengaturan
  • Respons ini dilakukan dengan cepat, dan dinilai sebagai contoh pertama Rabbit yang relatif proaktif dalam menangani masalah privasi dan keamanan pengguna

Seberapa jauh sebenarnya kustomisasi AOSP

  • Rabbit pernah menjelaskan, menanggapi laporan bahwa RabbitOS hanyalah aplikasi biasa, bahwa sistem tersebut adalah AOSP yang sangat dikustomisasi dengan “lower level firmware modifications”
  • Kustomisasi yang sejauh ini terkonfirmasi terutama berupa penghapusan fitur Android untuk mempertahankan mode kiosk satu aplikasi
    • tidak ada navigation bar
    • tidak ada notification bar
    • ada langkah-langkah untuk mencegah ADB diaktifkan
  • Aplikasi bernama Judy berjalan di latar belakang dan akan menonaktifkan ADB bila sedang aktif
  • Pada 4 Juli, @MarcelD505 mempublikasikan metode escape dari kiosk yang dimulai dari browser login captive portal WiFi lalu masuk ke aplikasi Android system settings
  • Rabbit menutup jalur ini di pembaruan terbaru dengan menghapus sepenuhnya aplikasi Android system settings dari perangkat
  • Perubahan AOSP bespoke yang sejauh ini teramati lebih dekat ke arah menghapus fitur daripada menambahkan kemampuan baru
  • Sampai saat ini belum ditemukan alasan teknis yang menunjukkan implementasi RabbitOS saat ini tidak mungkin diwujudkan sebagai aplikasi smartphone biasa

Hal yang perlu diperhatikan pengguna R1 biasa

  • Jika khawatir perangkat mungkin telah dijailbreak tanpa diinginkan, cukup matikan lalu nyalakan kembali
    • Jika perangkat boot normal tanpa pesan peringatan, umumnya kemungkinan aman
    • Namun jika brom diatur untuk mem-boot image Preloader unsigned dari eMMC, ini belum bisa dipastikan dan perlu pengujian tambahan
  • Akan lebih baik jika bisa mem-flash ulang dengan image stock firmware tepercaya yang disediakan vendor, tetapi Rabbit tidak menyediakan sarana itu
  • Jika R1 dibiarkan tanpa pengawasan, data yang tersimpan di perangkat bisa dengan mudah diekstrak oleh orang yang memiliki pengetahuan terkait
  • Sebelum dijual, disumbangkan, atau dibuang, lakukan reset pabrik terlebih dahulu menggunakan opsi pengaturan yang baru ditambahkan

Pelanggaran GPL dan kesimpulan

  • Selain roda gulir dan kamera berputar, Rabbit R1 lebih mirip perangkat Android MediaTek biasa daripada perangkat dengan hardware khusus
  • Kustomisasi AOSP sebagian besar berbentuk penghapusan fitur bawaan untuk memaksakan mode kiosk satu aplikasi
  • Keamanan rantai boot tidak efektif, sehingga perangkat sulit ditinggalkan dalam keadaan aman
  • Rabbit Inc. melanggar lisensi GPL2 kernel Linux
    • driver deteksi roda gulir hall-effect masih bersifat closed-source
    • driver pengendali stepper motor untuk putaran kamera juga masih closed-source
    • kedua driver tersebut ditautkan statis ke image kernel GPL
  • Pada 12 Juli penulis meminta komentar Rabbit Inc. terkait isi artikel dan rencana kepatuhan GPL, tetapi hingga 22 Juli belum ada tanggapan
  • Alat jailbreak tethered yang dipublikasikan adalah alat eksperimental untuk membantu peneliti mengakses R1 miliknya sendiri, dan ke depan dapat membantu pengguna tingkat lanjut memperluas fungsi perangkat

1 komentar

 
GN⁺ 2024-07-18
Opini Hacker News
  • GPL mengharuskan lisensi dan kode sumber dibuka saat diminta, tetapi Truth Social bahkan tidak memublikasikan lisensinya sampai terungkap bahwa mereka memakai kode AGPL, baru setelah itu mereka merilis sumbernya
    Penasaran apakah Rabbit juga akan lolos dengan cara yang sama

    • Tidak persis begitu. GPL 2.0 memang mewajibkan setidaknya pengungkapan lisensi saat distribusi, tetapi kode sumber sebenarnya juga boleh disediakan dengan mekanisme berdasarkan permintaan
      Dalam praktiknya, pelanggaran yang tidak diketahui pemegang hak tidak bisa dilacak, dan biasanya fokusnya lebih pada membuat pelanggar menjadi patuh daripada menuntut ganti rugi
      https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
    • Kemungkinan besar Rabbit sudah keburu tutup sebelum dampak GPL benar-benar sampai ke mereka
      Saya kira modul kernel punya pengecualian GPL di sisi Linux terlepas dari cara linking-nya, selama tidak perlu memodifikasi kernel itu sendiri
    • GPL memang sulit ditegakkan sejak awal. Produsen Boox, Onyx, juga pernah disorot beberapa tahun lalu karena masalah yang sama, tetapi tidak banyak hasilnya, dan sepertinya Rabbit juga tidak akan terlalu kerepotan karena ini
  • Isi log ini cukup berantakan: ada lokasi GPS yang akurat, nama jaringan WiFi, ID BTS sekitar meski tanpa kartu SIM, alamat IP yang terekspos ke luar, token pengguna untuk autentikasi API backend Rabbit, bahkan MP3 yang dienkode Base64 dari semua hal yang Rabbit katakan kepada pengguna beserta transkrip teksnya

    • Yang penting adalah apakah informasi lokasi dan BTS selalu dikirim ke server, atau hanya dikirim saat diminta
      Tidak mengherankan jika perangkat yang dibuat untuk menjawab pertanyaan seperti “restoran enak di dekat sini apa?” mengirim konteks lokasi bersama permintaan, tetapi kalau perangkat terus-menerus melakukan streaming lokasi tanpa alasan, itu patut dikhawatirkan
      Nama WiFi memang perlu disimpan untuk koneksi ulang, dan alamat IP yang terlihat di log lokal juga tidak terlalu aneh
      Token akses pengguna juga mau tidak mau harus disimpan di perangkat agar bisa terhubung ulang tanpa login setiap kali. Namun meninggalkan token apa adanya di log adalah praktik buruk, dan jika log itu berada di storage yang sama dengan DB atau file konfigurasi terkait, itu sendiri bukan masalah yang sepenuhnya baru. Kalau log langsung diunggah ke server, tentu itu masalah
    • MP3 yang dienkode Base64 itu konyol. Yang didapat cuma peningkatan penggunaan data 33%
    • Kalau mempertimbangkan tujuan produknya, mustahil semua data seperti ini terkumpul secara tidak sengaja
    • Sebagian besar dari ini tidak tampak seperti masalah besar
      Kalau ingin perangkat seperti ini bekerja mulus dan terasa ajaib, ia harus terus mendengar, melihat, dan mengirim lokasi. Agar ini benar-benar berjalan baik, dibutuhkan inferensi lokal, dan saya tidak tahu kenapa orang mau membayar untuk benda yang lima tahun lagi akan dibuat Apple dalam versi yang jauh lebih baik, tetapi kalau memang membelinya, cara seperti ini diperlukan
      Tidak bisa membenci perusahaan raksasa sambil berharap startup membuat produk bagus tanpa data. Jika Rabbit ingin punya peluang membuat sesuatu yang lebih baik di masa depan, mereka membutuhkan data seperti ini
    • Banyak di antaranya lebih mirip “perangkat yang dipercaya untuk menangani informasi demi menyediakan layanan menyimpan informasi itu di log untuk tujuan pemecahan masalah”
      Kalau mau bilang ini tidak nyaman, harus dijelaskan secara spesifik kenapa tidak nyaman. Sebagian besar bukan sesuatu yang sangat mengkhawatirkan dengan sendirinya
  • Lucu juga. Saya pernah bekerja di Rabbit, membaca codebase-nya, lalu keluar setelah di-gaslight oleh para eksekutif

    • Kalau tidak keberatan, saya penasaran sinyal bahaya apa yang pertama terlihat dari codebase itu
      Dari jailbreak dan kerentanan yang terlihat dari luar saja, rasanya itu baru puncak gunung es
    • Kalau begitu bukankah kamu harus menceritakan kisah internal menarik soal yang disebut “large action model” itu?
    • Berarti kamu berhasil menghindari peluru
  • Rabbit tidak menjawab mungkin karena para pengacaranya sedang meninjau bagaimana cara menggugat

    • Kalau benar begitu, cukup lucu juga
    • Melihat jumlah perangkat yang terjual, saya tidak tahu apakah mereka sanggup menanggung biaya pengacara
    • Meminta komentar pada Jumat sore lalu menerbitkan tulisan Senin pagi dengan nada “tidak ada jawaban” itu sejujurnya cukup buruk
      Mereka nyaris tidak diberi jam kerja yang realistis untuk menjawab
    • Mengingat kemungkinan perusahaan terkait akan segera insolven, saya akan menganggapnya sekadar ancaman ala orang-orang pembuat Juicero
  • Pengembang RabbitOS bisa menambal masalah ini dengan mengatur eFuse agar akses bootloader lewat USB diblokir
    Moto juga menangani ini seperti itu beberapa tahun lalu ketika perangkat MediaTek mereka rentan terhadap permukaan serangan bootrom yang sama. Kalau ingatan saya benar, eFuse ini diatur pada tahap LK dan diterapkan lewat pembaruan firmware nirkabel biasa

  • Artikelnya keren
    Perangkat lunaknya terlihat seperti sampah, dan perusahaannya sejauh ini juga tidak tampak bagus
    Namun kalau aplikasi kustom bisa dijalankan dengan mudah meski hanya dalam mode kios, form factor ini bisa punya penggunaan yang cukup menarik
    Kalau PWA bisa ditempel seadanya, itu jauh lebih cepat daripada merakit sendiri ESP32, baterai, dan layar, dan terlihat seperti perangkat all-in-one yang cukup lumayan
    Idealnya, akan bagus kalau bisa berjalan lebih aman tanpa layanan Google, mungkin arah seperti GrapheneOS akan cocok
    Saya belum sempat mencari, tetapi penasaran apakah ada contoh penggunaan atau referensi untuk aplikasi kustom satu tujuan seperti ini

    • Dalam kondisi sekarang, hardware-nya masih cukup mahal
      Kalau harganya turun ke di bawah 50 dolar, misalnya setelah servernya dimatikan, saat itu saya bisa setuju bahwa ini platform hardware yang lumayan
  • Sayang sekali, padahal akan bagus kalau produk ini berhasil
    Saya harap ini tidak menjadi batu sandungan bagi eksperimen antarmuka pengguna hardware + AI di masa depan. Saya masih setuju dengan gagasan ala Bret Victor bahwa kita bisa melakukan sesuatu yang lebih baik daripada mengetuk dan menggeser persegi panjang kaca

    • Benar, tetapi persegi panjang kaca yang sudah ada di tangan kita sudah memiliki performa dan kemampuan hardware untuk menyediakan antarmuka lain seperti itu
      Lebih praktis lagi, smartwatch juga bisa meneruskan kueri ke ponsel
      Humane, meski tampaknya tidak benar-benar memecahkan masalah nyata, setidaknya pantas dihargai sampai batas tertentu karena benar-benar mencoba sesuatu yang berbeda. Rabbit R1 hanyalah barang rongsokan murah
  • Agak lucu bahwa semua atau sebagian besar kesan positif awal terhadap Rabbit berasal dari desain Teenage Engineering
    Semoga TE ke depannya lebih selektif memilih klien. Orang di balik Rabbit adalah penipu yang sudah dikenal

    • “Penipu” itu ada di dewan direksi TE, jadi ini sudah di luar kendali
    • Saya penasaran sumber untuk klaim “orang di balik Rabbit adalah penipu yang sudah dikenal” itu
      Saya bisa saja mencari namanya, tetapi kualitas pencarian sekarang terlalu buruk, jadi sepertinya saya tidak akan melakukannya. Akan berguna kalau ada tautan yang menunjukkan kritiknya lebih detail
  • Ini seperti Juicero-nya dunia asisten AI

    • Juicero dirancang dengan indah, mungkin malah berlebihan, dan bekerja sesuai yang diiklankan
      Hanya saja mereka mengira orang akan membayar uang yang tidak masuk akal untuk mesin yang memeras kantong campuran buah pra-potong khusus perusahaan. Semuanya bekerja persis seperti yang dimaksudkan; yang tidak masuk akal adalah model bisnis aslinya
    • Ini lebih mirip kalau Juicero press tidak punya satu pun komponen fungsional, tetapi hanya dipasangi pipa ke kantor pusat Juicero, lalu jus dari beberapa pemasok dicampur dan dipompa kembali ke perangkat dengan penundaan 5 menit
  • Saya tadinya berharap ada asisten AI open-source yang menjaga privasi, semacam gabungan Mycroft(https://en.wikipedia.org/wiki/Mycroft_(software)) dan Leon(https://getleon.ai)