- Rabbit R1, Android 13 AOSP üzerinde kiosk modu gibi çalışan uygulama tabanlı bir cihaz; bootloader kilidini açmadan veya dahili depolamayı değiştirmeden root shell elde eden tethered jailbreak uygulandı
- Jailbreak, MediaTek boot zincirinin doğrulamasını olduğu gibi geçirip, doğrulanmış
boot imajı gerçekten kullanılmadan hemen önce USB ile yüklenen özel imajı bellekte onun yerine koyma yöntemiyle çalışıyor
- R1, MediaTek MT6765, 4GB DRAM ve 128GB eMMC kullanıyor;
ro.boot.verifiedbootstate değeri green iken bile TCP bind shell üzerinden uid=0(root) erişimi mümkün oldu
- Dahili depolama günlüklerinde GPS konumu, WiFi adı, çevredeki baz istasyonu kimlikleri, harici IP, Rabbit backend API’si için kullanıcı token’ı, Rabbit ses MP3’leri ve transkriptleri kaldı; RabbitOS v0.8.112’de günlükleme azaltıldı ve fabrika ayarlarına sıfırlama seçeneği eklendi
- Rabbit Inc., Linux kernel’a statik olarak bağlanan hall-effect kaydırma tekerleği ve döner kamera motoru sürücülerinin kaynak kodunu yayımlamadığı için GPL2 ihlali durumunda; 22 Temmuz itibarıyla ilgili sorulara yanıt vermedi
Rabbit R1 analizinin çıkış noktası
- Rabbit R1, eleştirmenlerden olumsuz değerlendirmeler aldı; ikinci el piyasasında açılmamış ürünler 200 dolarlık liste fiyatının altında satılıyor
- RabbitOS, ayrı bir yerel yapay zeka modeli değil; Android 13 AOSP üzerinde kiosk modu gibi çalışan bir uygulama ve bulutla WebSocket üzerinde JSON API aracılığıyla iletişim kuruyor
- Daha önce haber olan açıkta kalan API anahtarlarının sunucu tarafı kaynak kodundan sızdığı biliniyor; cihazın içinde saklanmıyordu
- Sonraki uygulama güncellemelerinde ticari bir obfuscation aracı kullanıldı; Magisk ve Frida gibi analiz araçlarını tespit etme ve cihazın R1 olup olmadığını doğrulama mantığı eklendi
- Yalnızca statik analizle iz sürmek zahmetli hale geldiği için eBay’den £122’ye bir R1 satın alındı ve fabrika firmware’i mümkün olduğunca olduğu gibi bırakılarak runtime analizi yapıldı
R1 donanımı ve varsayılan güvenlik durumu
- R1, MediaTek MT6765 SoC, 4GB DRAM ve 128GB eMMC depolama kullanıyor
- MT6765’te 2019’dan beri bilinen bootrom exploit’i
kamakiri bulunuyor
- 128GB depolama, yerel olarak fazla veri saklamayan bir cihaz için ilginç bir tercih gibi görünüyor
- R1 sahipleri,
mtkclient ile bootloader’ın unlock edilebildiğini ve custom ROM flash edilebildiğini ya da root yapılabildiğini doğruladı
- Analizin amacı custom bir Android sistem imajı yüklemek değil, fabrikada kurulu firmware’i mümkün olduğunca değiştirmeden incelemekti
- Bootloader’ı unlock edip Magisk kurma yönteminin çeşitli sorunları var
- OTA delta güncellemelerini bozabilir
- Mevcut analiz engelleme kodu tarafından tespit edilebilir
- Gelecekteki güncellemeler
ro.boot.verifiedbootstate gibi değerleri kontrol ederse tespit edilebilir
- Bu nedenle değişiklik noktalarını azaltarak analiz engelleme mantığının algılayacağı yüzeyi en aza indirirken yerel root yetkisi elde etmek gerekiyordu
MediaTek tabanlı boot zinciri
- Boot zinciri MediaTek mantığından oluşuyor; başlangıç noktası CPU silikonuna sabitlenmiş bootrom
- Bootrom, temel donanım başlatma işleminden sonra eMMC
boot0 bölümünden Preloader’ı SRAM’e yüklüyor
- Preloader imzalı ve imzası bootrom tarafından doğrulanıyor
- Ancak R1’de gerçekte doğrulama yapmıyor olma ihtimali var; ek doğrulama gerekiyor
- Preloader, DRAM’i başlatıyor ve eMMC GPT bölümünden üç imajı DRAM’e yüklüyor
tee: Arm Trusted Firmware, EL3
gz: GenieZone Hypervisor, EL2
lk: Little Kernel, EL1
- LK, Android Verified Boot 2.0 ve
dm-verity uyguluyor
- Bootloader locked durumdaysa doğrulama başarısız olduğunda boot etmeyi reddediyor
- Unlocked durumdaysa uyarı gösteriyor ve orange state ile ilgili flag’leri ayarlıyor
dm-verity doğrulaması başarısız olursa bootloader unlocked olsa bile boot etmiyor
- Doğrulama geçerse LK, Linux kernel’ını açıp boot ediyor; kernel da initramfs içindeki
/init’i çalıştırıyor
- R1, A/B partitioning kullandığı için
boot, aktif slota göre boot_a veya boot_b oluyor
- Bootloader lock/unlock durumu
seccfg GPT bölümünde saklanıyor
seccfg, birkaç flag ve şifrelenmiş hash’ten oluşuyor
frp bölümünün son byte’ı, fastboot flashing unlock gibi bootloader unlock izninde rol oynuyor
carroot: Depolamaya dokunmayan tethered jailbreak
- Güven zincirinin root of trust’ı, CPU efuse’ları içindeki sertifika hash’i ve bunu doğrulayan bootrom kodu
- MT6765’te
kamakiri bootrom exploit’i bulunuyor; ancak R1’de exploit olmadan da brom ve Preloader’ın USB bootloader mode’u unsigned DA imajlarını kabul edip bellekte çalıştırıyor
- Preloader’ın DRAM’e yüklemesi için özel bir DA payload oluşturuldu
- İşleyiş akışı şöyle
- USB üzerinden özel Android
boot imajı DRAM’e yükleniyor
- Preloader LK’ye atlamadan hemen önce bir hook kuruluyor
- Preloader’a geri dönülüp normal boot süreci sürdürülüyor
- Preloader, eMMC’den
tee, gz, lk imajlarını yükleyip doğruluyor
- LK’ye girilmeden hemen önce hook çalışıyor ve LK içine ek hook’lar ile patch’ler kuruyor
- LK, eMMC’deki özgün
boot bölümünü yüklüyor ve doğruluyor
boot imajı AVB kodundan Linux boot kodu tarafına kopyalandığı anda hook, onu USB ile yüklenen özel boot imajıyla değiştiriyor
- Ekranda özel bir mesaj da gösteriliyor
- Kilit nokta, doğrulanacak verinin olduğu gibi doğrulanmasına izin verip doğrulamadan sonra, kullanılmadan hemen önce patch’lenmiş veriyle değiştirmek
- Flash depolama hiç değiştirilmez; tüm jailbreak süreci yalnızca bellek içinde gerçekleşir
- Yeniden başlatınca cihaz temiz duruma döner
- Tersine mühendislik sürecinde eski haline döndürmek kolaydır
- Özel
boot imajı flashable-android-rootkit kullanıyor
- Varsayılan
/init binary’sini değiştirerek en yüksek yetkili user space servisi olan payload’u enjekte ediyor
- İmaj patch aracı
magiskboot, Magisk projesinden alınıyor
- Normal Linux’ta
magiskboot derleyip çalıştırmak için magiskboot_build kullanılıyor
- Payload basit bir TCP bind shell
- Gizli çalışan bir yöntem değil; Rabbit uygulamasının tespit etme ihtimali var
- Gerekirse daha sonra iyileştirilebilir
WebSerial tabanlı jailbreak aracı ve çalışma sonucu
- MediaTek cihazlarıyla çalışmak için mtkclient zaten gerekli işlevleri sağlıyor; ancak çalışma mantığını anlamak için Python USB istemcisi sıfırdan yazıldı
- Daha sonra bu istemci js/WebSerial’a port edilerek fiziksel olarak bağlı Rabbit R1’in bir web sayfasından jailbreak yapılabilmesi sağlandı
- Jailbreak adı, rabbit kelime oyununu yansıtacak şekilde carroot olarak seçildi
- Deneysel araç r1_jailbreak adresinde yayımlandı
- Boot sonrası TCP bind shell ile bağlanınca sonuç şöyle oldu
$ 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, secure boot durumunu
green olarak görürken root shell erişimine de izin verdi
rootkit SELinux domain’i flashable-android-rootkit tarafından ayarlanıyor
Analizde kullanılan cihaz arayüzleri ve referanslar
- R1’in iFixit söküm fotoğraflarında TX ve RX olarak işaretlenmiş test pad’leri görülüyor; bunlar UART test pad’leri
- UART, boot zincirinin tamamında debug log sağlıyor
- brom aşaması 115200 baud
- sonraki aşamalar 921600 baud
- Mantık seviyesi 1.8V; analiz cihazında 3.3V da hasar vermeden çalıştı
- Preloader, volume-up tuşuna basılmadığında UART logging’i devre dışı bırakıyor
- R1’de volume-up tuşu olmadığı için bu kontrolü devre dışı bırakmak üzere Preloader patch’lendi
- Patch’lenmiş Preloader, bootrom’un USB download mode’u ile boot edilebiliyor
- Linux kernel command line’a aşağıdaki flag’ler patch’lenerek kernel loglarının UART’a yazılması sağlandı
earlycon console=ttyS1,921600
- Bu patch kombinasyonuyla tüm boot sürecinin UART logları toplandı
- SIM yuvasından erişilebilen reset düğmesinin yanındaki test pad’i reset sırasında GND’ye çekilirse brom USB mode’da boot edilebiliyor
- Başlıca referanslar şunlar
Dahili günlüklerde bulunan kişisel bilgiler
- R1, dahili depolamada
Android/data/tech.rabbit.r1launcher.r1/files/logs/ altında tarihe göre metin günlükleri tutuyordu
- 7 Temmuz 2024 itibarıyla günlük dizininde farklı tarihlere ait
.log dosyaları vardı; bazı dosyalar birkaç MB boyutundaydı
- Günlüklerde şu veriler yer alıyordu
- Kesin GPS konumu
- WiFi ağ adı
- SIM kart olmasa bile toplanan çevredeki baz istasyonu kimlikleri
- İnternete bakan IP adresi
- Rabbit backend API kimlik doğrulamasında kullanılan kullanıcı token’ı
- Rabbit’ın kullanıcıya söylediği her şeyin Base64 kodlu MP3’ü ve metin transkripti
- Bu verilerden GPS konumu ve çevredeki baz istasyonu kimlikleri Rabbit sunucularına da gönderiliyor
- Sorun iki yönlüydü
- Anlamlı bir donanım güvenliği olmayan bir cihazda aşırı ayrıntılı veri loglanıyordu
- Normal kullanıcının fabrika ayarlarına sıfırlama yolu olmadığı için günlükler fiilen kalıcı kalıyordu
- İkinci el satışın hareketli olduğu bir ortamda, satış, bağış veya imha sırasında önceki kullanıcının günlükleri kalabiliyordu
- RabbitOS v0.8.112, güvenlik duyurusu üzerinden logging’i azalttı ve fabrika ayarlarına sıfırlama ayar seçeneği ekledi
- Bu yanıt hızlı gerçekleşti ve Rabbit’ın kullanıcı gizliliği ile güvenlik sorunlarına nispeten proaktif yaklaştığı ilk örnek olarak değerlendirildi
AOSP özelleştirmesinin gerçek kapsamı
- Rabbit, RabbitOS’un basit bir uygulama olduğu yönündeki haberlere karşı bunun “lower level firmware modifications” içeren yüksek ölçüde özelleştirilmiş bir AOSP olduğunu açıklamıştı
- Şu ana kadar doğrulanan özelleştirmeler çoğunlukla tek uygulamalı kiosk mode korumak için Android işlevlerini kaldırma biçiminde
- navigation bar yok
- notification bar yok
- ADB etkinleştirmesini engellemeye yönelik önlemler var
Judy adlı bir uygulama arka planda çalışıyor ve ADB çalışıyorsa onu devre dışı bırakıyor
- 4 Temmuz’da @MarcelD505, WiFi captive portal login tarayıcısından başlayıp Android system settings uygulamasına giren bir kiosk escape yöntemi yayımladı
- Rabbit, son güncellemede Android system settings uygulamasını cihazdan tamamen kaldırarak bu yolu kapattı
- Şu ana kadar doğrulanan bespoke AOSP değişiklikleri, mevcut özellikleri eklemekten çok özellikleri kaldırma yönüne yakın
- Mevcut RabbitOS uygulamasının sıradan bir akıllı telefon uygulaması olarak mümkün olmadığını gösteren teknik bir neden henüz doğrulanmadı
Normal R1 kullanıcılarının dikkat etmesi gerekenler
- İstemeden jailbreak yapılmış olabileceğinden endişeleniyorsanız cihazı kapatıp açmanız yeterli
- Uyarı mesajı olmadan normal şekilde boot ederse genel olarak güvenli olabilir
- Ancak brom, eMMC’den unsigned Preloader imajını boot edecek şekilde ayarlıysa bu kesin değildir ve ek test gerekir
- Satıcı tarafından sağlanan güvenilir bir stock firmware imajıyla yeniden flash etmek mümkün olsaydı daha iyi olurdu; ancak Rabbit böyle bir yöntem sunmuyor
- R1 unattended bırakılırsa cihazda saklanan veriler, ilgili bilgiye sahip kişiler tarafından kolayca çıkarılabilir
- Satış, bağış veya imha öncesinde yeni eklenen ayar seçeneğiyle önce fabrika ayarlarına sıfırlama yapılmalı
GPL ihlali ve sonuç
- Rabbit R1, kaydırma tekerleği ve döner kamera dışında özel donanımı olmayan tipik bir MediaTek Android cihaza yakın
- AOSP özelleştirmeleri çoğunlukla tek uygulamalı kiosk mode’u zorunlu kılmak için mevcut özellikleri kaldırma şeklinde
- Boot zinciri güvenliği etkili değil; bu yüzden cihazı güvenle gözetimsiz bırakmak zor
- Rabbit Inc., Linux kernel’ın GPL2 lisansını ihlal ediyor
- Hall-effect kaydırma tekerleği algılama sürücüsü closed-source durumda
- Kamera döndürme stepper motor kontrol sürücüsü de closed-source durumda
- İki sürücü de GPL kernel imajına statik olarak bağlanmış
- 12 Temmuz’da Rabbit Inc.’e metin hakkında yorum ve GPL uyum planı soruldu; ancak 22 Temmuz itibarıyla yanıt alınmadı
- Yayımlanan tethered jailbreak aracı, araştırmacının kendi sahip olduğu R1’e erişmesine ve gelecekte ileri düzey kullanıcıların cihazın işlevlerini genişletmesine yardımcı olmayı amaçlayan deneysel bir araçtır
1 yorum
Hacker News yorumları
GPL, talep edildiğinde lisansın ve kaynak kodun yayımlanmasını gerektirir; ancak Truth Social, AGPL kodu kullandığı ortaya çıkana kadar lisansı bile yayımlamadan geçiştirdi ve ancak o zaman kaynağı yayımladı.
Rabbit’in de aynı şekilde sıyrılıp sıyrılmayacağını merak ediyorum
Pratikte hak sahibinin bilmediği ihlalleri takip etmek mümkün değildir ve genelde amaç tazminattan çok ihlal edeni uyumlu hâle getirmektir.
https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
Çekirdek modüllerinde, çekirdeğin kendisinde değişiklik gerekmiyorsa bağlantı yönteminden bağımsız olarak Linux tarafında bir GPL istisnası olduğunu sanıyordum
Bu günlüklerin içeriği epey pis: kesin GPS konumu, WiFi ağ adı, SIM kart olmasa bile yakındaki baz istasyonu ID’leri, dışarıya görünen IP adresi, Rabbit backend API’sinde kimlik doğrulama için kullanıcı token’ı, Rabbit’in kullanıcıya söylediği her şeyin Base64 kodlanmış MP3 hâli ve metin dökümleri bile var
“Yakınlarda iyi bir restoran nerede?” gibi soruları yanıtlamak için yapılmış bir cihazın, istekle birlikte konum bağlamı göndermesi şaşırtıcı değil; ama hiçbir sebep yokken konumu sürekli akıtıyorsa bu endişe verici olur.
WiFi adının yeniden bağlanmak için saklanması gerekir ve yerel günlüklerde IP adresinin görünmesi de çok tuhaf değil.
Kullanıcı erişim token’ının da her seferinde giriş yapmadan yeniden bağlanabilmek için cihazda saklanması kaçınılmaz. Ancak token’ı günlüklerde düz biçimde bırakmak kötü bir pratiktir; günlükler ilgili DB ya da yapılandırma dosyasıyla aynı depodaysa bu tek başına tamamen yeni bir sorun değildir. Günlükleri doğrudan sunucuya yüklüyorsa elbette sorun olur
Böyle bir cihazın pürüzsüz ve sihirliymiş gibi çalışmasını istiyorsanız sürekli dinlemesi, görmesi ve konum göndermesi gerekir. Aslında bunun düzgün çalışması için yerel çıkarım gerekir; 5 yıl sonra Apple’ın çok daha iyi bir versiyonunu yapacağı bir şeye neden para verilir bilmiyorum ama illa satın alacaksanız böyle bir yöntem gerekir.
Büyük şirketlerden nefret edip sonra da bir startup’ın veri olmadan iyi ürün yapmasını bekleyemezsiniz. Rabbit’in gelecekte daha iyi bir şey yapma ihtimali bile olsun isteniyorsa bu verilere ihtiyacı var
Bunun rahatsız edici olduğunu söyleyecekseniz neden rahatsız edici olduğunu somut biçimde açıklamanız gerekir. Çoğu, kendi başına çok endişelenecek şeyler değil
Komik. Rabbit’te çalıştım; codebase’i okuyup yöneticiler tarafından gaslighting’e uğradıktan sonra ayrıldım
Dışarıdan görünen jailbreak ve açıklar bile buzdağının ucu gibi duruyor
Rabbit’in yanıt vermemesi, muhtemelen avukatların nasıl dava açacaklarını değerlendirmesindendir
Gerçekte yanıt verebilecekleri neredeyse hiç mesai saati bırakmamışsınız
RabbitOS geliştiricileri, USB üzerinden bootloader erişimini engelleyecek şekilde eFuse ayarlayarak bu sorunu yamayabilir.
Moto da birkaç yıl önce MediaTek cihazlarında aynı bootrom saldırı yüzeyine karşı savunmasız olduğunda bunu böyle çözmüştü. Doğru hatırlıyorsam bu eFuse LK aşamasında ayarlanmış ve normal kablosuz firmware güncellemesiyle uygulanmıştı
Yazı harika.
Yazılım çöp gibi görünüyor, şirket de şimdiye kadar pek iyi görünmüyor.
Yine de kiosk modunda bile özel uygulamaları kolayca çalıştırmak mümkünse bu form faktörüyle epey ilginç kullanım alanları olabilir.
Üstüne kabaca bir PWA koymak mümkünse ESP32, pil ve ekranı kendiniz bağlayıp yapmaktan çok daha hızlı olur ve oldukça iyi bir hepsi bir arada cihaz gibi görünüyor.
İdeal olarak Google servisleri olmadan daha güvenli çalıştırılabilmesini isterdim; GrapheneOS benzeri bir yön iyi olabilir.
Henüz bakmadım ama bunun gibi tek amaçlı özel uygulamalar için kullanım örnekleri ya da referans alınabilecek kaynaklar var mı merak ediyorum
Fiyat 50 doların altına düşerse, örneğin sunucuları kapattıktan sonra, o zaman iyi bir donanım platformu olduğuna katılabilirim
Bu ürünün başarılı olmasını isterdim, yazık oldu.
Gelecekteki donanım kullanıcı arayüzü + AI deneyleri için baş ağrısı olarak kalmamasını umarım. Cam dikdörtgene dokunup kaydırmaktan daha iyisini yapabileceğimiz yönündeki Bret Victor tarzı fikre hâlâ katılıyorum
Daha da pratik olarak, bir akıllı saat sorguları telefona aktarabilir.
Humane gerçek bir sorunu çözmemiş gibi görünse de gerçekten farklı bir şey denemiş olmasına belli ölçüde saygı duyuyorum. Rabbit R1 ise sadece ucuz ıvır zıvır
Rabbit’e yönelik ilk olumlu duyguların tamamının ya da çoğunun Teenage Engineering tasarımından kaynaklanması biraz komik.
Umarım TE bundan sonra müşterilerini daha iyi seçer. Rabbit’in arkasındaki kişi bilinen bir dolandırıcı
İsmini arayabilirim ama bugünlerde arama kalitesi o kadar kötü ki yapmayacağım. Eleştirileri daha ayrıntılı gösteren bir bağlantı varsa faydalı olur
Bu, AI asistanları dünyasının Juicero’su gibi
Sadece şirketine özel, önceden kesilmiş meyve karışımı poşetlerini sıkmaya yarayan bir makineye insanların saçma paralar ödeyeceğini düşündüler. Her şey tam da amaçlandığı gibi çalıştı; asıl iş modeli saçmaydı
Mycroft(https://en.wikipedia.org/wiki/Mycroft_(software)) ve Leon(https://getleon.ai) karışımı gibi, gizliliği koruyan açık kaynak bir AI asistanı beklemiştim