Giải thích cấu trúc bên trong của iMessage
(jjtech.dev)- iMessage sử dụng APNs không chỉ như một kênh thông báo đơn thuần mà như một nền tảng truyền hai chiều, đồng thời dùng IDS để gộp việc đăng ký/tra cứu khóa công khai với khâu chuẩn bị chuyển tin nhắn
- Sau khi kết nối tới APNs, thiết bị nhận push token và lọc theo topic iMessage là
com.apple.madridđể xác định phạm vi tin nhắn sẽ nhận - Việc đăng ký IDS đòi hỏi token xác thực Apple ID, chứng chỉ dài hạn, tải lên khóa công khai để mã hóa và ký, cùng với validation data, khiến việc dùng thiết bị không phải của Apple trở nên khó khăn theo đúng thiết kế
- Mã hóa tin nhắn được chia thành kiểu cũ
pairvà kiểu mớipair-ec;pair-eccung cấp forward secrecy dựa trên pre-key tương tự Signal - Người gửi có thể gửi riêng payload đã mã hóa cho từng người nhận hoặc gộp lại, nhưng để thiết bị mới giải mã được thì khóa AES phải kèm thẻ HMAC
Nền tảng truyền iMessage do APNs đảm nhiệm
- Một trong những lớp nền tảng của iMessage là Apple Push Notification Service(APNs)
- Đây là cùng lớp dịch vụ được dùng để nhận thông báo và cập nhật theo thời gian thực ngay cả khi ứng dụng từ App Store đã bị đóng
- Trong iMessage, APNs không chỉ dùng để nhận thông báo mà còn hoạt động như một dịch vụ hai chiều phục vụ truyền tin nhắn
- Khi thiết bị kết nối tới APNs, nó sẽ nhận một push token
- Token này được dùng để định tuyến thông báo tới một thiết bị cụ thể
- Về mặt kỹ thuật, nó khác với token nhận từ API
application:didRegisterForRemoteNotificationsWithDeviceToken: - Token của API đó có phạm vi theo từng ứng dụng và được yêu cầu bằng bundle ID của ứng dụng, nhưng mục đích thì tương tự
- Khi gửi một push notification tới thiết bị, cũng phải chỉ định topic của thông điệp
- Topic thường trông giống như Bundle ID
- Topic của iMessage là
com.apple.madrid
- Khi thiết bị kết nối tới APNs, nó gửi một filter message để báo cho máy chủ biết mình muốn nhận loại thông điệp nào
- Máy chủ APNs cũng được gọi là APNs Courier
- Filter message có thể chứa danh sách topic theo từng trạng thái
- Trạng thái của topic có thể là
enabled,opertunistic,paused, hoặcdisabled
Các truy vấn IDS chạy trên APNs
- APNs không chỉ được dùng cho việc chuyển phát tin nhắn thực tế của iMessage
- Thông qua lớp pseudo-HTTP chạy trên APNs, IDS có thể gửi truy vấn và nhận phản hồi
- Để kết nối tới APNs, cần có chứng chỉ máy khách do Albert activation server cấp
Luồng xác thực IDS và Apple ID
- IDS đóng vai trò máy chủ khóa của iMessage và cũng được dùng cho các dịch vụ khác như FaceTime
- IDS dường như là viết tắt của IDentity Services, nhưng được nói là chưa có xác nhận chính thức
- Vì iMessage dùng mã hóa đầu cuối, nên cần trao đổi an toàn khóa công khai của từng bên tham gia
- Bước đầu tiên của đăng ký IDS là lấy token xác thực
- Cần cung cấp tên người dùng Apple ID và mật khẩu cho API
- 2FA được ghép vào IDS API theo cách bổ sung về sau
- Cách cũ là nối trực tiếp mã 2FA vào mật khẩu
- Phương thức GrandSlam dùng “Anisette data” để chứng minh đó là cùng một thiết bị, nhờ vậy không phải nhập lại mã 2FA
- Sau đó có thể nhận Password Equivalent Token(PET) để dùng như mật khẩu và mã 2FA
- Sau khi nhận token xác thực, phải lập tức đổi nó lấy chứng chỉ có thời hạn dài hơn
- Chứng chỉ này cho phép đăng ký IDS, nhưng chỉ riêng nó thì chưa đủ để thực hiện tra cứu khóa
Đăng ký IDS và validation data
- Bước quan trọng nhất trong thiết lập IDS là registration
- Trong registration, khóa mã hóa công khai và khóa ký được tải lên máy chủ khóa
- Nhiều client data về các tính năng mà thiết bị hỗ trợ cũng được tải lên cùng lúc
- Yêu cầu đăng ký IDS cần một blob nhị phân gọi là “validation data”
- Đây là cơ chế kiểm chứng của Apple nhằm ngăn thiết bị không phải của Apple sử dụng iMessage
- Việc tạo validation data sử dụng thông tin như serial number, model và disk UUID của thiết bị
- Không thể coi mọi validation data là giống nhau
- Tương tự Hackintosh, tuổi đời tài khoản và “score” ảnh hưởng tới việc có thể dùng serial không hợp lệ hay có gặp lỗi “customer code” hay không
- Binary tạo validation data bị làm rối rất mạnh
pypushvượt qua vấn đề này bằng cách mô phỏng binary đã bị làm rối với custom mach-o loader và Unicorn Enginepypushcung cấp các thuộc tính thiết bị như serial number cho binary được mô phỏng thông qua tệpdata.plist
Tra cứu khóa và session token
- Sau khi đăng ký IDS, sẽ nhận được identity keypair
- Có thể dùng keypair này để thực hiện tra cứu khóa công khai
- Khi cung cấp tài khoản cần tra cứu, sẽ nhận được danh sách “identities”
- Mỗi identity tương ứng với một thiết bị đã đăng ký của tài khoản đó
- Nó chứa thông tin quan trọng như public key, push token và session token
- Session token là cần thiết để gửi tin nhắn tới thiết bị
- Nó đóng vai trò chứng minh rằng việc tra cứu đã được thực hiện gần đây
- Session token sẽ hết hạn
- Chỉ tài khoản đã thực hiện truy vấn tra cứu mới dùng được, nên không thể chia sẻ
Tin nhắn nhận được và định dạng mã hóa
- Để nhận tin nhắn, chỉ cần lọc kết nối APNs theo
com.apple.madridvà gửi active state packet - Định dạng mã hóa của tin nhắn nhận được phụ thuộc vào capabilities đã khai báo khi đăng ký IDS và phiên bản iOS của thiết bị gửi
- Định dạng cũ, trước iOS 13, là
pair - Định dạng mới là
pair-ec
- Định dạng cũ, trước iOS 13, là
- Định dạng
pairđã được tài liệu hóa nhiều hơn và dễ triển khai hơn - Khác với
pair-ecmới hơn,pairkhông cung cấp forward secrecy sử dụng “pre-keys” - Tin nhắn có thể được giải mã dựa trên nhiều bài nghiên cứu và phần triển khai của
pypush - Việc xác minh chữ ký tin nhắn là tùy chọn, nhưng rất quan trọng nếu muốn xây dựng một client an toàn
Cách gửi và những điểm cần lưu ý khi triển khai
- Việc gửi tin nhắn gần như là quá trình ngược lại của nhận tin
- Có thể gửi riêng tin nhắn cho từng người nhận
- Cũng có thể gộp nhiều người nhận và payload đã mã hóa cho từng người nhận vào một bundle lớn
- Trong trường hợp này, APNs sẽ tách chúng ra
- Tin nhắn được chuyển tới mọi thành viên trong cuộc trò chuyện
- Bao gồm cả các thiết bị khác thuộc chính tài khoản của mình
- Một điểm thường bị bỏ sót khi gửi là khóa AES không hoàn toàn ngẫu nhiên
- Khóa AES có kèm HMAC dưới dạng thẻ
- Nếu dùng khóa AES hoàn toàn ngẫu nhiên, thiết bị mới sẽ không giải mã được tin nhắn
Các phần triển khai liên quan và tài liệu tham khảo
pypush: dự án mã nguồn mở tái triển khai iMessage- IMFreedom Knowledge Base: iMessage: cơ sở tri thức về iMessage
- M. Frister:
pushproxy: triển khai liên quan - Nicolás:
apns-dissector: công cụ phân tích APNs - QuarkSlab: iMessage Privacy: tài liệu về quyền riêng tư của iMessage
- Garman et al. Chosen Ciphertext Attacks on Apple iMessage: bài nghiên cứu về tấn công bản mã được chọn đối với Apple iMessage
- NowSecure: Reverse Engineering iMessage: tài liệu reverse engineering iMessage
- Elcomsoft: iMessage Security and Attachments: tài liệu về bảo mật và tệp đính kèm của iMessage
- Eric Rabil’s
open-imcore: dự án liên quan - The Apple Wiki: Apple Push Notification Service: tài liệu về APNs
- Mihir Bellare and Igors Stepanovs: Security under Message-Derived Keys: Signcryption in iMessage: bài nghiên cứu về signcryption trong iMessage
- Apple Platform Security: How iMessage sends and receives messages securely: giải thích của Apple về bảo mật iMessage
- Nicolás: Apple IDS payload keys: tài liệu về các khóa payload của Apple IDS
1 bình luận
Ý kiến trên Hacker News
Có vẻ Apple sẽ bắt đầu khóa iMessage bằng attestation (DeviceCheck)
Tuy nhiên vấn đề là các thiết bị cũ sẽ cần cập nhật phần mềm
Khi tạo “validation data”, các thông tin như số sê-ri thiết bị, model, UUID ổ đĩa được dùng; với Hackintosh, tùy theo tuổi đời tài khoản và “điểm số” mà việc dùng số sê-ri sai có được chấp nhận hay sẽ gặp lỗi “customer code”
Lỗi “customer code” về thực chất là prompt báo attestation của Apple thất bại, và một khi dính lỗi này thì phải liên hệ Apple Support để mở khóa Apple ID
Khách hàng bình thường có thể vượt qua dễ dàng bằng cách phê duyệt đăng nhập trên thiết bị hợp pháp, còn người dùng Hackintosh thì dùng các kỹ thuật обход để đánh lừa quy trình này
https://old.reddit.com/r/hackintosh/comments/gij9rt/getting_...
Nghe giống một tính năng ít nhất nên nằm trong Lockdown Mode của Apple hơn là một phần của bảo mật toàn hệ điều hành
Có lẽ họ xem đây là cơ hội tốt để chuyển hướng sang cởi mở hơn
Việc hiểu được giao thức là rất tuyệt, nhưng tôi cũng tò mò về stack hạ tầng iMessage
Điều càng lạ là dù quy mô khổng lồ như vậy mà nó vẫn hoạt động rất tốt, trong khi các dịch vụ web khác của Apple, chẳng hạn diễn đàn hay cổng developer, lại nhiều lỗi và có cảm giác chưa hoàn thiện
Push notification của mọi ứng dụng nhắn tin bên thứ ba cũng đi qua đó, và các ứng dụng không phải nhắn tin nhưng có thông báo cũng vậy
Bao gồm cả thông báo im lặng nội bộ. Khi bạn thêm một cuộc họp vào lịch trên Mac, iPhone sẽ nhận push để cập nhật vì dữ liệu iCloud đã thay đổi; khi bạn sửa một tệp iCloud Drive, push sẽ được gửi để đồng bộ các thiết bị khác
Khi có cuộc gọi đến, Mac cũng đổ chuông qua Continuity, và đây cũng là push notification được mã hóa giống iMessage
Tự hỏi rốt cuộc mỗi giây có bao nhiêu thông điệp đi qua dịch vụ này
Đây là tài liệu rất hợp với Hack Club. Nên thử tham gia: https://hackclub.com/
Công việc thật sự ấn tượng
Sẽ rất hay nếu viết ngắn gọn về việc bạn đã bước vào lĩnh vực này như thế nào
Trên Reddit có nhiều học sinh cấp ba và sinh viên đại học đang băn khoăn về cách giỏi kỹ thuật, học lập trình và kiếm việc trong ngành công nghệ; góc nhìn như vậy có lẽ sẽ khá hữu ích
Nhờ hoàn thành việc sớm, thời gian trống, và lén làm việc riêng vào những lúc lẽ ra không nên, tôi có thể xây dựng và phát hành một ứng dụng trong khoảng 6 tháng, và năng suất khi đó rất cao
Tôi thật sự tò mò liệu chủ đề có thực sự có thể là
opertunistichay chỉ là lỗi gõ của tác giảNhững lỗi chính tả kiểu
refererbị hóa thạch qua nhiều thế hệ khá thú vịTuy không biết đây có phải lỗi gõ từ phía Apple không, nhưng rõ ràng là kỳ lạ. Ở đây phải dùng
WindowSerial, chứ không phải thêm một chữ s nhưWindowsSerialhttps://github.com/JJTech0130/pypush/blob/8b33c0ee5d540d8ac7...
Có thêm nội dung liên quan: https://news.ycombinator.com/item?id=38531759
Dự án mã nguồn mở pypush, nền tảng cho tin tức reverse engineering iMessage hôm nay, được phát hành theo Server Side Public License của MongoDB, và chủ sở hữu là Beeper
Theo lời JJTech nói trên Discord, anh ấy đã bán quyền cho Beeper
Thư viện rất tuyệt, nhưng vì đây là giấy phép copyleft rất mạnh nên có lẽ sẽ ảnh hưởng đến việc nó có thể được dùng ở đâu
“validation data” cần để tạo yêu cầu đăng ký IDS được cho là cơ chế Apple dùng để kiểm tra nhằm ngăn thiết bị không phải Apple dùng iMessage; tôi tự hỏi liệu điều này có vi phạm khi DSA hoặc DMA của EU được thực thi không
Dù Apple tuân thủ DSA và DMA theo cách nào, thì sẽ không phải bằng cách này
iMessage đa nền tảng chính chủ gần như chỉ là giấc mơ viển vông của dân mê công nghệ, và cá nhân tôi thấy như vậy cũng đủ ổn
Nhìn vào bài công bố Beeper Mini [1], họ nói rõ rằng người dùng có thể đăng ký số điện thoại và gửi nhận iMessage mà không cần Apple ID
Họ cũng giải thích rằng thiết bị giao tiếp trực tiếp với Apple
Nhưng bài viết này nói IDS được dùng làm key server của iMessage; bước đầu đăng ký IDS cần lấy token xác thực bằng tên người dùng và mật khẩu Apple ID, và sau khi đăng ký thì dùng identity keypair nhận được để tra cứu khóa công khai
Vậy câu hỏi là ứng dụng Beeper Mini làm thế nào để đăng ký một số điện thoại Android bất kỳ vào IDS với khóa công khai, rồi còn thực hiện tra cứu khóa công khai của người nhận mà không cần Apple ID
Câu trả lời có vẻ là SMS Gateway, thứ gần như không được giải thích trong bài gốc hay trong [1], và dường như đó là nguyên liệu bí mật
[1] https://blog.beeper.com/i/139416474/security-and-privacy
Công việc thật sự đáng kinh ngạc
Tuy nhiên tôi hơi vướng ở đoạn bài viết nói định dạng pair cũ được tài liệu hóa tốt hơn và dễ triển khai hơn, nhưng không cung cấp forward secrecy bằng “pre-keys” giống Signal như định dạng pair-ec mới
Tôi không biết có bằng chứng nào cho thấy iMessage hiện đại, tức bản dùng ECIES, thật sự dùng pre-key hay không
Theo tôi thấy thì có vẻ họ chỉ nhét ECIES vào thay cho RSA ở phần mã hóa, có lẽ cả phần ký nữa, nhưng chỉ thế thôi thì không tạo ra forward secrecy
Nếu không có bằng chứng, có thể đây là diễn giải sai về quan hệ giữa RSA, đường cong elliptic và forward secrecy
Tài liệu iMessage trên Wikipedia dường như cũng lan truyền cùng lỗi này, và tài liệu tham khảo được trích dẫn thực ra không đưa ra tuyên bố đó