連載
» 2016年04月27日 05時00分 公開

Androidセキュリティ技術の最前線(3):不正Androidアプリの大量生産はどうすれば防げるのか (2/3)

[金井文宏(NTTセキュアプラットフォーム研究所), 吉岡克成(横浜国立大学),@IT]

「難読化」によるリパッケージ対策

 攻撃者によるリパッケージのコストを増加させるためにまず検討すべきなのは、「アプリの難読化」である。そこで以下では、いくつかの難読化技術について紹介する。

1.「クラス名」「変数名」の難読化

 Android SDK付属の「ProGuard」を適用することで、実行コード内のクラス名、変数名などを無意味な文字列に変換することができる。この手法は、特に手動でのリバースエンジニアリングの妨害に有効である。

2.文字列の暗号化

 実行コード内の文字列定数は容易に抽出可能であるため、例えば暗号鍵やファイルパスなどといった、特徴的な文字列から機能を類推される危険がある。これを防ぐために、特徴的な文字列定数はあらかじめ暗号化しておき、必要に応じて復号する実装にするのが望ましい。

3.「リフレクション」「動的コードローディング」の利用

 Javaにおける「リフレクション」を利用することで、クラス生成やメソッド呼び出しの対象を、コードの実行時に動的に決定することができる。特に、上述した「文字列の暗号化」との組み合わせによって、APIの呼び出しや制御フローなどを隠蔽(いんぺい)することが可能になる。

 また、元々の実行コード(classes.dex)とは別のコードをアプリ実行中に読み込む技術である「動的コードローディング」も、特定の機能の実装を隠蔽する上で効果的である。

 以上のような、「アプリの実行時に動的に処理が決定されるような実装」を行うことで、静的解析の難易度を増加させることができる。ただし、これらの対策はアプリのパフォーマンス低下につながる可能性もあるため、適用箇所をよく検討する必要がある点には注意していただきたい。

4.ネイティブコードの利用

 Androidにおいては、仮想マシン上で実行される中間コード(Dalvikバイトコード)の他に、仮想マシンを介さないネイティブコードも実行可能である。一般的に、ネイティブコードの解析難易度は中間コードより高いため、攻撃者の解析コスト向上が見込める。

 以上、ここで挙げたのは一部の例に過ぎないが、これらのような難読化技術を用いることで、リバースエンジニアリングの難易度を高め、結果としてリパッケージのコストを増加させることが可能となる。

改ざん検知による自動リパッケージへの対策

 難読化による対策は、攻撃者の目的が「リパッケージ対象アプリの内部実装を読み解き、特定の実装箇所を改ざんすること」であるような場合に特に有効であった。一方で、前述したような「自動的なリパッケージによる悪性コードの挿入」という手法に対しては、攻撃者は個々のアプリの内部実装に依存しないような共通の処理でリパッケージを行っていることが想定される。従って、難読化とは異なるアプローチでの対策が必要になる。

 こうした自動リパッケージへの対策例としては、「アプリの改ざん検知」が挙げられる。これは、アプリ実行時に改ざんが検知された場合に、ユーザーに対して警告を表示したり、アプリの動作を停止させたりすることで、アプリの利用停止、アンインストールを促し、改ざんされたアプリが長期的に利用され続けることを防ぐ技術である。このような対策は、長期的な感染を目的とするようなリパッケージマルウェアに対して特に有効である。

 アプリの改ざん検知の方法としては、「署名情報の検証」や「実行コードのハッシュ値チェック」などが挙げられる。もちろん、これらの「改ざん検知機能」自体がリパッケージによって無効化されてしまう可能性もあるため、前述したような難読化技術を組み合わせることで、これらの機能の実装箇所を隠蔽することも大切である。

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。