Categoría de OWASP: MASVS-CODE: Calidad de código
Descripción general
public abstract Context createPackageContext (String packageName, int flags)
El método createPackageContext
se usa cuando un desarrollador quiere crear un contexto para otra aplicación en su propia aplicación.
Por ejemplo, si los desarrolladores quieren obtener recursos de una aplicación de terceros o llamar a métodos desde ella, usarán createPackageContext
.
Sin embargo, si una aplicación llama a createPackageContext
con las marcas CONTEXT_IGNORE_SECURITY
y CONTEXT_INCLUDE_CODE
y, luego, llama a getClassLoader()
, es posible que la aplicación sea vulnerable a la ejecución de código por parte de una aplicación maliciosa. Esto puede ocurrir, por
ejemplo, cuando un atacante suplanta la identidad de un nombre de paquete no reclamado (ocupación de paquete) que el desarrollador esperaba que estuviera presente en el dispositivo del usuario.
A continuación, se resumen los criterios que se deben cumplir para que una aplicación sea vulnerable a este tipo de ataque:
App vulnerable:
- Llama a
createPackageContext
conCONTEXT_IGNORE_SECURITY
yCONTEXT_INCLUDE_CODE
. - Llama a
getClassLoader()
en el contexto recuperado.
App maliciosa:
- Puede reclamar el nombre del paquete que la app vulnerable pasa a
createPackageContext
. - Exporta android:appComponentFactory.
Impacto
Cuando una aplicación usa createPackageContext de forma no segura, puede ocurrir que una aplicación maliciosa pueda obtener la ejecución de código arbitraria en el contexto de la aplicación vulnerable.
Mitigaciones
No llames a createPackageContext
con CONTEXT_IGNORE_SECURITY
y CONTEXT_INCLUDE_CODE
, a menos que sea absolutamente necesario.
En los casos en que esto no se pueda evitar, asegúrate de implementar un mecanismo para verificar la identidad del paquete en el que ejecutas createPackageContext
(p.ej., verificando la firma del paquete).
Recursos
- Documentación de createPackageContext
- Entrada de blog de OverSecured sobre la ejecución de código de createPackageContext