Androidアプリ:リバースエンジニアリングの危険性とその対策
リバースエンジニアリング(※)が簡単に行われる時代に、Androidアプリを守るための対策は、もはや必須と言えます。
アプリ難読化の重要性は、エンジニアの中で徐々に認知されつつあります。しかし、わずかな手間で実行可能ファイルがソースコードまで逆コンパイル(※)されて、機密情報が盗まれてしまうという危険性は、依然として軽視されがちです。
本ブログでは、リバースエンジニアリングを行うための1つの手法、「逆コンパイル」によるコード復元の実例を紹介したうえで、難読化ツールを用いた効果的な防御手段を解説します。
(※)参考:リバースエンジニアリングと逆コンパイル
*目次*
- 手軽にできるリバースエンジニアリングの現実
- dex2jarとJD-GUIを使ったAPK解析手順
- Androidコードを深堀り
- リバースエンジニアリングによる重大なリスク
- DashOを使った難読化の実践
- 難読化だけじゃない!複数の防御手段でアプリを守る方法
- まとめ
手軽にできるリバースエンジニアリングの現実
通常、Androidアプリをリバースエンジニアリングするには、コンパイル済みのソースコードとリソースを人間が読める形式に逆コンパイルする専用ツールを使用します。このプロセスでは、Androidアプリ開発についての一定知識とJavaの知識を必要とするため、実施することは難しい場合もあります。
ただし、適切なツールと専門知識があれば、ほとんどのAndroidアプリをリバース エンジニアリングすることは可能です。
dex2jarとJD-GUIを使ったAPKの解析手順
より詳しい解析を行うには、まずAPKファイルの逆コンパイルから始めましょう。ここでは、dex2jarとJD-GUIを使用して、AndroidのAPKファイルをJARファイルに逆コンパイルする手順を説明します。
使用するツールは2つです。
1)JD-GUI:
Javaバイトコード(.classファイル)を逆コンパイルして、人間が読めるJavaソースコードに変換するためのグラフィカルユーザーインターフェースを持つツールです。
2)dex2jar:
DEXファイルをJava JARファイルに変換し、Javaソースコードを表示するために使用できるJavaデコンパイラです。
手順1)
dex2jarを使って、APKファイルのclasses.dexをclasses.jarに変換します。これにより、APKのバイナリコードをJavaのJARファイルに変換することが可能になります。ここでは次のコマンドを使用します。(バイナリ名は適宜置き換えてください。)
d2j-dex2jar.bat app-release-unsigned.apk
この変換によって、任意のJavaデコンパイラを用いればAndroidアプリのソースコードを読み取れるようになります。
手順2)
変換されたjarファイルをJD-GUIで開きます。アプリのソースコードがJavaクラスとして表示され、読み取りやすい形式でコードを閲覧できます。
Androidコードを深堀り
前述の手順では、ツールを活用してJava形式のソースコードを取得する方法を解説しました。では次に、その取得したソースコードを使用して、APKファイルの構造を解析するための手順を詳しく説明します。
手順1)
JD-GUIを使用してAndroidバイナリを逆コンパイルすると、JD-GUIアプリの左側に、APKファイルの構造が表示されます。アプリとその実行内容をよりよく理解するために、「MainActivity」から始めます。
このアプリのMainActivityを調べてみると、いくつか興味深い点に気づきます。
・コード内でDatabaseHelperクラスを使用して、ローカルのSQLiteデータベースに接続しています。
・データベース名は “test123.db” として指定されています。
・getUserInfoメソッドを使用して、userというテーブルからusert(ユーザー名)とpw(パスワード)を取得しています。
手順2)
外部APIへのアクセスに注目しましょう。解析時は、赤枠で囲んだ箇所を確認します。
・AccessApiTaskという名前の非同期タスク(AsyncTask)を使用して、外部APIにリクエストを送信していることが確認できます。
・StringBuilderを使用して、APIリクエストのURLが構築されており、usertとpwというクエリパラメータがURLに追加されています。
・Authorizationヘッダーに、Bearerトークンが設定されていることが確認できます。このトークンは、メソッドに渡された3つ目の引数(param1VarArgs[2])として受け取った値を利用しています。
リバースエンジニアリングによる重大なリスク
これまでに説明した手順のように、逆コンパイルによってソースコードを解析されると、重大なリスクが発生します。
1. データベースの解析
アプリ内のSQLiteデータベース(test123.db)が簡単に解析され、ユーザー名やパスワードが盗まれる可能性があります。
2. APIリクエストの解析
逆コンパイルにより、APIのエンドポイントやリクエストの詳細が明らかになり、攻撃者がリクエストを偽造したり、認証情報を盗んでアプリやサーバーに不正アクセスできたりする恐れがあります。
3. ハードコードされたトークンの漏洩
トークン(YOUR_TOKEN_HERE)がハードコードされているため、逆コンパイルでトークンが取得され、APIへの不正アクセスが容易になるリスクがあります。
今後、想定される攻撃としては、ローカルのAndroidファイルからデータベースを取得し、その中に保存されている重要なデータを特定される可能性があります。
DashOを使った難読化の実践
では、逆コンパイルを用いたリバースエンジニアリングを防ぐためにはどうすればいいのでしょうか。その方法の1つとして、難読化ツールのパッケージ製品「PreEmptive Protection」のひとつ、DashOを使った難読化が挙げられます。
DashOの使用はとても簡単です。ウィザードの指示に従うだけで、わずか数十秒でDashOの統合が完了します。
統合が終わったら、再度ビルドを行うことで、難読化されたAPKが出力されます。
このAPKを逆コンパイルし、JD-GUIを使ってツリーを展開すると、どのファイルにロジックが含まれているのかが理解しづらくなっていることを確認できます。
たとえ、全てのファイルに対して文字列の検索をしても、ヒットしません。適当なファイルを開いて中身を見てみると、文字列が次のように変換されていることが分かります。
さらに、見覚えのないロジックが大量に追加されていることがわかります。ロジックを追跡するのにも、多くの時間が掛かることが予想されます。
このように、難読化の結果を確認すると、データベースの解析、APIリクエストの改ざん、ハードコードされたトークンの漏洩といったリスクにも十分に対応できることがわかります。アプリのセキュリティを強化するためには、難読化が不可欠であることを実感できるはずです。
難読化だけじゃない!複数の防御手段でアプリを守る方法
難読化は非常に有効な手段ですが、アプリケーションの安全性を強固にするには、まだまだ十分ではありません。攻撃者によるアプリ解析と改ざんがより困難となるように、デバッグ検知、改ざん検知、ルート検知などを組み合わせることが重要です。
これらの対策は、DashOのウィザードを活用すれば簡単に実現できます。
まとめ
無料のツールであっても簡単にAndroidアプリのソースコードを再生成して、悪意のある解析や改変を行うことは容易です。このリスクに対処しない限りは、アプリのセキュリティが脆弱になり、ユーザーデータの漏洩や不正利用の危険性が高まり続けます。
DashOは、難読化に加えてデバッグ検知や改ざん検知などの多層的な防御を提供し、アプリをリバースエンジニアリングから守ります。ソフトウェアの導入は簡単に済みますし、短時間でビルド処理に統合することも可能です。
アプリのセキュリティを強化に興味がある方は、ぜひDashOの評価版をお試しください。お申し込みは下記URLからどうぞ。
Dashの評価版申し込み
▼ https://www.agtech.co.jp/preemptive/dash_o/trial/