Saltar a contenido

Android Package Context created without security restrictions

Android Package Context creado sin restricciones de seguridad

Descripción

La vulnerabilidad asociada con el uso de createPackageContext con CONTEXT_INCLUDE_CODE y CONTEXT_IGNORE_SECURITY en Android puede permitir a un atacante ejecutar código arbitrario en el contexto de la aplicación vulnerable al explotar el mecanismo de comunicación entre procesos (IPC).

En Android, cada aplicación está aislada (sandboxing) para evitar el acceso no autorizado a los recursos y la funcionalidad del sistema. Sin embargo, las aplicaciones pueden interactuar entre sí a través de mecanismos IPC como createPackageContext. Este método se utiliza para crear un objeto Context para el nombre de un paquete específico, lo que permite a una aplicación acceder a los recursos o componentes de otra aplicación.

Al solicitar el permiso android.permission.QUERY_ALL_PACKAGES y usar createPackageContext con CONTEXT_INCLUDE_CODE y CONTEXT_IGNORE_SECURITY, la aplicación carga los recursos del paquete solicitado y, en algunos casos, también crea un cargador de clases (class loader) para su código, permitiendo que las clases contenidas en el paquete de destino se carguen en el contexto de la aplicación actual sin ninguna verificación de firma ni restricciones sobre el contexto de la aplicación.

El flag CONTEXT_INCLUDE_CODE permite a la aplicación cargar clases desde el paquete de destino, mientras que el flag CONTEXT_IGNORE_SECURITY ignora las restricciones de seguridad. El uso de estos flags puede exponer la aplicación a posibles riesgos de seguridad.

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);
                }
            }
        }
    }
}

Recomendación

Para mitigar la vulnerabilidad asociada con la creación insegura del contexto del paquete usando createPackageContext con los flags CONTEXT_INCLUDE_CODE y CONTEXT_IGNORE_SECURITY, los desarrolladores deben:

1- Evitar el uso de createPackageContext incorporando los componentes necesarios en la propia aplicación en lugar de utilizar archivos APK separados.

2- Si el uso de createPackageContext es necesario, evitar el uso de los flags CONTEXT_INCLUDE_CODE y CONTEXT_IGNORE_SECURITY; en su lugar, usar CONTEXT_RESTRICTED, lo cual puede desactivar características específicas pero hace que la aplicación sea más robusta contra ataques de aplicaciones de terceros.

3- Al verificar si el paquete está en la lista de paquetes instalados, evitar las comparaciones poco precisas como startsWith o endsWith; en su lugar, intente que el nombre del paquete coincida exactamente.

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);
                }
            }
        }
    }
}

Enlaces

Estándares

  • 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