iMessage’ın iç yapısının açıklaması
(jjtech.dev)- iMessage, APNs’i basit bir bildirim kanalı olarak değil, çift yönlü aktarım temeli olarak kullanır; IDS üzerinden açık anahtar kaydı ve sorgulama ile mesaj iletim hazırlığını birlikte işler
- Cihaz, APNs bağlantısından sonra bir push token alır ve iMessage topic’i olan
com.apple.madrid’i filtreleyerek alacağı mesaj kapsamını belirler - IDS kaydı; Apple ID kimlik doğrulama token’ı, uzun ömürlü sertifika, açık şifreleme ve imzalama anahtarlarının yüklenmesi ve validation data gönderilmesini gerektirir; bu da Apple dışı cihazların kullanımını zorlaştıracak şekilde tasarlanmıştır
- Mesaj şifreleme eski
pairve yenipair-ecolarak ikiye ayrılır;pair-ec, Signal’a benzer pre-key tabanlı forward secrecy sağlar - Gönderen, alıcı başına ayrı şifrelenmiş payload gönderebilir ya da bunları paketleyerek gönderebilir; ancak güncel cihazlarda şifrenin çözülebilmesi için AES anahtarına HMAC etiketi dahil edilmelidir
iMessage aktarım temelinde APNs’in rolü
- iMessage’ın temel katmanlarından biri Apple Push Notification Service(APNs)’tir
- APNs, App Store uygulamalarının kapalıyken bile gerçek zamanlı bildirim ve güncellemeler almak için kullandığı servisle aynı katmandır
- iMessage’da APNs yalnızca bildirim almak için değil, mesaj aktarımı için de kullanılan çift yönlü bir servis olarak çalışır
- Cihaz APNs’e bağlandığında bir push token alır
- Bu token, bildirimleri belirli bir cihaza yönlendirmek için kullanılır
application:didRegisterForRemoteNotificationsWithDeviceToken:API’sinden alınan token’dan teknik olarak farklıdır- Bu API’nin token’ı uygulama kapsamındadır ve uygulamanın bundle ID’siyle istenir; ancak amacı benzerdir
- Bir cihaza push notification gönderirken mesajın topic’i de belirtilmelidir
- Topic genellikle Bundle ID gibi görünür
- iMessage’ın topic’i
com.apple.madrid’dir
- Cihaz APNs’e bağlandığında, hangi mesajların iletileceğini sunucuya bildiren bir filter message gönderir
- APNs sunucusu APNs Courier olarak da adlandırılır
- Filter message, durumlara göre topic listeleri içerebilir
- Topic durumu
enabled,opertunistic,paused,disableddeğerlerinden biri olabilir
APNs üzerinde çalışan IDS sorguları
- APNs yalnızca iMessage’ın gerçek mesaj iletimi için kullanılmaz
- APNs üzerindeki pseudo-HTTP katmanı aracılığıyla IDS sorgu gönderebilir ve yanıt alabilir
- APNs’e bağlanmak için Albert activation server tarafından verilen bir istemci sertifikası gerekir
IDS ve Apple ID kimlik doğrulama akışı
- IDS, iMessage’ın anahtar sunucusu rolünü üstlenir ve FaceTime gibi diğer servislerde de kullanılır
- IDS’in IDentity Services’in kısaltması olduğu düşünülür, ancak bunun resmen doğrulanmadığı belirtilir
- iMessage uçtan uca şifreleme kullandığı için her katılımcının açık anahtarını güvenli şekilde değiş tokuş etmesi gerekir
- IDS kaydının ilk adımı bir kimlik doğrulama token’ı almaktır
- API’ye Apple ID kullanıcı adı ve parolası sağlanmalıdır
- 2FA, IDS API’sine sonradan uyarlanmış biçimde dahil edilmiştir
- Legacy yöntemde 2FA kodu doğrudan parolanın sonuna eklenir
- GrandSlam yöntemi, aynı cihaz olduğunu “Anisette data” ile kanıtlayarak 2FA kodunun yeniden girilmesini önler
- Ardından Password Equivalent Token(PET) alınabilir ve parola ile 2FA kodu gibi kullanılabilir
- Kimlik doğrulama token’ı alındıktan sonra hemen daha uzun süre geçerli olan bir sertifika ile değiştirilmelidir
- Bu sertifika IDS kaydını mümkün kılar; ancak tek başına anahtar sorgusu yapmak için yeterli değildir
IDS kaydı ve validation data
- IDS kurulumundaki en önemli aşama registration’dır
- Registration sırasında açık şifreleme anahtarı ve imzalama anahtarı anahtar sunucusuna yüklenir
- Cihazın desteklediği özelliklere dair çeşitli client data da birlikte yüklenir
- IDS registration isteği “validation data” adlı ikili bir blob gerektirir
- Bu, Apple dışı cihazların iMessage kullanmasını engellemeye yönelik Apple’ın doğrulama mekanizmasıdır
- Validation data üretiminde cihazın serial number’ı, modeli, disk UUID’si gibi bilgiler kullanılır
- Tüm validation data aynı şekilde ele alınamaz
- Hackintosh’a benzer şekilde, hesabın yaşı ve “score” yanlış bir serial’ın kullanılıp kullanılamayacağını veya “customer code” hatası alınıp alınmayacağını belirler
- Validation data üreten ikili dosya güçlü biçimde obfuscate edilmiştir
pypush, custom mach-o loader ve Unicorn Engine ile obfuscate edilmiş ikili dosyayı emüle ederek bu sorunu aşarpypush, serial number gibi cihaz özelliklerinidata.plistdosyasına koyup emüle edilen ikili dosyaya sağlar
Anahtar sorgulama ve session token
- IDS kaydından sonra bir identity keypair alınır
- Bu keypair kullanılarak açık anahtar sorgusu yapılabilir
- Sorgulanacak hesap sağlandığında “identities” listesi alınır
- Her identity, ilgili hesaba kayıtlı bir cihaza karşılık gelir
- Public key, push token, session token gibi önemli bilgiler içerir
- session token, cihaza mesaj göndermek için gereklidir
- Yakın zamanda sorgu yapıldığını kanıtlama rolü görür
- Session token’ın süresi dolar
- Yalnızca sorgu isteğini yapan hesap tarafından kullanılabilir; paylaşılamaz
Gelen mesajlar ve şifreleme biçimi
- Mesaj almak için APNs bağlantısını
com.apple.madridile filtrelemek ve active state packet göndermek yeterlidir - Gelen mesajın şifreleme biçimi, IDS kaydı sırasında bildirilen capabilities’e ve gönderen cihazın iOS sürümüne göre değişir
- Eski, iOS 13 öncesi biçim
pair’dir - Yeni biçim
pair-ec’dir
- Eski, iOS 13 öncesi biçim
pairbiçimi daha fazla belgelenmiştir ve uygulanması daha kolaydırpair, yenipair-ec’den farklı olarak “pre-keys” kullanan forward secrecy sağlamaz- Mesajlar, çeşitli makalelere ve
pypushuygulamasına göre çözülebilir - Mesaj imzası doğrulaması isteğe bağlıdır; ancak güvenli bir istemci oluşturmak için önemlidir
Gönderim yöntemi ve uygulamada dikkat edilmesi gerekenler
- Mesaj gönderimi, almaya yakın biçimde ters bir süreçtir
- Alıcı başına mesaj ayrı ayrı gönderilebilir
- Birden fazla alıcı ve her alıcıya özel şifrelenmiş payload tek bir büyük bundle halinde de gönderilebilir
- Bu durumda APNs bunu ayrıştırır
- Mesaj, konuşmadaki tüm katılımcılara iletilir
- Kendi hesabınızdaki diğer cihazlara da iletilir
- Gönderim sırasında sık atlanan nokta, AES key’in tamamen rastgele olmadığıdır
- AES key’e etiket olarak HMAC eklenmiştir
- Tamamen rastgele bir AES key kullanılırsa güncel cihazlarda mesajın şifresi çözülemez
İlgili uygulamalar ve başvuru kaynakları
pypush: iMessage’ı yeniden uygulayan açık kaynak proje- IMFreedom Knowledge Base: iMessage: iMessage ile ilgili bilgi tabanı
- M. Frister:
pushproxy: ilgili uygulama - Nicolás:
apns-dissector: APNs analiz aracı - QuarkSlab: iMessage Privacy: iMessage privacy ile ilgili kaynak
- Garman et al. Chosen Ciphertext Attacks on Apple iMessage: Apple iMessage’a yönelik seçilmiş şifreli metin saldırıları makalesi
- NowSecure: Reverse Engineering iMessage: iMessage tersine mühendislik kaynağı
- Elcomsoft: iMessage Security and Attachments: iMessage güvenliği ve ekler ile ilgili kaynak
- Eric Rabil’s
open-imcore: ilgili proje - The Apple Wiki: Apple Push Notification Service: APNs ile ilgili belge
- Mihir Bellare and Igors Stepanovs: Security under Message-Derived Keys: Signcryption in iMessage: iMessage signcryption ile ilgili makale
- Apple Platform Security: How iMessage sends and receives messages securely: Apple’ın iMessage güvenlik açıklaması
- Nicolás: Apple IDS payload keys: Apple IDS payload key kaynağı
1 yorum
Hacker News yorumları
Apple’ın iMessage’ı attestation (DeviceCheck) ile kilitlemeye başlayacağını düşünüyorum.
Ancak eski cihazlarda yazılım güncellemesi gerekecek olması gibi bir sorun var.
“validation data” oluşturulurken cihaz seri numarası, model, disk UUID’si gibi bilgiler kullanılıyor; Hackintosh’ta olduğu gibi hesabın yaşına ve “puanına” göre hatalı seri numarası kullanıp kullanamayacağınız ya da “customer code” hatası alıp almayacağınız belirleniyor.
“customer code” hatası aslında Apple’ın attestation başarısızlığı uyarısı; bir kez takılırsanız Apple ID kilidini açtırmak için Apple Support ile iletişime geçmeniz gerekiyor.
Normal müşteriler meşru bir cihazdan oturum açmayı onaylayarak bunu kolayca geçiyor, ancak Hackintosh kullanıcıları bu süreci çeşitli baypas yöntemleriyle kandırıyor.
https://old.reddit.com/r/hackintosh/comments/gij9rt/getting_...
Tüm işletim sistemi güvenliğinin bir parçası olmaktan ziyade, en azından Apple’ın Lockdown Mode’una dahil edilmesi gereken bir özellik gibi geliyor.
Belki de şu anı açıklığa doğru yönelmek için iyi bir fırsat olarak görmüş olabilir.
Protokolü çözmeleri harika, ama iMessage altyapı yığını da merak konusu.
Ölçeği devasa olmasına rağmen bu kadar iyi çalışması, buna karşılık Apple’ın forumlar veya geliştirici portalı gibi diğer web servislerinin bol hatalı ve tamamlanmamış gibi hissettirmesi daha da ilginç.
Tüm üçüncü taraf mesajlaşma uygulamalarının push bildirimleri de bunun üzerinden geçiyor; bildirimi olan mesajlaşma dışı uygulamalar da aynı şekilde.
Dahili sessiz bildirimler de dahil. Mac’te takvime bir toplantı eklediğinizde iCloud verisi değiştiği için iPhone’a güncelleme yapması amacıyla push gidiyor; iCloud Drive dosyasını değiştirdiğinizde diğer cihazların senkronizasyonu için push gidiyor.
Telefon araması geldiğinde Continuity ile Mac’te de çalıyor; bu da iMessage gibi şifreli bir push bildirimi.
Bu servisten saniyede acaba kaç mesaj geçtiğini merak ettiriyor.
Bu, Hack Club için biçilmiş kaftan bir kaynak. Katılmanız iyi olur: https://hackclub.com/
Gerçekten müthiş bir çalışma.
Bu alana nasıl girdiğini de kısaca yazsa iyi olur.
Reddit’te teknolojiye yatkın, programlamayı öğrenen ve teknik bir işe nasıl girileceğini düşünen çok sayıda lise ve üniversite öğrencisi var; böyle bir bakış açısı epey faydalı olabilir.
Erken bitirmek, boş saatler ve aslında yapılmaması gereken zamanlarda gizlice kendi işimi yapmak sayesinde yaklaşık 6 ayda bir uygulama geliştirip yayımlayabildim; üretkenliğim çok yüksekti.
Gerçekten merak ediyorum: konunun gerçekten
opertunisticolup olamayacağını mı, yoksa yazarın yazım hatası mı olduğunu bilmiyorum.Nesiller boyunca fosilleşen
referergibi yazım hataları ilginç.Bunun Apple tarafındaki bir yazım hatası olup olmadığını bilmiyorum ama kesinlikle tuhaf. Burada
WindowsSerialgibi fazladan bir s eklemek yerineWindowSerialkullanmak gerekiyor.https://github.com/JJTech0130/pypush/blob/8b33c0ee5d540d8ac7...
İlgili daha fazla içerik var: https://news.ycombinator.com/item?id=38531759
Bugünkü iMessage reverse engineering haberinin temelini oluşturan açık kaynak proje pypush, MongoDB’nin Server Side Public License’ı ile dağıtılıyor ve sahibi Beeper.
JJTech’in Discord’da söylediğine göre hakları Beeper’a satmış.
Kütüphane harika, ancak çok güçlü bir copyleft lisansı olduğu için nerelerde kullanılabileceğini etkileyecek gibi.
IDS kayıt isteği oluştururken gereken “validation data”nın, Apple’ın Apple dışı cihazların iMessage kullanmasını engellemek için doğrulama mekanizması olduğu söyleniyor; AB’nin DSA veya DMA düzenlemeleri yürürlüğe girince bunun ihlal sayılıp sayılmayacağını merak ediyorum.
Apple DSA ve DMA’ya hangi yöntemle uyarsa uysun, bu yöntem bu olmayacaktır.
Birinci taraf, çapraz platform iMessage ancak teknoloji meraklılarının boş bir hayaline yakın; şahsen bunun böyle olması benim için gayet yeterli.
Beeper Mini duyuru metnine [1] bakınca, kullanıcıların Apple ID olmadan da telefon numaralarını kaydedip iMessage alıp gönderebileceğini açıkça söylüyor.
Ayrıca cihaz ile Apple’ın doğrudan iletişim kurduğunu açıklıyor.
Ancak bu yazı, IDS’nin iMessage’ın anahtar sunucusu olarak kullanıldığını; IDS kaydının ilk adımında Apple ID kullanıcı adı ve parolasıyla kimlik doğrulama token’ı alınması gerektiğini ve kayıt sonrasında alınan identity keypair ile açık anahtar sorgusu yapıldığını söylüyor.
O halde Beeper Mini uygulamasının rastgele bir Android telefon numarasını IDS’ye açık anahtarla nasıl kaydettiği ve alıcının açık anahtar sorgusunu Apple ID olmadan nasıl yaptığı sorusu ortaya çıkıyor.
Cevap, ne orijinal yazıda ne de [1]’de neredeyse hiç açıklanmayan SMS Gateway gibi görünüyor; gizli malzeme bu olabilir.
[1] https://blog.beeper.com/i/139416474/security-and-privacy
Gerçekten şaşırtıcı bir çalışma.
Yalnız yazıda, eski pair biçiminin daha iyi belgelendiği ve uygulanmasının daha kolay olduğu, ancak yeni pair-ec biçimi gibi Signal’e benzer “pre-keys” kullanarak forward secrecy sağlamadığı söylenen kısım aklıma takıldı.
Güncel, yani ECIES kullanan iMessage’ın gerçekten pre-key kullandığına dair kanıt var mı bilmiyorum.
Bana göre şifreleme, belki de imza tarafında RSA yerine ECIES yerleştirilmiş gibi duruyor; tek başına bu forward secrecy sağlamaz.
Kanıt yoksa RSA, eliptik eğri ve forward secrecy arasındaki ilişki yanlış yorumlanmış olabilir.
Wikipedia’daki iMessage maddesi de aynı hatayı yayıyor gibi görünüyor; alıntılanan kaynaklar aslında böyle bir iddiada bulunmuyor.