跳转至

Android Package Context created without security restrictions

创建的 Android Package Context 没有安全限制

描述

在 Android 中使用带有 CONTEXT_INCLUDE_CODECONTEXT_IGNORE_SECURITYcreatePackageContext 所带来的漏洞可能允许攻击者利用进程间通信(IPC)机制在易受攻击的应用程序上下文中执行任意代码。

在 Android 中,每个应用程序都在沙箱中运行,以防止对资源和系统功能进行未经授权的访问。然而,应用程序可以通过 IPC 机制(如 createPackageContext)相互交互。该方法用于为特定包名创建一个 Context 对象,允许一个应用程序访问另一个应用程序的资源或组件。

通过请求 android.permission.QUERY_ALL_PACKAGES 权限,并使用带有 CONTEXT_INCLUDE_CODECONTEXT_IGNORE_SECURITYcreatePackageContext,应用程序加载所请求包的资源,并在某些情况下为其代码创建一个类加载器。这使得目标包中包含的类能够被加载到当前应用程序的上下文中,而无需进行任何签名验证,也没有对应用程序上下文的任何限制。

CONTEXT_INCLUDE_CODE 标志允许应用程序从目标包中加载类,而 CONTEXT_IGNORE_SECURITY 标志则忽略安全限制。使用这些标志可能会使应用程序面临潜在的安全风险。

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.Method;
import java.util.List;

public final class InsecurePackageContext {

    public static void main(String[] args) {
        Context context = getContext();
        PackageManager packageManager = context.getPackageManager();

        List<PackageInfo> installedPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);

        for (PackageInfo info : installedPackages) {
            String packageName = info.packageName;

            if (packageName.startsWith("co.ostorlab.")) {
                try {
                    Context packageContext = context.createPackageContext(packageName,
                            Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);

                    Class<?> loaderClass = packageContext.getClassLoader().loadClass("co.ostorlab.payload");
                    Method updateMethod = loaderClass.getMethod("Update", Context.class);
                    updateMethod.invoke(null, context);

                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

建议

为了缓解使用带有 CONTEXT_INCLUDE_CODECONTEXT_IGNORE_SECURITY 标志的 createPackageContext 创建不安全包上下文的漏洞,开发人员应:

1- 避免使用 createPackageContext,通过将任何必要的组件直接集成到应用程序中,而不是使用单独的 APK 文件。

2- 如果必须使用 createPackageContext,请避免使用 CONTEXT_INCLUDE_CODECONTEXT_IGNORE_SECURITY 标志,而是使用 CONTEXT_RESTRICTED,这可能会禁用某些特定功能,但能使应用程序在面对第三方应用程序攻击时更具稳健性。

3- 在检查包是否在已安装包的列表中时,避免使用 startsWithendsWith 等不严谨的比较,而是尝试精确匹配包名。

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import java.lang.reflect.Method;
import java.util.List;

public final class InsecurePackageContext {

    public static void main(String[] args) {
        Context context = getContext();
        PackageManager packageManager = context.getPackageManager();

        List<PackageInfo> installedPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);

        for (PackageInfo info : installedPackages) {
            String packageName = info.packageName;

            if (packageName.equals("co.ostorlab.plugins.camera")) {
                try {
                    Context packageContext = context.createPackageContext(packageName,
                            Context.CONTEXT_RESTRICTED);

                    Class<?> loaderClass = packageContext.getClassLoader().loadClass("co.ostorlab.plugins.camera.Main");
                    Method updateMethod = loaderClass.getMethod("Update", Context.class);
                    updateMethod.invoke(null, context);

                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

链接

标准

  • OWASP_MASVS_L1:
    • MSTG_PLATFORM_2
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • CWE_TOP_25:
  • GDPR:
    • ART_5
    • ART_25
    • ART_32
    • ART_35
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • OWASP_MASVS_v2_1:
    • MASVS_CODE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5
  • HIPAA_CONTROLS:
    • SECURITY221
    • SECURITY212
    • SECURITY213