当安卓应用程序部署到Playstore时,出现隐式内部意图漏洞。

3

最近我在应用商店上传了我的安卓apk文件,但被告知下一次上传到Google Play商店将会被拒绝,并需要检查和解决。下面是该消息的截图:

enter image description here

他们还提到了软件包名称。下面是代码:

 @Override
    public void onDestroy() {
        cleanup();
        super.onDestroy();
        Intent intent = new Intent("com.test.dummyapp");
        sendBroadcast(intent);
    }

请帮我解决这个问题。
以下是触发组件的代码:
 IntentFilter restartFilter = new IntentFilter("com.test.dummyapp");
        registerReceiver(restartBroadcastReciver, restartFilter);



private BroadcastReceiver restartBroadcastReciver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          doBindService();
        }
    };

哪个组件应该接收广播“Intent”?该组件是否已注册以侦听该广播,或者这是一个在清单中注册的组件?发布应该被触发的组件的代码和/或清单条目。 - David Wasser
嗨,我添加了代码,请检查。 - prat
请编辑您的问题并添加您从Play商店收到的消息。我不确定它在抱怨什么。 - David Wasser
我已经添加了错误的截图,请检查我的编辑。 - prat
好的,问题在于“隐式意图”。您可以看一下我的答案,它应该会解决这个问题。 - David Wasser
我编辑了我的答案,包括另一种替代方案。 - David Wasser
3个回答

4
当您执行此操作时,您正在广播"隐式Intent"。这是危险的,因为任何应用程序都可以注册以获取此(潜在的信息泄漏),并且任何应用程序也可以广播此Intent(触发您的应用程序)。
Intent intent = new Intent("com.test.dummyapp");
sendBroadcast(intent);

为解决此问题,您可以使用LocalBroadcastManager(已弃用,但仍可用)。使用本地广播可确保其他应用程序无法看到您的广播Intent,并且其他应用程序无法以此方式触发您的应用程序。
请参见https://developer.android.com/reference/androidx/localbroadcastmanager/content/LocalBroadcastManager
作为替代方案,您可以通过设置包名称使Intent明确:
Intent intent = new Intent("com.test.dummyapp");
intent.setPackage("my.package.name");
sendBroadcast(intent);

谷歌建议开发人员使用显式意图 (Explicit Intents) 来访问其内部组件,方法如下:
  1. 使用 Intent.setComponent 显式设置能够处理意图的组件。
  2. 使用 Intent.setClass 或 Intent.setClassName 显式设置目标组件。
  3. 使用 Intent.setPackage 限制该意图可以解析到的组件。
- prat
但是不确定何时使用哪一个。 - prat
2
在您的特定情况下,您不能使用 setClassName()setComponent(),因为您的 BroadcastReceiver 是一个匿名类。您只能使用 setPackage()。但是,这已足以防止广播 Intent 被其他应用程序看到。或者,您需要创建一个实际的扩展 BroadcastReceiver 的类,并使用该类代替您的匿名类,在这种情况下,您可以使用 setClassName() 或设置 setComponent() - David Wasser

0

感谢提供的信息。

我对发布的代码进行了一些更改。如果这样可以,请告诉我。

@Override
public void onDestroy() {
    cleanup();
    super.onDestroy();
    openApp((Context) context,"com.test.dummyapp");
}

public static boolean openApp(Context context, String packageName) {
    PackageManager manager = context.getPackageManager();
    try {
        Intent i = manager.getLaunchIntentForPackage(packageName);
        if (i == null) {
            return false;
        }
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        context.sendBroadcast(i);
        return true;
    } catch (ActivityNotFoundException e) {
        return false;
    }
}

在调用sendBroadcast()时,不能使用启动Intent(用于启动Activity)。 - David Wasser

0

在 onDestroy 中发送广播似乎非常奇怪。我无法想象有什么用途,而且由于 onDestroy 可能会因旋转、屏幕尺寸更改等原因意外调用,所以可能会出现很多问题。

但是如果你必须这样做,使用 new Intent(getPackageName())。他们要找的是像那样硬编码的包名。问题在于,如果你运行 'com.facebook.whateveritscalled' 并且安装了一个自己命名为该名称的恶意软件,你将向其发送意图。如果您在意图中有额外信息,则可能会泄漏给它。


以上是漏洞的代码答案。您能否确认这是否是您所指的getPackageName()函数? - prat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接