7

Android Market Licensing ping サーバーが GRANT_ACCESS pong を返すたびに、ユーザーの認証をキャッシュしています。

この戦略に脆弱性が見られる人はいますか? キーを難読化しているため、非常に強力であると思います。難読化を解除する唯一の方法は、ソルトを知ることです。さて、誰かがapkを開いてsaltを探すことも考えられますが、これは実際には心配するほど重要ではないクラッキングのレベルではありません.

ご覧のとおり、デバイス固有の情報が難読化手法に追加されています。

// Try to use more data here. ANDROID_ID is a single point of attack. 
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
obfuscator = new AESObfuscator(SALT, getPackageName(), deviceId); 
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, obfuscator), BASE64_PUBLIC_KEY ); 

次に、永続化されたデータの作成:

 public void allow() {
   SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0);
   SharedPreferences.Editor editor = settings.edit();
   String uid = UUID.randomUUID().toString();
   if(!settings.contains(ACCESS_KEY)) {
     editor.putString(ACCESS_KEY,uid);       
     editor.commit();
   } 
   if(!settings.contains(OBFU_ACCESS_KEY)) {
     String obfu = obfuscator.obfuscate(uid);
     editor.putString(OBFU_ACCESS_KEY,obfu); 
     editor.commit();
   }

次に、別の方法を使用して、キャッシュされたコンテンツの状態を確認しました。

boolean isCachedLicense() {
  SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0);
  if(settings.contains(ACCESS_KEY) && settings.contains(OBFU_ACCESS_KEY)) {
    String accessKey = settings.getString(ACCESS_KEY, "");
    String obAccessKey = settings.getString(OBFU_ACCESS_KEY, "");
    try {
      if(accessKey.equals(obfuscator.unobfuscate(obAccessKey))) {
              return true;
      } else {
              return false;
      }
    } catch (ValidationException e) {
       e.printStackTrace();
       return false;
    }
  } else {
       return false;
  }
} 

最後に、次の: のisCachedLicens場所に e があるかどうかを確認しました。真の場合、ユーザーに転送させます。LicenseCheckerCallback@Override dontAllow@override applicationErrorisCachedLicense

また、完全なソース コードはこちらにあります

4

1 に答える 1

1

塩による難読化は、一般的に弱い戦略を話している。攻撃者はソルトを理解する必要があります。これは、探しているものがわかれば非常に簡単で、アプリケーションに直接アクセスしなくても実行できます。ソルトが(誰かによって)発見されると、すべてのインストールベースが危険にさらされます。

最善の策は、固定キーで難読化アルゴリズムを使用する代わりに、ユーザーまたは実行しているデバイスのいずれかに固有のキーで実績のある暗号化ライブラリ+アルゴリズムを使用することです。

于 2010-12-11T01:11:18.160 に答える