iMessageの内部構造の解説
- iMessageの内部構造について、概観レベルの概要を提供
pypush プロジェクトで判明した内容をもとに、技術的な詳細は簡略化して説明
pypush は iMessage を再実装するオープンソースプロジェクトで、詳細な実装はそのリポジトリで確認可能
基盤レイヤー (Foundational Layer)
- Apple Push Notification Service(APNs) は iMessage の中核的な構成要素で、アプリが閉じているときでもリアルタイム通知や更新を受け取るために使われる
- APNs は双方向サービスであり、プッシュ通知の送受信の両方に使われる
- デバイスが APNs に接続すると、特定のデバイスへ通知をルーティングするために使われる「プッシュトークン」を受け取る
- 通知を送る際にはメッセージの トピック を指定する必要があり、iMessage の場合は
com.apple.madrid である
- APNs はメッセージ送信だけでなく、IDS 経由でクエリを送り、応答を APNs 経由で受け取るためにも使われる
- APNs に接続するには、Albert アクティベーションサーバーが発行したクライアント証明書が必要
キーサーバー (Keyserver)
- IDS(IDentity Services と推定)は、iMessage や FaceTime などのサービス向けキーサーバーとして使われる
- iMessage は E2E で暗号化されるため、参加者間で公開鍵を安全に交換する必要がある
- IDS への登録の最初のステップは認証トークンを取得することで、Apple ID のユーザー名とパスワードが必要
- 認証トークンを取得した後は、すぐにより長期間有効な証明書へ交換する必要があり、この証明書を通じて IDS に登録できる
- IDS 登録プロセスでは、公開暗号鍵と署名鍵、そしてさまざまな「クライアントデータ」をキーサーバーへアップロードする
- IDS 登録リクエストには「検証データ」と呼ばれるバイナリ blob が必要で、これは Apple デバイス以外が iMessage を使えないようにする検証メカニズムである
- IDS に登録すると「アイデンティティ鍵ペア」を受け取り、これを通じて公開鍵の問い合わせを実行できる
- 問い合わせ時には目的のアカウントを指定し、各デバイスに対応する「アイデンティティ」の一覧を受け取り、そこに重要な詳細情報が含まれている
メッセージ暗号化
- iMessage の基本設定が完了すると、他ユーザーの公開鍵を問い合わせたり、自分の鍵を公開したりできる
- メッセージを受信するには、APNs 接続を
com.apple.madrid でフィルタリングし、アクティブ状態パケットを送信する
- IDS 登録時に告知した機能と送信デバイスの iOS バージョンに応じて、メッセージは
pair 暗号化形式または新しい pair-ec 形式で受信できる
- メッセージ送信時には、各受信者へ個別に送ることも、APNs が分配できる 1 つの大きなバンドルとして、すべての受信者と暗号化ペイロードをまとめることもできる
- メッセージは会話に参加するすべての参加者へ配信され、自分のアカウントに属する他のデバイスも含まれる
- メッセージ送信で見落とされがちな点として、AES 鍵は完全にランダムではなく、HMAC でタグ付けされていることが挙げられる
資料と出典
- iMessage への理解を助ける多くの人々と先行研究がある
- IMFreedom Knowledge Base,
pushproxy, apns-dissector, QuarkSlab, Garman et al., NowSecure, Elcomsoft, open-imcore, The Apple Wiki, Mihir Bellare と Igors Stepanovs の研究などが参考にされている
1件のコメント
Hacker Newsの意見
AppleがiMessageをロックするためにデバイス検証(認証)を使うだろうという予測がある。これは旧型デバイス向けのソフトウェアアップデートを必要とするはず。
Appleのこのような行為が欧州連合のDSAおよびDMA法案に違反する可能性があるのか気になる。
どうやって技術分野に入ったのかという経験を共有すれば、技術的なことを学びたい学生たちの助けになるはず。
libpurpleプラグインを誰かが作る予定があるのか気になる。
このテーマへの情熱を示しつつ、Hack Clubに参加することを勧めている。
iMessageが不可視のメッセージや添付ファイルを許可する理由についての説明を期待していたが、この機能がデバイス感染に使われているのを見て疑問を抱いた。
iMessageリバースエンジニアリングのニュースに関する今日の進展を導いたオープンソースプロジェクトであるpypushは、MongoDBのServer Side Public Licenseに従っており、Beeperが所有している。このライブラリは素晴らしいが、強力な著作権ライセンスが利用できる範囲に影響を与える可能性がある。
「opertunistic」という単語が実際に使われているのか、それとも「referer」のようなタイプミスが世代を超えて定着したものなのかについて、真面目な疑問がある。
高校生がこのようなことをやってのけるのは驚くべきだという励ましの言葉がある。