我在Google Play商店中的应用受到“意图重定向”漏洞的影响(请参阅文章https://support.google.com/faqs/answer/9267555)
我在推荐的解决方案上实施了“选项2”,但仍在报告警告。
我尝试了几种不同的方式来验证呼叫活动,但是无论通过哪种检查,都无法通过。
这是他们推荐的解决方案:
// check if the originating Activity is from trusted package
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// extract the nested Intent
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// redirect the nested Intent
startActivity(forward);
}
这是我的代码:
public void onFinish() {
finish();
// check if the originating Activity is from trusted package
if (getCallingActivity() != null &&
getCallingActivity().getPackageName().equals(
PerfectCommon.getAppContext().getPackageName())) {
Intent intent = null;
// extract the nested Intent
intent =
getIntent().getParcelableExtra(BaseActivity.ORIG_ACTIVITY);
if (intent != null){
// redirect the nested Intent
startActivity(intent);
return;
}
}
Intent newIntent;
SplashActivity context = SplashActivity.this;
boolean portrait = PerfectCommon.portraitMode;
ArrayList<Intent> intents = new ArrayList<>();
// Create intent stack for next activities to run, starting w/ last
newIntent = new Intent(context, portrait ? MainActivity.P.class : MainActivity.class);
newIntent.setData(getIntent().getData());
intents.add(newIntent);
startActivities(intents.toArray(new Intent[intents.size()]));
}
};
代码应检查呼叫活动是否是受信任的源,然后使用意图;如果不是,则使用不同的意图。
但是,当我在Google Play商店上发布该应用程序时,它说该代码段中仍然存在该漏洞。
这是遗留代码,到目前为止一直运行良好,因此,我不希望进行较大的更改以克服此问题,而只需要通过任何正在使用的静态检查器即可。
答案 0 :(得分:0)
我也遇到了这个问题,看来混乱是由两个单独的问题结合在一起引起的。首先,由于该方法可为空,因此对方案2的建议实现不完整。其次,如果其余的APK中的任何一个都被视为易受攻击,则他们拒绝整个应用程序更新。
1。
Google继续拒绝我们的应用程序更新,这使我们感到困惑,尽管我们认为我们已经解决了问题。但是,您应该注意拒绝电子邮件中指定的versionCode
,因为他们可能不会拒绝您的最新应用程序版本!
在我们的案例中,我们在生产中使用了较旧的(易受攻击的)应用程序版本(例如versionCode=100
),并且在Beta版中首次尝试解决了该问题(versionCode=150
)(请参阅下面的#2)。当我们发布第二次尝试以解决此问题(versionCode=200
)时,Google仍向我们发送了拒绝电子邮件,但该电子邮件仍特别引用了versionCode 150
,而不是200
。
原因是因为150
版本处于beta轨道,而200
版本则以5%的推出率直接进入了Production(没有取代Beta版本)。因此从技术上讲,150
版本仍然可以在Play商店中供Beta版用户使用,这就是拒绝我们的200
更新的原因。一旦由于150个APK仍然可用而拒绝了该更新,则200个更新也被暂停,我们别无选择,只能制作另一个更新的versionCode。
一旦我们在Beta轨道中停用了150
版本,并将200
应用重新发布到生产环境中,拒绝就消失了,我们确认正在向用户分发新版本。 / p>
2。
单独是第一次尝试(150
)无法解决问题的原因,是因为我们如何实现他们的选择2解决方案。他们的解决方案(您在上面链接了)[1]:
if (getCallingActivity().getPackageName().equals(“known”)) {
,但是他们不认为getCallingActivity()
可为空的事实。因此,在我们的首次尝试中,我们正在使用:
if (getCallingActivity() == null || getCallingActivity().getPackageName().equals(BuildConfig.APPLICATION_ID)
,并且仍然很脆弱,因此为什么我们的150
更新被拒绝。公认的解决方案(在上面的示例中为versionCode 200
)颠倒了这一逻辑:
if (getCallingActivity() != null && getCallingActivity().getPackageName().equals(BuildConfig.APPLICATION_ID))
因此,一旦我们进行了更改 并替换了Beta版中的应用,一切都将被接受。您可以转到Release Management
-> App Releases
在播放控制台中查看所有当前可访问的应用程序versionCodes。每个曲目中每个发布的版本都会在此处列出。