Siriの復号化

iPhone 4Sのリリースからちょうど1か月後、フランスの企業Applidiumのメンバーは、Siriパーソナルアシスタントプロトコルを逆転させました。 以下は、リバースエンジニアリングプロセス自体と、研究者に明らかにされた興味深い事実を説明する記事の翻訳です。



2011年10月14日、アップルは新しいiPhone 4Sを発表しました。 新機能の1つはSiriシステムで、パーソナルアシスタントです。 Siriは、ユーザーとの対話のために自然言語でリクエストを処理します。



Appleは、Siriがデータをリモートサーバーに送信すると述べています (これがおそらくSiriが3GまたはWiFiでのみ動作する理由です)。 私たちの手が真新しいiPhone 4Sを手に入れたらすぐに、私たちはこのことの仕組みを知ることにしました。



今日でも、Siriプロトコルを破って開くことができました。 その結果、Siri認識エンジンを任意のデバイスで使用できるようになりました。 はい。これは、Siriを使用するAndroidアプリケーションを誰でも作成できることを意味します。 または、iPadでSiriを使用します。 そして、私たちはあなたと知識を共有したいと思います。



デモンストレーション



これはおそらく、Siriを介して音声をテキストに変換する機能の最も成功したデモです。 「Siriの自律デモ」(自律デモSiri)というフレーズを使用して簡単な録音を作成し、素晴らしい結果を得ました!



Sample_Siri_speech_to_text.zip (70.78K)



このサンプルはiPhoneを経由したことはありませんが、それにもかかわらず、Siriにそれを分析させることができました。



プロトコルの詳細-簡単な技術紹介



Applidiumでは、モバイルアプリを作成しています。 リモートサーバーと通信する最良の方法はHTTPです。これは、このプロトコルがほとんどどこでも、多くの状況で常に機能するためです。



HTTPトラフィックをインターセプトする最も簡単な方法は、制御するプロキシサーバーを作成し、それを使用するようにiPhoneを構成し、プロキシを通過するものを確認することです。 したがって、tcpdumpをネットワークゲートウェイに固定し、SiriトラフィックがTCP経由でサーバー17.174.4.4のポート443に送信されることを認識しました。



デスクトップの17.174.4.4に移動すると、このサーバーがguzzoni.apple.com証明書を提供していることに気付きました。 SiriはHTTPSプロトコルを使用してguzzoni.apple.comサーバーにアクセスしたことが判明しました。



ご存知のように、HTTPSの「S」は「セキュア」を意味します。クライアントとサーバー間のすべてのトラフィックはHTTPSで暗号化されます。 したがって、スニファーを使用して読むことはできませんでした。 この場合、最も簡単な解決策は、偽のDNSサーバーを使用してHTTPSを偽造し、サーバーに何が来るかを調べることです。 Siriの背後にいる人は正しいことをしました。guzzoni証明書が有効であることを確認するので、ふりをすることはできません。 まあ...彼らはそれが有効であることを確認しましたが、独自の「ルート証明書」を追加することができます。これにより、任意の証明書にマークを付けて有効にすることができます。



したがって、必要なのは、カスタムSSL認証局をインストールし、それをiPhone 4Sに追加し、それを使用して「guzzoni.apple.com」のような純粋に偽の証明書に署名することだけでした。 そしてそれはうまくいきました:Siriは私たち自身のHTTPSサーバーにコマンドを送信しました! Appleの誰かがその点を見落としているようです。



そのとき、Siriプロトコルが不透明であることを認識しました。 Siri HTTPリクエストを見てみましょう。 リクエストの本文はバイナリです(これについては後で説明します)。ヘッダーは次のとおりです。



ACE /ace HTTP/1.0

Host: guzzoni.apple.com

User-Agent: Assistant(iPhone/iPhone4,1; iPhone OS/5.0/9A334) Ace/1.0

Content-Length: 2000000000

X-Ace-Host: 4620a9aa-88f4-4ac1-a49d-e2012910921








これから学ぶべきいくつかの興味深いこと:







それでは、身体に移りましょう。 本文には生のバイナリデータが含まれます。 16進エディタの目で最初に見たとき、常に0xAACCEEで始まっていることに気付きました。 これが見出しのようです! 残念なことに、彼の後に起こったことから何も理解できませんでした。



それは私たちが考えるのに時間がかかったときです。 モバイルアプリケーションを開発している人々として、私たちは知っています。 ネットワークでの作業に関して非常に重要なことが1つあります。これは圧縮です。 帯域幅は限られていることが多いため、通常、送信するすべてを圧縮することをお勧めします。 そして、データ圧縮のための最も一般的なライブラリは何ですか? zlib: " zlib.net "。 このライブラリは非常に効果的で強力です(もちろん、フランス語の半分です!)。 そのため、zlibを使用してバイナリデータをポンプしようとしました。 しかし、何もできませんでした; zlibヘッダーがありませんでした。 それから私たちは考えました:「うーん、すでにリクエスト本文にこのAACCEEヘッダーがあります。 他に何かあるのでしょうか? 「。 私たちの開発者は、データを詰め込んでおくことが好きです。 3バイトは、ヘッダーに適した長さではありません。 4つあります。 したがって、4バイト目以降のデータをアンパックしようとしました。 そしてうまくいきました!



データをアンパックしたので、いくつかの新しいバイナリデータを取得しました。 方法は明確ではありませんが、このデータの一部はテキストでした。 その中で、bplist00が注目を集めました。 やった! これはおそらくいくつかのバイナリplistデータです。 このバイナリストリームで十分に遊んだ後、次の部分で構成されていることがわかりました。







バイナリplistの内容の解読は非常に簡単です。「plutil」コマンドを使用して(コマンドライン経由で)Mac OS Xで実行できます。 または、他のプラットフォームでCFPropertyList gemを使用するRubyで。



学んだこと



iPhone 4SがAppleサーバーとどのように通信するかについて、いくつか興味深いことを学びました。



音声データ


iPhone 4Sは生のオーディオをサーバーに送信します。 Speexオーディオコーデックを使用して圧縮されていますが、このコーデックはVoIP用に特別に設計されているため、これは理にかなっています。



身分証明書


iPhone 4Sはどこにでも識別子を送信します。 したがって、別のデバイスでSiriを使用する場合、少なくとも1つのiPhone 4Sの識別子が必要です。 もちろん、私たちは公開しませんが、すでに書いたツールを使用して簡単に入手できます。 もちろん、理論的にはAppleは識別子をブラックリストに載せることができますが、個人的な目的で使用する限り、すべての順序は正しいはずです。



実際のコンテンツ


プロトコルは、実際、非常におしゃべりです。 あなたのiPhoneはたくさんの物をAppleのサーバーに送ります。 そして、これらのサーバーは信じられないほどの量の情報で彼に答えます。 たとえば、テキスト読み上げを使用すると、Appleサーバーは各単語の信頼スコアとタイムスタンプも送信します。



次は?



プロトコルの理解を支援するために作成したツールのコレクションを次に示します。 それらは主にRuby(驚くほど単純な言語であるため)、Cの一部、Objective-Cで書かれています。 開発は実際には完了していませんが、Siriアプリケーションを技術的に作成できる人にはこれで十分です。



Siriでどんな楽しいことができるか見てみましょう! また、Appleがセキュリティポリシーを変更するのにかかる時間を見てみましょう。



All Articles