クラッシュログと難読化:クラッシュコース

ランタイムクラッシュのデバッグは面倒なプロセスになることがあります。 iOSアプリが実際にクラッシュしたときデバイスが保持しているのは、クラッシュ発生時に実行中のプロセスのメモリアドレスとオフセットに関する情報のみです。この情報はスタックトレースとして表示されます。スタックトレースは、クラッシュが発生した場所を示す、最近の実行順に並べられたメソッド呼び出しのリストです。スタックトレースの詳細レベルは様々で、開発者がこれらのスタックトレースを最大限に活用できるようにするためのメカニズムが用意されています。 

しかし、セキュリティを重視するエンジニアの間でよくある誤解は、強化されたアプリケーションは現場でよく使われるデバッグツール(Firebase Crashlyticsなど)を破壊し、アプリのクラッシュ原因の解明をさらに困難にするということです。しかし、必ずしもそうではありません。アプリケーションは、強力なセキュリティと、実用的な関連クラッシュログの両方を備えることができます。では、どうすればこれを実現できるのでしょうか? 

iOSアプリのクラッシュログを分かりやすくするために、開発者はdSYMファイルを活用できます。dSYMファイルにはデバッグ用のシンボル情報が含まれており、ビルドプロセス中にXcodeによって生成されます。これらのファイルの内容、その有用性、そしてその活用方法について見ていきましょう。 Digital.ai Application Security 製品はこのメカニズムと統合されており、安全なアプリケーションのデバッグが可能になります。 

オープンソースの ジョブディスパッチャ iOS アプリ。  

dSYM バンドルには何が含まれていますか? 

dSYM(デバッグシンボル)バンドルには、iOS/tvOS/macOSアプリケーションのシンボルとソースコードの行情報が含まれています。これらは、使用しているビルド構成で「デバッグ情報フォ​​ーマット」が「DWARF with dSYM File」に設定されている場合にXcodeによって生成されます。

ここで疑問に思うかもしれません。なぜすべてのシンボルをアプリ内ではなく別のファイルに格納する必要があるのでしょうか?主な理由は、デバッグ時の移植性です。アプリをビルドして別のマシンでデバッグする場合、ビルドに使用したオブジェクトファイルがなくても済みます。dSYMを使用すると、アプリケーションのリリースバージョンをデバッグすることも可能で、時間を大幅に節約できます。  

dSYM とは何か、そしてなぜそれが重要なのかについて少し紹介したので、作成した .xcarchive を開いて、以下の「Job Dispatcher.app.dSYM」バンドルを確認してみましょう。

Job Dispatcher にはメイン アプリ用のバンドルが 1 つだけありますが、ビルド プロセス中にプロジェクトで追加のライブラリまたはフレームワークがビルドされると、さらにバンドルが生成されることがあります。 

では、dSYM バンドルには実際に何が含まれているのでしょうか? バンドルを右クリックして「パッケージの内容を表示」を選択すると、次の内容が表示されます。

T彼 'Info.plist' file ただ 含まれています metbに関するデータそれ自体を解き放ち、 ありません 非常に便利. B'のその他Job ディスパッチャ.yml' ファイルと'ジョブディスパッチャー マッハOデバッグ file 含む シンボル 名前と場所 そして私たちが大切にしていること. レッツ 最初の 開く 'Job ディスパッチャ.yml' file (簡潔にするため、画像は省略されています):

ここでは、バイナリ内の各シンボルのプロパティのリストを見ることができます。例えば、「サイズ」 ポインタのサイズに相関します(これらはすべて64ビットのシンボルです)'symName' シンボルの名前に対応する「symBinAddr' バイナリ自体にシンボルが存在する場所であり、symSize' 関数またはデータオブジェクトのサイズです。このファイルはAArch64アーキテクチャの重要な部分である再配置情報に重点を置いていますが、ここでは詳しく説明しません。  

それでは、DWARFフォルダ内の「Job Dispatcher」というファイルを見てみましょう。このバイナリファイルには、ビルドしたアプリケーション内のすべてのシンボルの詳細なデバッグ情報が含まれています(ご覧のとおり、DWARFファイルとアプリケーションの名前は同じです)。このファイルに対して「dwarfdump」コマンドを実行すると、ファイル内の情報を読み取り可能な形式でダンプできます。 認証 シンボル:

注目すべき特性としては、 DW_AT_decl_file (NAIST) と DW_AT_decl_line、これは、 認証 関数は 'LoginFunc.m' ファイルの13行目に定義されています。もう1つのプロパティは DW_AT_タイプは関数の型(この場合はbool型)を示します。各シンボルはDWARFファイル内にこのようなセクションを持ち、そのシンボルが何であるか、どこで定義されているかなどを説明する情報が含まれています。 

dSYMバンドルの内容を解析するのはかなり難しいですが、実際に活用するために誰もが知っておく必要があるものではありません。ここでは、クラッシュをリアルタイムでデバッグする際にdSYMが実際にどのような機能を果たすのかを見ていきます。 

dSYMの実践 

ジョブディスパッチャを強制的にクラッシュさせることで、dSYMの威力を確認してみましょう。これは、14行目と15行目のヌルポインタに値を代入することで実現できます。 認証 関数:

   アプリケーションを実行するにはアウト a関連する dSYMアプリがクラッシュする, (NAIST) と 次のようなスタック トレースが取得されます。

Now, それはだ アプリケーションをデバッグすることは確かに可能 この情報を使用して. スタックフレームにはクラッシュのアドレスに関する情報が含まれています そしてオフセット (あまり役に立たない) クラッシュが発生したシンボル名。 しかしながら、uこのスタックトレースを理解するにはs バイナリの詳細な分析 それ自体と は、大阪で ほとんどない 洞察力 ソースコードのどの部分が問題を引き起こしているか. この結果をクラッシュログと比較すると、 dSYM 情報 利用できます:

各スタックフレームにはアプリがクラッシュしたアドレスがまだ含まれていますが、シンボル情報はより完全です。クラッシュが発生した場所が分かります。 _認証 'LoginFunc.m' の15行目の関数(まさにソースコードでクラッシュを誘発した箇所)です。この読み取り可能なスタックトレースを再現することが、あらゆるクラッシュレポートツール(Firebase Crashlytics、BugSnag、Instabug など)の目標であり、これらのツールではこれを実現するために dSYM バンドルのアップロードが必須となっています。 

アプリのセキュリティはこれらすべてにどのように当てはまるのでしょうか? 

これまでdSYMについて議論してきたことはすべて、Xcodeで構築したアプリケーションが一切改変されていないことを前提としていました。では、アプリストアに提出する前に、悪意のあるユーザーからアプリを保護したい場合はどうすればよいでしょうか? 

そうですね、保護中にバイナリがシャッフルされ、新たに難読化されたシンボルの位置がdSYMバンドル内の情報と一致しなくなります。保護されたアプリのクラッシュを、保護されていないアプリケーションのdSYMバンドルでシンボリケートしようとすると、結果は意味をなさなくなります。これを修正する方法はありますか? 

ビルド後の保護とビルド中の保護 

現場の声を力強いメッセージへ。 モバイル向けアプリ保護:ARM この製品は、一切の設定なしで使用できるビルド後の保護ソリューションです。これにより、脅威アクターからアプリケーションを保護することが容易になり、開発者は保護されたアプリを一度ビルドするだけで済むため、テスト時のフィードバックループを改善できます。ただし、前述のように、元のdSYMバンドルは保護されたアプリケーションと互換性がないという注意点があります。開発者は、コード変更や潜在的なクラッシュのシンボリケーションを考慮して、保護後にdSYMファイルを再作成する必要があります。 

一方、Xcodeが生成するdSYMファイルを再作成することなく、アプリケーションを保護することができます。当社のApp Protection for Apple Native製品は、ビルド時に保護するソリューションであるため、この機能を実現しています。アプリは、元のソースコードと共に様々なセキュリティ機能を有効にした状態でコンパイル・リンクされます。生成されたdSYMファイルはビルドで指定されたすべての内容を考慮して構造化されているため、保護されたアプリのシンボル化が可能になります。ただし、ビルド時の保護には開発者側でより多くの設定が必要となり、アプリケーションが大規模で複雑になるにつれて、設定が難しくなる可能性があります。 

物事をまとめる 

これで、dSYM バンドルの重要性、その内容、使用方法、そしてセキュリティ重視のエンジニアが iOS アプリケーションのデバッグを容易にするツールを利用するために犠牲を払う必要がないようにするためのソリューションについて、ご理解いただけたかと思います。 

お勧めの関連ガジェット