缓存混淆密钥的漏洞?Android许可

hun*_*erp 6 security android exploit

每当Android Market Licensing ping服务器返回GRANT_ACCESS pong时,我都会缓存用户的身份验证.

有没有人看到这个策略有任何漏洞?我相信它非常强大,因为我混淆了一把钥匙,而且不混淆的唯一方法就是知道盐.现在,有人可以想象打开apk并寻找盐,但这并不是真正的破解程度,我认为太重要了,不用担心.

如您所见,设备特定信息正被添加到混淆技术中.

// 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 ); 
Run Code Online (Sandbox Code Playgroud)

接下来创建持久化数据:

 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();
   }
Run Code Online (Sandbox Code Playgroud)

然后,我使用另一种方法来检查缓存内容的状态:

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;
  }
} 
Run Code Online (Sandbox Code Playgroud)

最后,我检查isCachedLicens了以下位置中的e LicenseCheckerCallback: @Override dontAllow和@override applicationError.如果isCachedLicense是真的,那么我让用户前进.

此外,完整源代码位于此处.

blu*_*lds 1

一般来说,用盐进行混​​淆是一种较弱的策略。攻击者只需要找出盐,一旦你知道你在寻找什么,这就相当简单,并且可以在不直接访问你的应用程序的情况下完成。一旦(任何人)发现盐,我们所有的安装基础都将受到损害。

最好的选择是,不要使用具有固定密钥的混淆算法,而是使用经过验证的加密库+算法,其密钥对于用户或您所运行的设备来说是唯一的。