2011年12月26日月曜日

Androidアプリケーションのパーミッション改竄を検知するスニペット

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

はじめに



AppNetBlockerというINTERNETパーミッションを消しちゃうアプリが出ました。
そもそもアプリ改竄自体いいのかどうか。まぁ怪しいパーミッション消したいとかいうのも判るけども。
AppNetBlockerに限らず実際にはINTERNETパーミッションどころじゃなくこんなアプリ↓まで既にAndroid Marketでは販売されています。

https://market.android.com/details?id=com.gmail.exathink.appshield

一部でapk改竄は著作権の侵害に当たるといった声もありますねー。しらんけど。
僕はよくわからないんでとりあえずなんとも言えないですけど、

パーミッション改竄されたかどうかは検知しとくかー

という感じです。


実装


どっかのUtilクラスにでもコピペして下さい。

    private static List<String> missingPermissions(Context context, String[] expectations) {
        return missingPermissions(context, new ArrayList<String>(Arrays.asList(expectations)));
    }
    private static List<String> missingPermissions(Context context, List<String> expectations){
        if (context == null || expectations == null) {
            return null;
        }
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo pi = pm.getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
            String[] info = pi.requestedPermissions;
            if (info != null) {
                for (String i : info) {
                    expectations.remove(i);
                }
            }
            return expectations;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

使い方


missingPermissionsにアプリケーションが本来持っているべきパーミッションのリストを渡すと、消えてる奴が返ってきます。
改竄されてなければ空リストが返るはずです。nullの時は多分何かエラーが発生していると思います。知らん。

import android.Manifest.permission;
//〜〜略〜〜
List<String> missing = missingPermissions(this, 
    new String[]{permission.INTERNET, permission.WRITE_EXTERNAL_STORAGE}
);
if(mission != null && !missing.isEmpty()){
    //なんか改竄されてる!
}

こういう風に使えるかもしれないですね



おわりに


Twitterを引き続き注視していきまーす。


1 件のコメント:

  1. 「使い方」のコードの6行目のnullチェックしている変数名が「missing」でなく「mission」になってますね。

    返信削除