Técnica de codificación segura: El problema de los permisos personalizados

Publicado el 25 de octubre de 2017
por Pieter De Cremer
ESTUDIO DE CASO

Técnica de codificación segura: El problema de los permisos personalizados

Publicado el 25 de octubre de 2017
por Pieter De Cremer
Ver recurso
Ver recurso

Al desarrollar para móviles, las aplicaciones suelen tener que solicitar algunos permisos al sistema. Pueden necesitar acceso a los contactos del usuario, a la conexión Bluetooth o la capacidad de enviar mensajes SMS. Todos los permisos mencionados anteriormente son permisos de plataforma, definidos por el framework de Android.

Pero hay casos en los que estos no son suficientes y la aplicación necesita definir su propio permiso personalizado. Utilizaré nuestra propia empresa como ejemplo. Secure Code Warrior puede crear una aplicación que guarde algunos datos privados como parte de un perfil, incluyendo el rendimiento del usuario en la plataforma SCW. Y nos gustaría permitir que otra aplicación de formación en seguridad, digamos DevTrainer, utilice estos datos si el usuario le da permiso para hacerlo. Se trata de datos sensibles, el usuario ciertamente no querría que cualquiera los conociera, pero la SCWApp no debería ocultarlos y protegerlos completamente, ya que podrían ser útiles. Por lo tanto, deseamos que el usuario tenga control sobre ella. Aquí es donde entran los permisos personalizados.

La SCWApp crea un permiso personalizado, DevTrainer solicita este permiso y el usuario puede decidir si quiere permitirlo o no. Esta es una práctica común y una buena manera de restringir el acceso a las aplicaciones de la lista blanca.

Lamentablemente, hay algunos comportamientos poco intuitivos en torno a los permisos personalizados que los hacen arriesgados desde el punto de vista de la seguridad. Concretamente, los permisos personalizados pueden ser definidos por cualquier app en cualquier momento, y "el primero gana", y esta estrategia viene con algunas consecuencias.

Para el siguiente escenario, definimos dos perfiles de aplicaciones que hemos introducido anteriormente (todas estas aplicaciones son ficticias a efectos demostrativos):

1. SCWApp: la aplicación que define un permiso personalizado y defiende un componente utilizando este permiso.

2. DevTrainer: esta aplicación define el mismo permiso que SCWApp y declara al usuario que desea tener este permiso.

Este es un escenario común acuñado como el caso de las Peer Apps. Si la aplicación DevTrainer fuera sólo un plugin para la SCWApp no tendría que definir el permiso personalizado. La suposición, en este caso, es que SCWApp se instalaría antes que DevTrainer y no se produciría ningún comportamiento inesperado. Si de alguna manera el usuario instala primero DevTrainer, no se le informa de la solicitud del permiso. Si el usuario instala más tarde SCWApp, no se concede el permiso a DevTrainer de forma retroactiva, por lo que los intentos de la aplicación DevTrainer de utilizar el componente seguro fallarán.

Aquí es donde entra en juego el caso de la aplicación Peers. En algunos casos, no se puede esperar que una aplicación se instale antes que la otra. Digamos que si Facebook y Twitter quieren utilizar los componentes del otro, tienen que definir los permisos personalizados del otro.

Sin embargo, aquí es donde la cosa se complica. Si la aplicación DevTrainer se instala primero, el usuario no es informado de su solicitud de permiso personalizado. En este punto, aunque el usuario no haya sido informado, DevTrainer tiene el permiso personalizado y puede acceder al componente protegido.

La cosa se complica aún más. La aplicación DevTrainer puede cambiar el nivel de protección de los permisos. Android no utiliza el nivel de protección del defensor, sino el nivel de protección que se define primero, lo que significa que la aplicación que se instaló primero puede definirlo. Esto significa que si DevTrainer cambia el nivel de permiso a normal, entonces cualquier aplicación futura que solicite este permiso no tendrá que ser confirmada por el usuario, sino que se le concederá automáticamente el acceso.

Este escenario está inspirado en la explicación de este problema que se encuentra en el github de cwac-security.

La estrategia "el primero gana" tiene algunas consecuencias peligrosas y el desconocimiento de su comportamiento puede llevar al desarrollador a tomar decisiones de seguridad basadas en entradas no fiables y permitir que aplicaciones no deseadas accedan a datos sensibles o servicios protegidos. Para obtener más información sobre cómo evitar las decisiones de seguridad a través de entradas no fiables, visite nuestra plataforma. Este comportamiento se modificó a partir de Android 5.0 (Lollipop). Pero como actualmente, más del 22% de los dispositivos Android siguen ejecutando una versión inferior de Android es importante mitigar los riesgos del comportamiento original en tu aplicación. Comprueba si el permiso ya se ha definido en la primera ejecución de tu app y toma las medidas adecuadas si es el caso para resolver cualquier riesgo de seguridad.

Buena suerte con la codificación y hasta la semana que viene.

Al definir los permisos personalizados, una aplicación puede compartir sus recursos y capacidades con otras aplicaciones.

https://developer.android.com/guide/topics/permissions/defining.html

Ver recurso
Ver recurso

Autor

Pieter De Cremer

¿Quieres más?

Sumérjase en nuestras últimas ideas sobre codificación segura en el blog.

Nuestra amplia biblioteca de recursos tiene como objetivo potenciar el enfoque humano de la mejora de la codificación segura.

Ver blog
¿Quieres más?

Obtenga las últimas investigaciones sobre la seguridad impulsada por los desarrolladores

Nuestra amplia biblioteca de recursos está repleta de recursos útiles, desde libros blancos hasta seminarios web, que le ayudarán a iniciarse en la codificación segura orientada a los desarrolladores. Explórela ahora.

Centro de recursos

Técnica de codificación segura: El problema de los permisos personalizados

Publicado el 25 de octubre de 2017
Por Pieter De Cremer

Al desarrollar para móviles, las aplicaciones suelen tener que solicitar algunos permisos al sistema. Pueden necesitar acceso a los contactos del usuario, a la conexión Bluetooth o la capacidad de enviar mensajes SMS. Todos los permisos mencionados anteriormente son permisos de plataforma, definidos por el framework de Android.

Pero hay casos en los que estos no son suficientes y la aplicación necesita definir su propio permiso personalizado. Utilizaré nuestra propia empresa como ejemplo. Secure Code Warrior puede crear una aplicación que guarde algunos datos privados como parte de un perfil, incluyendo el rendimiento del usuario en la plataforma SCW. Y nos gustaría permitir que otra aplicación de formación en seguridad, digamos DevTrainer, utilice estos datos si el usuario le da permiso para hacerlo. Se trata de datos sensibles, el usuario ciertamente no querría que cualquiera los conociera, pero la SCWApp no debería ocultarlos y protegerlos completamente, ya que podrían ser útiles. Por lo tanto, deseamos que el usuario tenga control sobre ella. Aquí es donde entran los permisos personalizados.

La SCWApp crea un permiso personalizado, DevTrainer solicita este permiso y el usuario puede decidir si quiere permitirlo o no. Esta es una práctica común y una buena manera de restringir el acceso a las aplicaciones de la lista blanca.

Lamentablemente, hay algunos comportamientos poco intuitivos en torno a los permisos personalizados que los hacen arriesgados desde el punto de vista de la seguridad. Concretamente, los permisos personalizados pueden ser definidos por cualquier app en cualquier momento, y "el primero gana", y esta estrategia viene con algunas consecuencias.

Para el siguiente escenario, definimos dos perfiles de aplicaciones que hemos introducido anteriormente (todas estas aplicaciones son ficticias a efectos demostrativos):

1. SCWApp: la aplicación que define un permiso personalizado y defiende un componente utilizando este permiso.

2. DevTrainer: esta aplicación define el mismo permiso que SCWApp y declara al usuario que desea tener este permiso.

Este es un escenario común acuñado como el caso de las Peer Apps. Si la aplicación DevTrainer fuera sólo un plugin para la SCWApp no tendría que definir el permiso personalizado. La suposición, en este caso, es que SCWApp se instalaría antes que DevTrainer y no se produciría ningún comportamiento inesperado. Si de alguna manera el usuario instala primero DevTrainer, no se le informa de la solicitud del permiso. Si el usuario instala más tarde SCWApp, no se concede el permiso a DevTrainer de forma retroactiva, por lo que los intentos de la aplicación DevTrainer de utilizar el componente seguro fallarán.

Aquí es donde entra en juego el caso de la aplicación Peers. En algunos casos, no se puede esperar que una aplicación se instale antes que la otra. Digamos que si Facebook y Twitter quieren utilizar los componentes del otro, tienen que definir los permisos personalizados del otro.

Sin embargo, aquí es donde la cosa se complica. Si la aplicación DevTrainer se instala primero, el usuario no es informado de su solicitud de permiso personalizado. En este punto, aunque el usuario no haya sido informado, DevTrainer tiene el permiso personalizado y puede acceder al componente protegido.

La cosa se complica aún más. La aplicación DevTrainer puede cambiar el nivel de protección de los permisos. Android no utiliza el nivel de protección del defensor, sino el nivel de protección que se define primero, lo que significa que la aplicación que se instaló primero puede definirlo. Esto significa que si DevTrainer cambia el nivel de permiso a normal, entonces cualquier aplicación futura que solicite este permiso no tendrá que ser confirmada por el usuario, sino que se le concederá automáticamente el acceso.

Este escenario está inspirado en la explicación de este problema que se encuentra en el github de cwac-security.

La estrategia "el primero gana" tiene algunas consecuencias peligrosas y el desconocimiento de su comportamiento puede llevar al desarrollador a tomar decisiones de seguridad basadas en entradas no fiables y permitir que aplicaciones no deseadas accedan a datos sensibles o servicios protegidos. Para obtener más información sobre cómo evitar las decisiones de seguridad a través de entradas no fiables, visite nuestra plataforma. Este comportamiento se modificó a partir de Android 5.0 (Lollipop). Pero como actualmente, más del 22% de los dispositivos Android siguen ejecutando una versión inferior de Android es importante mitigar los riesgos del comportamiento original en tu aplicación. Comprueba si el permiso ya se ha definido en la primera ejecución de tu app y toma las medidas adecuadas si es el caso para resolver cualquier riesgo de seguridad.

Buena suerte con la codificación y hasta la semana que viene.

Al definir los permisos personalizados, una aplicación puede compartir sus recursos y capacidades con otras aplicaciones.

https://developer.android.com/guide/topics/permissions/defining.html

Nos gustaría contar con su permiso para enviarle información sobre nuestros productos y/o temas relacionados con la codificación segura. Siempre trataremos sus datos personales con el máximo cuidado y nunca los venderemos a otras empresas con fines de marketing.

Enviar
Para enviar el formulario, habilite las cookies "Analytics". Siéntase libre de desactivarlas de nuevo una vez que haya terminado.