2012-07-12 8 views
9

Mi aplicación define un permiso con android: protectionLevel = "signature".Cómo evitar que otras aplicaciones definan el mismo nombre de permiso

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="signature" /> 

Mi intención es crear módulos de aplicaciones que solo se puedan iniciar con mi aplicación firmada. Estos módulos de aplicaciones tienen Android: permiso en sus actividades. Esto funciona bien. pero ... Una aplicación de terceros puede utilizar el mismo nombre de permiso y cambiado el nivel de protección a la normalidad, como este

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="normal" /> 

Si mi aplicación se instala por primera vez, puedo evitar que otros aplicaciones para anular el permiso. Sin embargo, si uno desinstala mi aplicación y luego instala su aplicación, redefine el permiso.

¿Es posible evitar que otras aplicaciones usen el mismo nombre de permiso, por ejemplo, otorgar al permiso un id único como paquete de aplicación?

Aunque el Manifiesto está encriptado, cualquiera puede leer el nombre del permiso en log cat cuando intenta iniciar la actividad que requiere este permiso (se emite una excepción con el nombre de permiso requerido).

+0

buena pregunta, supongo que no tiene manera de limitar otras aplicaciones de hacer esto. – FoamyGuy

+0

Este es un problema de seguridad. No puedo garantizar que mis módulos de aplicaciones firmadas se inicien solo con mi aplicación central firmada, ya que una aplicación sin firma puede reemplazar mi permiso para definir una protección de bajo nivel y luego usar mis módulos firmados. – Dennix

+0

Puede configurar una prueba creando una versión modificada de su aplicación con diferentes nombres de paquete, firma y protectionLevel = normal. Vea qué sucede cuando ambas aplicaciones están en el mismo dispositivo. Supongo que a) el control de firma comenzará primero y se asegurará de que la aplicación deshonesta no tenga acceso a su aplicación que requiera la firma correcta. Y b) que cadenas de permisos idénticas con diferentes niveles de protecciónLevel pueden coexistir en el mismo dispositivo. – tiguchi

Respuesta

5

No hay aplicación, solo convención. Al igual que el resto del mundo de Java, confía en la infraestructura de registro de nombres de dominio. La idea es que usted prefija su nombre de permiso con su nombre de dominio público de Internet (por ejemplo, com.myawesomecompany.myapp.MYPERMISSION) de su propiedad.

La comunidad de registradores impone el carácter único de los nombres de dominio, por supuesto.

Sí, el sistema está abierto para el abuso.

EDITAR: si está asegurando un canal basado en la difusión, puede agregar un control de firma bidireccional si así lo desea. Llame a Context.sendBroadcast() con el nombre del permiso como un segundo parámetro.

EDIT2: Creo que estás pensando demasiado al cerrar los ojos ante la imagen de seguridad de la aplicación Android más grande. Lo cual no es impresionante. Abusar de la infraestructura de privilegios no es como se piratea una aplicación de Android. Si me dispongo a interceptar tus intenciones, no armaré un receptor de intención falsa (actividad, servicio). En cambio, me conectaría con un depurador al receptor original en tu aplicación, firma y todo.

Con herramientas disponibles públicamente, lleva unos minutos armar un proyecto de Eclipse para una APK determinada. Póngalo en Eclipse, conéctese a un proceso en ejecución, establezca puntos de interrupción en las API del sistema pertinentes (Android es de código abierto, recuerde), voila. Con un poco de esfuerzo adicional, puede obtener las fuentes de Java descompiladas para un archivo APK y depurar en términos de SUS métodos, a diferencia de los del sistema.

+0

aunque uso mi nombre de dominio público de internet para prefijar mi permiso, no evita que otra aplicación use el mismo prefijo. Creo que Android debe vincular el nombre del permiso con el nombre del paquete de la aplicación. – Dennix

+0

Como dije, está abierto para abuso deliberado. –

+0

Creo que Android debe vincular el nombre del permiso con el nombre del paquete de la aplicación. Por lo tanto, dos aplicaciones diferentes no tendrán la misma definición de permiso. – Dennix

0

Si desea evitar que otras aplicaciones cambien su nivel de permiso, puede usar permisos predefinidos del sistema que tengan nivel de "firma". Ninguna otra aplicación regular puede definir permisos antes del sistema.

Usar el permiso del sistema para proteger su recurso no significa que su aplicación deba firmar con la clave de la plataforma.

ejemplo:

<service 
     android:name="xxx.xxx.xxx.exservice" 
     android:permission="android.permission.BROADCAST_PACKAGE_REMOVED" > 

El único problema es AppStore mostraría el que el permiso se utiliza si está por debajo de código se muestra en el manifiesto de aplicación.xml

<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" /> 

En este ejemplo, se puede acceder a recursos mediante la misma clave señal, pero definitivamente no se puede transmitir el paquete de eliminación.

Cuestiones relacionadas