【Android】代表的な脆弱性まとめ ~ファイルアクセス権について~
近年、スマートフォンの普及に伴い、Android, iPhone, WindowsPhone? ユーザが爆増してきているようです。。。
当然利用ユーザが多くなれば悪事の標的にもされやすくなります。
ってことでスマートフォンのポピュラーなセキュリティ脆弱性についてアプリ開発者視点で簡単にまとめておきます。
iPhoneについてはハードウェア的にもソフトウェア的にも縛りが厳しく、それなりにセキュアが保たれているようなので、今回は縛りがゆるゆるで色々悪事が出来てしまうAndroidについて取り扱います。(WindowsPhoneは知らん。)
ファイルのアクセス権限について
あるアプリで個人情報などを記録したファイルがあるとします。そのファイルのアクセス権がきちんと最適に設定されていない場合、他の悪意のあるアプリからアクセスされてしまい、情報の改変や外部への漏洩が起こりうります。
内部ストレージのアクセス権限設定
通常、あるアプリで作成したファイルは、特に他のアプリと連携する必要がない場合、そのアプリからのみアクセス可能、他アプリからはアクセス不可なようにすべきです。下記のようなのがよくあるミス。
outputStream = openFileOutput(STRAGE_FILE_NAME, MODE_WORLD_READABLE | MODE_APPEND);
ファイルを書き出す際、アクセス権がMODE_WORLD_READABLEと、他アプリからも参照できるようになっています。
通常しないような気もしますが、どっかのサイトから適当にコピペした場合などに起こりうるかもしれません。
MODE_PRIVATEなど、他アプリからは参照できないようにすべきです。
もし他アプリとデータの連携が必要な場合は、ContentProvider,BroadcastReceiver,Serviceなどの仕組みを用いて制御すべきです。
SDカードへのアクセス権限の理解
上記のように、内部ストレージへのデータ保存の場合、アプリ側でアクセス権を制御することは可能なわけですが、SDカードへのデータ保存の場合は違います。すなわち、アプリ側でのアクセス権の制御ができず、全アプリからアクセスが可能となります。
SDカードへファイルを書き込む場合、下記のようになるかと思います。
// 既存のファイルを一度削除した後、新たにファイルを作成 File file = new File(SD_FILE_PATH); file.getParentFile().mkdir(); // 書き込み処理を行う fileOutputStream = new FileOutputStream(file, true); fileOutputStream.write(data.getBytes());
見ての通り、アプリでのアクセス権の制御の余地はありません。
つまりはSDカードへのデータを保存する場合は、見られても構わないようなデータのみにすべきで、見られて困るようなデータを保持したい場合は、内部ストレージを使用しましょう、ということ。
また、SDカードだと、物理的に抜かれるリスクもありますし。
というインセキュアな事情もあり、Google側でも今後アプリからSDカードへの書き込みは出来なくする方向で進めてるみたいですね。
【参考】
http://source.android.com/devices/tech/storage/index.html
Preferenceファイルのアクセス権限設定
Preferenceは、キーバリューストア方式で内部ストレージへ容易にデータを保存する仕組みです。実装が簡単なため、僕もよく使います。。
これも最初の例と同様に、アクセス権の設定によっては他のアプリからアクセス可能になってしまいます。
危ないコードは以下の様な感じ。
// SharedPreferences型インスタンスを取得 preferences = getSharedPreferences(PREFERENCE_NAME, MODE_WORLD_READABLE);
最初の例と同じで、ファイル作成時、アクセスモードをMODE_WORLD_READABLEとしています。MODE_PRIVATEにすべきです。
まとめ
アプリ開発者は、ファイル作成時、アクセス権を意識してコーディングしましょうということ。
具体的には、
- 見られて困るデータは内部ストレージへ保存するようにする。また、その際にはアクセス権限をMODE_PRIVATEとかにする。
- SDカードへの保存は、見られて困らないようなデータのみに限定すべき。
また、アプリ利用者も、SDカードへ基調なデータはなるべく入れないよう心がけることが大切なのです、きっと。
参考サイト
GoogleAdsense
関連記事
-
-
クラックツールHydraでベーシック認証を突破してみる
kali linuxにデフォルトでインストールされているツール「Hydra」を利用して、ベーシック認
-
-
PHPのextensionが読み込まれない問題…
大したあれではないが、ちょっと詰まったのでメモ。。。 事のぼったんは久々にWordPressを
-
-
パスワードクラックツール JOHN THE RIPPER 使い方まとめ
パスワードクラッキングツールである「JOHN THE RIPPER」の使い方を備忘録としてまとめてお
-
-
Win7, 64bit環境でのcocos2d-x環境構築まとめ
さて、いままでJavaオンリーでゴリゴリとアプリリリースしてきたわけですが、ゲームを作るとなると、ど
-
-
Android4.4(API19)KitKatでのGraphicalLayout,AdMob問題
Androidの新バージョンKitKatがリリースされてもう結構経つが、いまさら我が開発環境でも導入
-
-
【Android】難読化ツールProguard設定まとめ
Android開発環境の1つであるEclipseでは、標準でAndroidプロジェクトの難読化ツール
-
-
MySQLでの条件付きSUM,COUNT
以前つっかかったMySQLでの条件付きSUM,条件付きCOUNTについて備忘録。。。 通常、条
-
-
【Android】APKのデコンパイルまとめ
AndroidのプロジェクトをパッケージングしたAPKファイルをデコンパイル(Javaのソースコード
-
-
【Node.js】 Cookieの取り扱いまとめ
最近流行りのNode.jsですが、Cookieに関して、いくつかお決まりの取り扱い方があり、
-
-
【Androidエラー】Conversion to Dalvik format failed with error 1
Androidにおいて、アプリケーションを作成し終え、いざパッケージをエクスポートっ!!というところ