続いて紹介したのが「ファイル改ざん」だ。例えばゲームアプリの場合、アプリがクラッシュしても、再起動した時にクラッシュ直前の状態に復帰できるよう、アプリフォルダ内にステータスなどの情報を保存していることがある。
ほとんどのファイルは暗号化されているが、逆コンパイルを用いてアプリのアーカイブファイル(apkやipa形式)からソースコードを復号し、暗号化に利用しているアルゴリズムや秘密鍵を特定することで、保存されているファイルを復号してコードを書き換えて不正行為を行う。いわゆる「リバースエンジニアリング」(参考記事)の手口だ。
講演では、Java、C#(Unity Mono)、C/C++(Android NDK / cocos2d-x)で構築したサンプルアプリを逆コンパイルした。その結果、言語や開発環境にかかわらず、共通鍵暗号アルゴリズム「AES-CBC」(128bit)を利用していること、16バイトの鍵が特定できることを確認した。
舟久保氏はこうしたファイル改ざんの対策には「コードを解析されないような仕組みの導入が必要だ」と述べる。
「関数名や文字列は解析ツールで逆コンパイルすると把握できてしまう。例えば『encrypt』という関数があれば、簡単に見つかってしまう可能性が高い。従って、シンボル情報(関数名、変数名)を削除したり、文字列はXORなどを用いて暗号化したりする方法を採るのがよいだろう。また、例に挙げた『AES』は、よく知られている暗号化手法なので、独自暗号を利用するのも一つの手だ。さらに、ダミーコードやループを追加して処理の流れを追跡されにくい形にすることで、どういう暗号アルゴリズムを用いているのか、解析されにくい構成になる」
最後に紹介したのが「パケット改ざん」だ。ファイル改ざんと同様、逆コンパイルで暗号化手法と秘密鍵を把握しておき、スマートフォンアプリとサーバが通信するパケットを専用ツールで傍受する。そして、パケットごとに「データの復号」「コードの書き換え」「再暗号化」の処理を挟んでアプリサーバに送信することで改ざんするという手法だ。
「パケット改ざんの対策は、SSL通信を利用して証明書の検証(Pinning)を行うことだ。また、Pinningの処理が解析され、コードを書き換えられないよう、ファイル改ざん対策で挙げたシンボル情報の削除や難読化、独自暗号の利用、コード難読化、改ざん検知を実施すべきだろう」
舟久保氏は3つの手法の対策についてまとめ、講演を締めくくった。
「クライアント側にデータやロジックを保存させると、改ざんされやすい。また、サーバ側にデータやロジックを保存したり、今回紹介した対策方法を適用したりしても、完全に改ざんを防ぐのは不可能だ。改ざん手法を知り、さまざまな対策を多層的に行って、時間をかけても改ざんされにくいアプリを設計、開発することが求められるだろう」
Copyright © ITmedia, Inc. All Rights Reserved.