LINEはじめに(背景)こんにちは。MINYOUNGです。PLATFORMの一つであるAIRを構成する一つのセキュリティソリューションです。AIRについてはこのURLで紹介されました。Signingについて紹介されましたが、今回のブログでは、iOSのコード署名について紹介したいと思います。コード署名は、ファイルの完全性を保証する、署名者(開発者)を確認する役割があります。signature構造によって実現されています。Store登録用あるいは、テスト用としてビルドされたアプリは、コード署名を行った後、デバイスで実行することができます。コード署名は、必ずAppleから発行した証明書に対応した秘密鍵で署名されている必要があります。Storeからインストールしたアプリは、以下のようにAppleの証明書に対応した秘密鍵で署名されています。Storeからインストールしたアプリの場合の証明書]開発者がテストもしくは配布するアプリは、以下のようにAppleが発行した開発者の証明書に対応した秘密鍵で署名されています。profileが必要になります。profileに明示したデバイスにインストールすることで、Appleの証明書に対応した秘密鍵で署名されていなくても実行が可能です。profileについては次で説明いたします。profile(プロビジョニングプロファイル)は、iOSデバイスやアプリを識別するためのファイルであり、iOSアプリを実機で実行するために必要なファイルです。アプリをどの端末で、どのサービス機能を利用するかが記述されています。Program“から生成することが可能です。Hocで配布する際の画面です。profileファイルが自動生成されます。Profiles”の下に保存されます。signing”を選択する場合は、profileを選択する必要があります。signingを選択した場合の画像]この場合は、手動で生成したprofileを使用します。profileは、ビルドされるアプリ(.ipa)の内部に格納されるため、ipaファイルを解凍することで確認することができます。Payload/sample.app/embedded.mobileprovision)Payloadのフォルダ→アプリの名前のフォルダ→embedded.mobileprovisionファイルは、以下のコマンドで確認します。(テキストエディターなどでも開きます。項目、有効期間などの情報があります。profileに明示されている情報と一致しない場合はアプリを実行できません。以下のようにDeveloperCertificates項目にbase64でエンコードされている文字列が証明書情報です。CERTIFICATE—–‘をつけて(PEM形式として保存するため)textファイルとして保存するとopensslコマンドで証明証の情報を確認できます。Info:...上記では、開発者用で発行した証明書が使われたことがわかります。項目では、どのサービス機能を使用できるかの資格が明示されています。settingの”Capabilities”設定によって決まります。Xcodeの”Capabilities”]以下のようにそれぞれkeyとvalueがEntitlements項目に追加されます。有効期間がすぎるとアプリは実行できません。アプリは、ここで明示したデバイス上のみ実行できます。項目がtrueになっています。署名されたアプリのMach-Oバイナリーには、コード署名に関連する構造体があります。これを利用してMach-Oバイナリーファイルの完全性を検証することができます。バイナリーまず、Mach-Oのバイナリーファイルについて簡単に説明したいと思います。OS系で使用する実行ファイルのフォマットです。./samplesample!iOSで動作するアプリ(.ipa)の中には、Mach-Oのバイナリーファイルがあります。iOSは、このMach-Oのバイナリーファイルを実行してアプリを起動します。バイナリーを得るipaファイルを解凍するとPayloadディレクトリの下にInfo.plistファイルがあります。file”項目がりますが、これがアプリが起動する際に最初に実行されるファイル(Mach-Oファイル)になります。以下は、Mach-Oのバイナリーファイルの構成を簡単にしたものです。headerですが、この情報は、Mach-O形式であるかを識別します。Mach-O形式を識別します。orderも決めます。cpuのタイプを示します。cpuの下位タイプを示します。ファイルの種類を示します。load_commandの数を示します。load_commandの全体サイズを示します。ファイルフォーマットのoptional機能を示します。headerの次に位置します。commands部分をロードします。commandであるCODE_SIGNATUREセグメントを見ていきます。signature構造(図14のCODE_SIGNATUREセグメント)について見ていきます。signature構造体に関する情報が記述されています。Signature構造体(コード署名情報に関連した構造体)のオフセットを意味します。Signature構造体を把握することができますが追う方法についてこの記事では割愛します。Signature構造体は以下のようになっています。wrapper部分を見ていきます。directoryが存在し、実行バイナリーや特定ファイルのhash値が格納されています。directoryを確認してみると、このようになります。slotは、実行バイナリーファイルをpageSize(0x1000)つず分割して、そのhash値を保存したものです。図で表現すると以下のようになります。slot]もしも実行バイナリーの一部が改ざんされたら、このhash値が異なってしまうことになるため、これを確認することで改ざんされたかがわかります。slotは、簡単に整理すると以下のようになります。slotの説明や例]それぞれの領域について確認していきましょう。profileのEntitlementのhash値を格納しています。data)して以下のようにファイルに保存します。値と同じであることが確認できます。Specificインデックス以下のリンクを確認するとまだ使用されていません。ファイルを意味します。sumが保存されています。値と同じであることが確認できます。requirementsインデックスRequirementは、コード署名を検証する規則を意味します。規則は複数存在することも可能です。Requirementの数は、Requirements項目に記載されています。Requirementsに関する情報は、以下のようにcodesignコマンドで確認できます。*/この中からRequirements部分とRequirement部分を保存してhash値を確認します。値と同じであることが確認できます。Info.plistインデックスipaファイルの中にあるInfo.plistファイルを意味します。Payload/sample.app/Info.plist)Info.plistファイルはアプリの名前、バージョン、iconのパスなどアプリに対する基本情報がふくまれています。値と同じであることが確認できます。slotでは、上記の5つのインデックスを通じて、完全性を検証することがわかりました。Syntax)形式で保存されています。wrapperの情報は、jtoolコマンドを利用して確認することが可能です。signature)この中からdata部分のみ保存するとopensslコマンドで中身を確認できます。.以下、上記で説明したものを図で表現しました。wrapperのCMS形式の情報も変わるため、これを照らし合わせることで改ざんを確認することができます。signature構造体によって実現されていることがわかりました。slotには、entitlement情報のhash値と、リソースとinfo.plistなどのhash値が保存されます。directoryのhash値と、証明書情報のhash値がCMS形式で保存されます。今回のブログでは、この情報を照らし合せることでiOSのバイナリーに対する完全性や署名者を確認する仕組みを紹介しました。Developers日本語English。