改竄とリバースエンジニアリング

長い間、リバースエンジニアリングや改竄の技法はクラッカー、MOD作成者、マルウェア解析者の分野に属していました。「伝統的な」セキュリティテスト技術者や研究者にとって、リバースエンジニアリングはどちらかというと補完的なスキルでした。しかし状況は一変します。モバイルアプリのブラックボックステストではコンパイルされたアプリを逆アセンブルし、パッチを適用し、バイナリコードやライブプロセスを改竄することがますます必要になっています。多くのモバイルアプリが改竄に対する防御を実装しているという事実はセキュリティテスト技術者にとって物事を簡単にしてはくれません。

モバイルアプリのリバースエンジニアリングはコンパイルされたアプリを解析し、そのソースコードに関する情報を抽出します。リバースエンジニアリングの目的はコードを 理解すること です。

改竄 (Tampering) はモバイルアプリ (コンパイルされたアプリまたは実行中のプロセス) またはその動作に影響を与える環境を変更するプロセスです。例えば、アプリはルート化されたテストデバイス上で実行することを拒む可能性があり、一部のテストを実行できなくなる可能性があります。そのような場合には、アプリの動作を変更したいでしょう。

モバイルセキュリティテスト技術者は基本的なリバースエンジニアリングの概念を理解することで恩恵があります。プロセッサアーキテクチャ、実行形式、プログラミング言語の複雑さなど、モバイルデバイスとオペレーティングシステムにも精通している必要があります。

リバースエンジニアリングは一種の芸術であり、そのすべての側面を記述しようとすると図書館を満たしてしまうでしょう。技術と専門分野の範囲は驚異的であり、マルウェア解析の自動化や新しい逆難読化手法の開発など、非常に特殊で独立した部分問題の取り組みに何年も費やすことがあります。セキュリティテスト技術者はジェネラリストです。有能なリバースエンジニアであるためには、膨大な量の関連情報をフィルタする必要があります。

常に機能する一般的なリバースエンジニアリングプロセスはありません。とはいえ、このガイドの後半ではよく使われる手法やツールについて説明し、最も一般的な防御への対処例を示します。

あなたがそれを必要とする理由

モバイルセキュリティテストには少なくとも基本的なリバースエンジニアリングのスキルが必要な理由がいくつかあります。

  1. モバイルアプリのブラックボックステストを可能にするため: 現在のアプリには動的解析を妨げるコントロールを含むことがよくあります。SSL ピン留めとエンドツーエンド (E2E) 暗号化はプロキシを使用したトラフィックの傍受や操作を妨げる可能性があります。ルート検出はアプリがルート化されたデバイス上で実行できなくなり、高度なテストツールを使用できなくなる可能性があります。これらの防御を無効にする必要があります。

  2. ブラックボックスセキュリティテストの静的解析を強化するため: ブラックボックステストでは、アプリバイトコードやバイナリコードの静的解析はその内部ロジックを理解するのに役立ちます。また、ハードコードされた資格情報などの欠陥を識別することもできます。

  3. リバースエンジニアリングに対する耐性を評価するため: モバイルアプリケーション検証標準のアンチリバースコントロール (MASVS-R) にリストされているソフトウェア保護対策を実装するアプリはある程度のリバースエンジニアリングに対して耐性を持つ必要があります。これらのコントロールの有効性を検証するには、テスト担当者は一般的なセキュリティテストの一環として 耐性評価 を実行します。この評価では、テスト担当者はリバースエンジニアの役割を担い、防御のバイパスを試みます。

モバイルアプリのリバースエンジニアリングの世界に飛び込む前に、良いニュースと悪いニュースを共有します。良いニュースから始めましょう。

最終的に、リバースエンジニアは常に勝利します。

これはモバイルの世界では特に真実です。モバイルアプリをデプロイおよびサンドボックス化する方法は、設計上、従来のデスクトップアプリのデプロイメントやサンドボックス化よりも制限が厳しくなります。そのため、Windows ソフトウェアでよく見られるルートキットのような防御メカニズム (DRM システムなど) を含めることは簡単には実行できません。Android のオープン性によりリバースエンジニアはオペレーティングシステムに変更を加え、リバースエンジニアリングプロセスを支援することを可能にします。iOS ではリバースエンジニアはほとんどコントロールできませんが、防御の選択肢もまた制限されています。

悪いニュースとしては、マルチスレッドでのアンチデバッグコントロール、暗号化ホワイトボックス、隠れた耐タンパ性機能、非常に複雑なコントロールフロー変換を扱うことは容易ではないということです。最も効果的なソフトウェア保護スキームは独自のものであり、標準の微調整やトリックでは太刀打ちできないでしょう。それらを打ち破るには面倒な手動解析やコーディングが必要です。あなたの性格によっては、眠れない夜や緊迫した関係につながる可能性もあります。

初心者にとってリバーシングの範囲に圧倒されてしまうかもしれません。始める際の最善の方法は基本的なツール (Android および iOS のリバーシングの章の関連するセクションを参照) をセットアップし、簡単なリバーシングタスクや crackme を開始することです。アセンブラ/バイトコード言語、オペレーティングシステム、遭遇する難読化について学ぶ必要があるでしょう。簡単なタスクから始めて、徐々により難しいものへ進んでいきます。

このセクションでは、モバイルアプリのセキュリティテストで最もよく使用される技法の概要を説明します。これらは、基本的な改竄技法や、静的および動的バイナリ解析を含みます。

高度に難読化されたバイナリなど、より複雑なタスクは、解析の特定の部分を自動化する必要があります。例えば、複雑なコントロールフローグラフを逆アセンブラで手動解析すると、何年もかかり、完了する前におそらく気が狂うことでしょう。代わりに、カスタムメイドのツールでワークフローを増強します。幸いにも、現代の逆アセンブラにはスクリプティングと拡張 API が付属しており、一般的な逆アセンブラには多くの便利な拡張が利用可能です。オープンソースの逆アセンブラエンジンやバイナリ解析フレームワークも存在します。

ハッキングにはよくあることとして、何でもありで、最も効率的なものを使用するだけです。すべてのバイナリは異なり、すべてのリバースエンジニアは独自のスタイルを持っています。多くの場合、目標に到達する最善の方法は、エミュレータベースのトレースやシンボリック実行など、アプローチを組み合わせることです。まずは、優れた逆アセンブラやリバースエンジニアリングフレームワークを選択し、その機能や API に慣れることです。最終的には、上達への最善の方法は実践的な経験を積むことです。

Last updated