En esta sección, se incluyen recomendaciones para garantizar la seguridad de las apps en dispositivos Android.
Revisión del código fuente
La revisión del código fuente puede detectar una amplia variedad de problemas de seguridad, incluidos los que se identifican en este documento. Android recomienda encarecidamente la revisión manual y automática del código fuente.
- Sigue una guía de seguridad integral cuando realices revisiones para garantizar la cobertura. Utiliza estándares internos o externos relevantes para garantizar opiniones coherentes y completas.
- Ejecuta un lint, como el lint de Android Studio, en todo el código de la app con el SDK de Android y corrige los problemas identificados.
- Analiza el código nativo con una herramienta automatizada que pueda detectar problemas de administración de memoria, como desbordamientos de búfer y errores de un byte.
- El sistema de compilación de Android admite muchos de los validadores de LLVM, como AddressSanitizer y UndefinedBehaviorSanitizer, que se pueden usar para el análisis del tiempo de ejecución de problemas relacionados con la memoria. En combinación con el fuzzing, que se admite en Android a través de libFuzzer, los validadores pueden descubrir casos extremos inusuales que requieren una investigación más detallada.
- Un evaluador de seguridad con conocimientos debe revisar el código de mayor riesgo, como la criptografía, el procesamiento de pagos y el procesamiento de PII.
Pruebas automáticas
Las pruebas automatizadas pueden ayudar a detectar una amplia variedad de problemas de seguridad y deben realizarse con regularidad.
- Ejecuta la versión más reciente de CTS con regularidad durante todo el proceso de desarrollo para detectar problemas de forma anticipada y reducir el tiempo de corrección. Android usa CTS como parte de la integración continua en nuestro proceso de compilación automatizado, que se compila varias veces al día.
- Automatiza las pruebas de seguridad de las interfaces, incluidas las pruebas con entradas con el formato incorrecto (pruebas fuzz). El sistema de compilación de Android admite libFuzzer para escribir pruebas de fuzz.
Análisis de vulnerabilidades
El análisis de vulnerabilidades puede ayudar a garantizar que las apps preinstaladas no tengan vulnerabilidades de seguridad conocidas. La detección avanzada puede reducir el tiempo y el costo necesarios para abordar estas vulnerabilidades y evitar riesgos para los usuarios y los dispositivos.
- Escanea todas las apps preinstaladas con una herramienta de análisis de vulnerabilidades de apps reconocida por la industria y aborda las vulnerabilidades detectadas.
Aplicaciones potencialmente dañinas
Es importante asegurarse de que las apps preinstaladas en tu dispositivo no sean aplicaciones potencialmente dañinas (APD). Eres responsable del comportamiento de todas las apps que se incluyen en tus dispositivos. Antes de iniciar el dispositivo, escanea todas las apps cargadas previamente en busca de vulnerabilidades.
Para obtener más información sobre los PHA y cómo Google los combate en Play Store, consulta la documentación para desarrolladores de Google Play Protect.
Instalación y permisos de apps
Los permisos excesivos para las apps preinstaladas pueden crear un riesgo de seguridad. Restringe las apps preinstaladas a los permisos mínimos necesarios y asegúrate de que no tengan acceso a permisos o privilegios innecesarios. Los permisos de la app se describen en AndroidManifest.xml.
- No otorgues permisos ni privilegios innecesarios a las apps preinstaladas. Revisa en detalle las apps con privilegios del sistema, ya que pueden tener permisos muy sensibles.
- Asegúrate de que todos los permisos solicitados sean relevantes y necesarios para la funcionalidad de esa app específica.
- Asegúrate de que haya una divulgación para el usuario para todas las apps preinstaladas que usen el permiso
INSTALL_PACKAGES
. - Asegúrate de que el desarrollador tenga la obligación contractual de no instalar ninguna app como UID 0.
- Evalúa los permisos declarados en el manifiesto de todas las apps que se instalarán a través de la red del desarrollador.
- Asegúrate de que el desarrollador tenga la obligación contractual de analizar todas las URLs de descarga de las apps de actualización automática y de instalación con la API de Navegación segura de Google antes de entregar apps al dispositivo.
Firma de apps
Las firmas de apps desempeñan un papel importante en la seguridad de los dispositivos y se usan para las verificaciones de permisos y las actualizaciones de software. Cuando selecciones una clave para usar en la firma de apps, es importante considerar si una app está disponible solo en un dispositivo o es común en varios dispositivos.
- Asegúrate de que las apps no estén firmadas con una clave que sea de conocimiento público, como la clave de desarrollador de AOSP.
- Asegúrate de que las claves que se usan para firmar apps se administren de manera coherente con las prácticas estándar de la industria para el manejo de claves sensibles, incluido un módulo de seguridad de hardware (HSM) que proporcione acceso limitado y auditable.
- Asegúrate de que las apps no estén firmadas con la clave de plataforma. De esta manera, se le otorga a la app acceso a los permisos de firma de la plataforma, que son muy potentes y solo están destinados a ser utilizados por componentes del sistema operativo. Las apps del sistema deben usar permisos con privilegios.
- Asegúrate de que las apps con el mismo nombre de paquete no estén firmadas con claves diferentes. Esto suele ocurrir cuando se crea una app para diferentes dispositivos, especialmente cuando se usa la clave de plataforma. Si la app no depende del dispositivo, usa la misma clave en todos los dispositivos. Si la app es específica para el dispositivo, crea nombres de paquetes únicos por dispositivo y clave.
Aísla apps y procesos
El modelo de zona de pruebas de Android proporciona seguridad adicional para las apps y los procesos cuando se usa correctamente.
Aísla los procesos raíz
Los procesos raíz son el objetivo más frecuente de los ataques de elevación de privilegios. La reducción de la cantidad de procesos raíz reduce el riesgo de elevación de privilegios.
- Asegúrate de que los dispositivos ejecuten el código mínimo necesario como root. Cuando sea posible, usa un proceso de Android normal en lugar de un proceso de raíz. Si un proceso debe ejecutarse como root en un dispositivo, documenta el proceso en una solicitud de función de AOSP para que se pueda revisar públicamente.
- Siempre que sea posible, el código raíz debe aislarse de los datos no confiables y accederse a él a través de la comunicación entre procesos (IPC). Por ejemplo, reduce la funcionalidad de root a un servicio pequeño al que se puede acceder a través de Binder y expón el servicio con permiso de firma a una app con privilegios bajos o sin ellos para controlar el tráfico de red.
- Los procesos raíz no deben escuchar en un socket de red.
- Los procesos raíz no deben incluir un entorno de ejecución de propósito general, como una VM de Java.
Cómo aislar apps del sistema
En general, las apps preinstaladas no deben ejecutarse con el identificador único (UID) del sistema compartido. Si es necesario que una app use el UID compartido del sistema o de otro servicio con privilegios (p.ej., teléfono), la app no debe exportar ningún servicio, receptor de emisión ni proveedor de contenido al que puedan acceder las apps de terceros que instalen los usuarios.
- Asegúrate de que los dispositivos ejecuten el código mínimo necesario como sistema. Cuando sea posible, usa un proceso de Android con su propio UID en lugar de volver a usar el UID del sistema.
- Siempre que sea posible, el código del sistema debe aislarse de los datos no confiables y exponer el IPC solo a otros procesos confiables.
- Los procesos del sistema no deben escuchar en un socket de red. Este es un requisito de CTS.
Aísla procesos
La zona de pruebas de aplicaciones para Android proporciona a las apps una expectativa de aislamiento de otros procesos del sistema, incluidos los procesos de raíz y los depuradores. A menos que la app y el usuario habiliten específicamente la depuración, ninguna app debe incumplir esa expectativa.
- Asegúrate de que los procesos de raíz no accedan a los datos dentro de carpetas de datos de apps individuales, a menos que se use un método de depuración de Android documentado.
- Asegúrate de que los procesos de raíz no accedan a la memoria de las apps, a menos que uses un método de depuración de Android documentado.
- Asegúrate de que los dispositivos no incluyan ninguna app que acceda a los datos o la memoria de otras apps o procesos.