Google为什么说我的代码仍然存在意图漏洞?

时间:2019-08-07 15:55:51

标签: java android-security

我在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商店上发布该应用程序时,它说该代码段中仍然存在该漏洞。

这是遗留代码,到目前为止一直运行良好,因此,我不希望进行较大的更改以克服此问题,而只需要通过任何正在使用的静态检查器即可。

1 个答案:

答案 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。每个曲目中每个发布的版本都会在此处列出。