Prácticas recomendadas sobre seguridad de apps

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 pertinentes para garantizar revisiones coherentes y completas.
  • Ejecuta un linter, como el linter 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 "por uno".
  • El sistema de compilación de Android admite muchos de los sanitizadores de LLVM, como AddressSanitizer y UndefinedBehaviorSanitizer, que se pueden usar para el análisis en tiempo de ejecución de problemas relacionados con la memoria. Combinados con el fuzzing, que se admite en Android a través de libFuzzer, los sanitizadores pueden descubrir casos extremos inusuales que requieren una mayor investigación.
  • Un asesor de seguridad con conocimientos debe revisar el código de mayor riesgo, como el procesamiento de criptografía, pagos y 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 del CTS con regularidad durante todo el proceso de desarrollo para detectar problemas de forma anticipada y reducir el tiempo de corrección. Android usa el CTS como parte de la integración continua en nuestro proceso de compilación automatizado, que se ejecuta varias veces al día.
  • Automatiza las pruebas de seguridad de las interfaces, incluidas las pruebas con entradas con formato incorrecto (pruebas de fuzzing). El sistema de compilación de Android admite libFuzzer para escribir pruebas de fuzzing.

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.

  • Analiza todas las apps preinstaladas con una herramienta de análisis de vulnerabilidades de apps reconocida en 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 del lanzamiento del dispositivo, analiza todas las apps precargadas en busca de vulnerabilidades.

Para obtener más información sobre las APD y cómo Google las combate en Play Store, consulta la documentación para desarrolladores de Google Play Protect.

Instalación y permisos de la app

Los permisos excesivos para las apps preinstaladas pueden generar 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 minuciosamente las apps con privilegios del sistema, ya que pueden tener permisos muy sensibles.
  • Asegúrate de que todos los permisos solicitados sean pertinentes y necesarios para la funcionalidad de esa app específica.
  • Asegúrate de que se proporcione la divulgación al 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 esté obligado contractualmente a analizar todas las URLs de descarga de las apps de instaladores y actualizadores automáticos con la API de Navegación Segura de Google antes de publicar las apps en el dispositivo.

Firma de apps

Las firmas de apps desempeñan un papel importante en la seguridad del dispositivo y se usan para las verificaciones de permisos y las actualizaciones de software. Cuando selecciones una clave para firmar apps, es importante tener en cuenta si una app está disponible solo en un dispositivo o en varios.

  • Asegúrate de que las apps no estén firmadas con una clave conocida públicamente, como la clave de desarrollador de AOSP.
  • Asegúrate de que las claves que se usan para firmar apps se administren de una 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 la plataforma. Si lo haces, la app tendrá acceso a permisos de firma de la plataforma, que son muy potentes y solo se deben usar en 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, en especial cuando se usa la clave de la plataforma. Si la app es independiente del dispositivo, usa la misma clave en todos los dispositivos. Si la app es específica para un dispositivo, crea nombres de paquetes únicos por dispositivo y clave.

Aislamiento de apps y procesos

El modelo de zona de pruebas de Android proporciona seguridad adicional en torno a 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, por lo que reducir la cantidad de procesos raíz disminuye el riesgo de elevación de privilegios.

  • Asegúrate de que los dispositivos ejecuten el código mínimo necesario como administrador. Cuando sea posible, usa un proceso de Android normal en lugar de un proceso raíz. Si un proceso debe ejecutarse como administrador en un dispositivo, documéntalo en una solicitud de función de AOSP para que se pueda revisar públicamente.
  • Cuando 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 raíz a un servicio pequeño accesible a través de Binder y expón el servicio con permiso de firma a una app con pocos o ningún privilegio 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 tiempo de ejecución de uso general, como una VM de Java.

Aislamiento de apps del sistema

En general, las apps precargadas no deben ejecutarse con el identificador único (UID) del sistema compartido. Si una app necesita usar el UID compartido del sistema o de otro servicio privilegiado (p.ej., el teléfono), no debe exportar ningún servicio, receptor de transmisiones ni proveedor de contenido al que puedan acceder las apps de terceros instaladas por 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 reutilizar el UID del sistema.
  • En la medida de lo posible, el código del sistema debe aislarse de los datos no confiables y exponer la comunicación entre procesos solo a otros procesos confiables.
  • Los procesos del sistema no deben escuchar en un socket de red. Este es un requisito del CTS.

Aísla los procesos

La zona de pruebas de aplicaciones para Android proporciona a las apps la expectativa de aislamiento de otros procesos en el sistema, incluidos los procesos 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 raíz no accedan a los datos dentro de las 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 raíz no accedan a la memoria de las apps, a menos que se use 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.