特集
» 2019年02月27日 05時00分 公開

「不正ユーザーの95%が利用する手法」を解説:「未対策なら1分でできる」 スマホアプリの改ざんを防ぐには? (2/2)

[石川俊明,@IT]
前のページへ 1|2       

ファイル改ざんによる手法

 続いて紹介したのが「ファイル改ざん」だ。例えばゲームアプリの場合、アプリがクラッシュしても、再起動した時にクラッシュ直前の状態に復帰できるよう、アプリフォルダ内にステータスなどの情報を保存していることがある。

 ほとんどのファイルは暗号化されているが、逆コンパイルを用いてアプリのアーカイブファイル(apkやipa形式)からソースコードを復号し、暗号化に利用しているアルゴリズムや秘密鍵を特定することで、保存されているファイルを復号してコードを書き換えて不正行為を行う。いわゆる「リバースエンジニアリング」(参考記事)の手口だ。

 講演では、Java、C#(Unity Mono)、C/C++(Android NDK / cocos2d-x)で構築したサンプルアプリを逆コンパイルした。その結果、言語や開発環境にかかわらず、共通鍵暗号アルゴリズム「AES-CBC」(128bit)を利用していること、16バイトの鍵が特定できることを確認した。

難読化ツール「ProGuard」を適用したAndroidアプリ(Java)で特定(上:サンプルコード、下:ツールを用いて復号したコード) 難読化ツール「ProGuard」を適用したAndroidアプリ(Java)で特定(上:サンプルコード、下:ツールを用いて復号したコード)
C#を利用したiOSアプリで特定(左:サンプルコード 右:ツールを用いて復号したコード) C#を利用したiOSアプリで特定(左:サンプルコード 右:ツールを用いて復号したコード)
「OpenSSL」ライブラリを利用したC/C++のアプリでも特定 「OpenSSL」ライブラリを利用したC/C++のアプリでも特定

 舟久保氏はこうしたファイル改ざんの対策には「コードを解析されないような仕組みの導入が必要だ」と述べる。

 「関数名や文字列は解析ツールで逆コンパイルすると把握できてしまう。例えば『encrypt』という関数があれば、簡単に見つかってしまう可能性が高い。従って、シンボル情報(関数名、変数名)を削除したり、文字列はXORなどを用いて暗号化したりする方法を採るのがよいだろう。また、例に挙げた『AES』は、よく知られている暗号化手法なので、独自暗号を利用するのも一つの手だ。さらに、ダミーコードやループを追加して処理の流れを追跡されにくい形にすることで、どういう暗号アルゴリズムを用いているのか、解析されにくい構成になる」

さまざまな対策を行うことで解析されにくい構成にできる

パケット改ざんによる手法

 最後に紹介したのが「パケット改ざん」だ。ファイル改ざんと同様、逆コンパイルで暗号化手法と秘密鍵を把握しておき、スマートフォンアプリとサーバが通信するパケットを専用ツールで傍受する。そして、パケットごとに「データの復号」「コードの書き換え」「再暗号化」の処理を挟んでアプリサーバに送信することで改ざんするという手法だ。

DeNAでは内製ツール「PacketProxy」を用いてパケット改ざんが出来るかどうか診断しているという DeNAでは内製ツール「PacketProxy」を用いて、公開するアプリにパケット改ざんが可能な脆弱(ぜいじゃく)性が無いかどうか診断しているという

 「パケット改ざんの対策は、SSL通信を利用して証明書の検証(Pinning)を行うことだ。また、Pinningの処理が解析され、コードを書き換えられないよう、ファイル改ざん対策で挙げたシンボル情報の削除や難読化、独自暗号の利用、コード難読化、改ざん検知を実施すべきだろう」


 舟久保氏は3つの手法の対策についてまとめ、講演を締めくくった。

 「クライアント側にデータやロジックを保存させると、改ざんされやすい。また、サーバ側にデータやロジックを保存したり、今回紹介した対策方法を適用したりしても、完全に改ざんを防ぐのは不可能だ。改ざん手法を知り、さまざまな対策を多層的に行って、時間をかけても改ざんされにくいアプリを設計、開発することが求められるだろう」

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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