Penjelasan Struktur Internal iMessage
(jjtech.dev)- iMessage menggunakan APNs bukan sekadar sebagai saluran notifikasi, tetapi sebagai basis transmisi dua arah, dan melalui IDS menggabungkan pendaftaran/pengambilan kunci publik serta persiapan pengiriman pesan
- Setelah terhubung ke APNs, perangkat menerima push token lalu memfilter topik iMessage
com.apple.madriduntuk menentukan cakupan pesan yang akan diterima - Pendaftaran IDS memerlukan token autentikasi Apple ID, sertifikat jangka panjang, unggahan kunci publik enkripsi dan penandatanganan, serta pengiriman validation data, sehingga dirancang agar sulit dipakai di perangkat non-Apple
- Enkripsi pesan terbagi menjadi format lama
pairdan format barupair-ec, danpair-ecmenyediakan forward secrecy berbasis pre-key yang mirip Signal - Pengirim dapat mengirim payload terenkripsi secara terpisah untuk tiap penerima atau menggabungkannya, tetapi agar perangkat terbaru bisa mendekripsi, kunci AES harus menyertakan tag HMAC
APNs sebagai basis pengiriman iMessage
- Salah satu lapisan dasar iMessage adalah Apple Push Notification Service(APNs)
- APNs berada pada lapisan yang sama dengan layanan yang dipakai aplikasi App Store untuk menerima notifikasi dan pembaruan secara real-time bahkan saat aplikasinya tertutup
- Dalam iMessage, APNs berfungsi bukan hanya untuk menerima notifikasi, tetapi juga sebagai layanan dua arah untuk pengiriman pesan
- Saat perangkat terhubung ke APNs, perangkat akan menerima push token
- Token ini digunakan untuk merutekan notifikasi ke perangkat tertentu
- Secara teknis token ini berbeda dari token yang diterima lewat API
application:didRegisterForRemoteNotificationsWithDeviceToken: - Token dari API tersebut memiliki cakupan per aplikasi dan diminta dengan bundle ID aplikasi, tetapi tujuannya serupa
- Saat mengirim push notification ke perangkat, topic pesan juga harus ditentukan
- Topic biasanya terlihat seperti Bundle ID
- Topic untuk iMessage adalah
com.apple.madrid
- Saat perangkat terhubung ke APNs, perangkat mengirim filter message untuk memberi tahu server pesan apa yang ingin diteruskan
- Server APNs juga disebut APNs Courier
- Filter message dapat memuat daftar topic menurut status
- Status topic dapat berupa
enabled,opertunistic,paused, ataudisabled
Kueri IDS yang berjalan di atas APNs
- APNs tidak hanya dipakai untuk pengiriman pesan iMessage yang sebenarnya
- Melalui lapisan pseudo-HTTP di atas APNs, IDS dapat mengirim kueri dan menerima respons
- Untuk terhubung ke APNs, diperlukan sertifikat klien yang diterbitkan oleh Albert activation server
Alur autentikasi IDS dan Apple ID
- IDS berperan sebagai server kunci untuk iMessage dan juga dipakai layanan lain seperti FaceTime
- IDS tampaknya merupakan singkatan dari IDentity Services, tetapi disebutkan tidak ada konfirmasi resmi
- Karena iMessage menggunakan enkripsi end-to-end, kunci publik setiap peserta harus dipertukarkan dengan aman
- Langkah pertama dalam pendaftaran IDS adalah memperoleh token autentikasi
- API memerlukan nama pengguna dan kata sandi Apple ID
- 2FA kemudian ditambahkan ke API IDS dalam bentuk adaptasi belakangan
- Metode lawas menempelkan kode 2FA langsung ke kata sandi
- Metode GrandSlam menggunakan “Anisette data” untuk membuktikan bahwa ini perangkat yang sama sehingga tidak perlu memasukkan ulang kode 2FA
- Setelah itu, pengguna bisa memperoleh Password Equivalent Token(PET) untuk digunakan seperti kata sandi dan kode 2FA
- Setelah mendapatkan token autentikasi, token tersebut harus segera ditukar dengan sertifikat yang lebih tahan lama
- Sertifikat ini memungkinkan pendaftaran IDS, tetapi dengan sendirinya belum cukup untuk melakukan pencarian kunci
Pendaftaran IDS dan validation data
- Langkah terpenting dalam penyiapan IDS adalah registration
- Dalam registration, kunci publik enkripsi dan kunci penandatanganan diunggah ke server kunci
- Berbagai client data tentang kemampuan yang didukung perangkat juga ikut diunggah
- Permintaan IDS registration memerlukan blob biner bernama “validation data”
- Ini adalah mekanisme verifikasi Apple untuk mencegah perangkat non-Apple menggunakan iMessage
- Pembuatan validation data menggunakan informasi seperti serial number, model, dan UUID disk perangkat
- Tidak semua validation data bisa diperlakukan sama
- Mirip Hackintosh, usia akun dan “score” menentukan apakah serial yang salah masih bisa dipakai atau apakah muncul galat “customer code”
- Biner yang menghasilkan validation data dibuat dengan obfuscation yang kuat
pypushmengatasi hal ini dengan mengemulasikan biner yang di-obfuscate memakai custom mach-o loader dan Unicorn Enginepypushmenyediakan properti perangkat seperti serial number ke biner yang diemulasikan melalui berkasdata.plist
Pencarian kunci dan session token
- Setelah pendaftaran IDS, perangkat akan menerima identity keypair
- Keypair ini dipakai untuk melakukan pencarian kunci publik
- Dengan memberikan akun yang ingin dicari, akan diperoleh daftar “identities”
- Setiap identity mewakili satu perangkat yang terdaftar pada akun tersebut
- Daftar ini memuat informasi penting seperti public key, push token, dan session token
- Session token diperlukan untuk mengirim pesan ke perangkat
- Token ini berfungsi sebagai bukti bahwa pencarian baru saja dilakukan
- Session token memiliki masa berlaku
- Hanya akun yang melakukan permintaan pencarian yang bisa menggunakannya, sehingga tidak dapat dibagikan
Pesan masuk dan format enkripsi
- Untuk menerima pesan, cukup filter koneksi APNs ke
com.apple.madriddan kirim active state packet - Format enkripsi pesan masuk bergantung pada capability yang diumumkan saat pendaftaran IDS dan versi iOS perangkat pengirim
- Format lama sebelum iOS 13 adalah
pair - Format baru adalah
pair-ec
- Format lama sebelum iOS 13 adalah
- Format
pairlebih banyak didokumentasikan dan lebih mudah diimplementasikan - Tidak seperti
pair-ecyang lebih baru,pairtidak menyediakan forward secrecy dengan “pre-keys” - Pesan dapat didekripsi berdasarkan berbagai paper dan implementasi
pypush - Verifikasi tanda tangan pesan bersifat opsional, tetapi penting untuk membuat klien yang aman
Cara pengiriman dan hal yang perlu diperhatikan saat implementasi
- Pengiriman pesan pada dasarnya adalah proses kebalikan dari penerimaan
- Pesan dapat dikirim satu per satu untuk tiap penerima
- Ada juga cara menggabungkan banyak penerima dan payload terenkripsi untuk masing-masing penerima ke dalam satu bundle besar
- Dalam kasus ini APNs akan memisahkannya
- Pesan dikirim ke semua peserta percakapan
- Termasuk ke perangkat lain milik akun sendiri
- Hal yang sering terlewat saat mengirim adalah bahwa kunci AES tidak sepenuhnya acak
- Pada kunci AES terdapat HMAC yang ditempelkan sebagai tag
- Jika memakai kunci AES yang sepenuhnya acak, perangkat terbaru akan gagal mendekripsi pesan
Implementasi terkait dan materi referensi
pypush: proyek open source untuk mengimplementasikan ulang iMessage- IMFreedom Knowledge Base: iMessage: basis pengetahuan terkait iMessage
- M. Frister:
pushproxy: implementasi terkait - Nicolás:
apns-dissector: alat analisis APNs - QuarkSlab: iMessage Privacy: materi terkait privasi iMessage
- Garman et al. Chosen Ciphertext Attacks on Apple iMessage: paper serangan chosen-ciphertext terhadap Apple iMessage
- NowSecure: Reverse Engineering iMessage: materi reverse engineering iMessage
- Elcomsoft: iMessage Security and Attachments: materi tentang keamanan iMessage dan lampiran
- Eric Rabil’s
open-imcore: proyek terkait - The Apple Wiki: Apple Push Notification Service: dokumentasi terkait APNs
- Mihir Bellare and Igors Stepanovs: Security under Message-Derived Keys: Signcryption in iMessage: paper tentang signcryption iMessage
- Apple Platform Security: How iMessage sends and receives messages securely: penjelasan Apple tentang keamanan iMessage
- Nicolás: Apple IDS payload keys: materi tentang key payload Apple IDS
1 komentar
Opini Hacker News
Sepertinya Apple akan mulai mengunci iMessage dengan attestation (DeviceCheck)
Namun ada masalah bahwa perangkat lama akan membutuhkan pembaruan perangkat lunak
Saat membuat “validation data”, informasi seperti nomor seri perangkat, model, dan UUID disk digunakan; seperti pada Hackintosh, bergantung pada umur akun dan “skor”, hasilnya bisa menentukan apakah nomor seri yang tidak valid bisa dipakai atau justru muncul galat “customer code”
Galat “customer code” pada dasarnya adalah prompt kegagalan attestation dari Apple, jadi kalau sudah terkena, pengguna harus menghubungi Apple Support untuk membuka kunci Apple ID
Pelanggan normal bisa melewatinya dengan mudah, misalnya dengan menyetujui login dari perangkat yang sah, tetapi pengguna Hackintosh mengakali proses ini dengan teknik bypass
https://old.reddit.com/r/hackintosh/comments/gij9rt/getting_...
Ini terdengar seperti fitur yang setidaknya semestinya masuk ke Lockdown Mode Apple, bukan sekadar bagian dari keamanan sistem operasi secara keseluruhan
Mungkin mereka melihat saat ini sebagai kesempatan bagus untuk berbelok ke arah yang lebih terbuka
Mengurai protokolnya memang hebat, tetapi saya juga penasaran dengan stack infrastruktur iMessage
Skalanya sangat besar tetapi berjalan sebaik ini, sementara layanan web Apple lain, seperti forum atau portal developer, terasa penuh bug dan belum matang, jadi makin mengherankan
Notifikasi push dari semua aplikasi messenger pihak ketiga juga melewatinya, begitu juga aplikasi non-messenger yang memiliki notifikasi
Termasuk notifikasi senyap internal. Saat Anda menambahkan rapat ke kalender di Mac, push dikirim ke iPhone agar memperbarui karena data iCloud berubah; saat Anda mengubah file iCloud Drive, push dikirim untuk sinkronisasi perangkat lain
Saat ada panggilan telepon, Mac ikut berdering melalui Continuity, dan ini juga notifikasi push terenkripsi seperti iMessage
Jadi penasaran, berapa banyak pesan per detik yang melewati layanan ini
Ini materi yang sangat cocok untuk Hack Club. Sebaiknya ikut mencoba: https://hackclub.com/
Benar-benar pekerjaan yang luar biasa
Akan bagus juga kalau menulis singkat tentang bagaimana bisa masuk ke bidang ini
Di Reddit ada banyak siswa SMA dan mahasiswa yang pandai teknologi, belajar pemrograman, dan memikirkan cara mendapatkan pekerjaan teknis; sudut pandang seperti ini sepertinya akan cukup membantu
Karena bisa selesai lebih awal, ada waktu kosong, dan diam-diam mengerjakan hal saya sendiri saat seharusnya tidak, saya bisa membuat dan merilis aplikasi dalam sekitar 6 bulan, dan produktivitas saya sangat tinggi
Saya benar-benar penasaran, apakah topiknya memang bisa
opertunistic, atau itu salah ketik dari penulisSalah ketik seperti
refereryang memfosil lintas generasi memang menarikNamun saya tidak tahu apakah ini salah ketik dari pihak Apple, tetapi jelas aneh. Di sini harus memakai
WindowSerial, bukan menambahkan satu s sepertiWindowsSerialhttps://github.com/JJTech0130/pypush/blob/8b33c0ee5d540d8ac7...
Ada pembahasan terkait lainnya: https://news.ycombinator.com/item?id=38531759
Proyek open source pypush, yang menjadi dasar kabar reverse engineering iMessage hari ini, didistribusikan dengan Server Side Public License milik MongoDB, dan pemiliknya adalah Beeper
Menurut yang JJTech katakan di Discord, ia menjual haknya kepada Beeper
Library-nya bagus, tetapi karena lisensinya copyleft yang sangat kuat, sepertinya itu akan memengaruhi di mana ia bisa dipakai
“Validation data” yang dibutuhkan saat membuat permintaan registrasi IDS disebut sebagai mekanisme Apple untuk memastikan perangkat non-Apple tidak dapat memakai iMessage; saya penasaran apakah ini akan menjadi pelanggaran saat DSA atau DMA Uni Eropa diberlakukan
Apa pun cara Apple mematuhi DSA dan DMA, caranya bukan yang ini
iMessage lintas platform first-party hanyalah mimpi kosong para penggemar teknologi, dan secara pribadi menurut saya itu sudah cukup baik
Jika melihat pengumuman Beeper Mini [1], mereka jelas mengatakan bahwa pengguna bisa mendaftarkan nomor telepon serta mengirim dan menerima iMessage tanpa Apple ID
Mereka juga menjelaskan bahwa perangkat berkomunikasi langsung dengan Apple
Namun tulisan ini mengatakan IDS digunakan sebagai server kunci iMessage, tahap pertama registrasi IDS harus mendapatkan token autentikasi dengan nama pengguna dan kata sandi Apple ID, dan setelah registrasi, identity keypair yang diterima dipakai untuk pencarian kunci publik
Kalau begitu, pertanyaannya: bagaimana aplikasi Beeper Mini mendaftarkan nomor telepon Android sembarang ke IDS sebagai kunci publik, dan bahkan melakukan pencarian kunci publik penerima tanpa Apple ID?
Jawabannya tampaknya adalah SMS Gateway, yang nyaris tidak dijelaskan baik di tulisan asli maupun di [1], dan itu tampaknya menjadi bahan rahasianya
[1] https://blog.beeper.com/i/139416474/security-and-privacy
Benar-benar pekerjaan yang mengagumkan
Namun ada bagian yang mengganjal: tulisan itu mengatakan format pair lama lebih terdokumentasi dan mudah diimplementasikan, tetapi tidak menyediakan forward secrecy menggunakan “pre-keys” mirip Signal seperti format pair-ec baru
Saya tidak tahu apakah ada bukti bahwa iMessage versi terbaru, yaitu yang memakai ECIES, benar-benar memakai pre-key
Menurut saya, ini hanya menyisipkan ECIES sebagai pengganti RSA pada bagian enkripsi, mungkin juga penandatanganan; itu saja tidak menghasilkan forward secrecy
Jika tidak ada buktinya, bisa jadi ini salah menafsirkan hubungan antara RSA, kurva eliptik, dan forward secrecy
Artikel iMessage di Wikipedia juga tampaknya menyebarkan kesalahan yang sama, dan referensi yang dikutip sebenarnya tidak membuat klaim seperti itu