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是真的,那么我让用户前进.
此外,完整源代码位于此处.
一般来说,用盐进行混淆是一种较弱的策略。攻击者只需要找出盐,一旦你知道你在寻找什么,这就相当简单,并且可以在不直接访问你的应用程序的情况下完成。一旦(任何人)发现盐,我们所有的安装基础都将受到损害。
最好的选择是,不要使用具有固定密钥的混淆算法,而是使用经过验证的加密库+算法,其密钥对于用户或您所运行的设备来说是唯一的。
| 归档时间: |
|
| 查看次数: |
1140 次 |
| 最近记录: |