2011-03-01 9 views
15

Si llamo a la función socket() en métodos JNI C, la aplicación aún fallará con un error de permiso. Y si pongo una línea de permisos de uso en AndroidManifest.xml, el problema está solucionado.¿Cómo se aplica el permiso de Android?

Parece que la comprobación de permiso de Android no está implementada en la máquina virtual Dalvik porque estoy llamando a una función C nativa y todavía se comprueba. Me gustaría saber cómo se realiza la verificación, en el kernel de Android, o la aplicación se rastrea con algo como ptrace para interceptar todas las llamadas al sistema, o de cualquier otra manera. Muchas gracias.

+1

Técnicamente, esto solo se aplica a los sockets de dominio de Internet. Los sockets de dominio de Unix, que utilizan la misma llamada de socket() con una constante diferente, no tienen aplicación de ID de grupo a través de la modificación del núcleo de "red paranoica" de Android. –

Respuesta

18

Las comprobaciones las realiza el kernel de Linux, utilizando membresía de grupo para determinar los derechos de acceso.

Si mira en the zygote fork code en la máquina virtual, puede verlo utilizando setgroups() para establecer las ID de los grupos suplementarios. Si lo persigue un poco en el código del marco de la aplicación, puede ver dónde determina los permisos y los pasa a forkAndSpecialize().

+0

El enlace en la respuesta está roto. Creo que este es el archivo equivalente: https://github.com/android/platform_dalvik/blob/master/vm/native/dalvik_system_Zygote.cpp – CommonsWare

+0

Actualizado con el enlace android.googlesource.com. – fadden

5

El código nativo se ejecuta en el mismo entorno limitado que usan las aplicaciones SDK y, por lo tanto, está sujeto al mismo modelo de seguridad que las aplicaciones SDK.

Ver Download the Android NDK:

Si se escribe el código nativo, sus aplicaciones todavía se empaquetan en un archivo .apk y que todavía se ejecutan dentro de una máquina virtual en el dispositivo. La aplicación de Android fundamental modelo no cambia.

+2

El comentario hace referencia al modelo de la aplicación, no al modelo de seguridad. El código nativo no está virtualizado. – fadden

+1

Si bien las aplicaciones nativas no se ejecutan directamente en la máquina virtual Dalvik, aún se ejecutan dentro del entorno limitado de seguridad heredado de la máquina virtual Dalvik que las inicia; de lo contrario, usted podría deslizar cualquier código malicioso en el dispositivo de alguien y siempre la aplicación SDK pudo ejecutarse, podría generar su carga útil nativa maliciosa. El punto crucial es que el modelo de seguridad todavía se aplica, como lo demostró @ZelluX cuando era necesario agregar los permisos de usos relevantes para el manifiesto. – RivieraKid

+6

Estrictamente hablando, eso es cierto, pero la "caja de arena" es el kernel de Linux, y se aplica por igual a todos los procesos de espacio de usuario que se ejecutan en el dispositivo. Su respuesta implica que el mecanismo de seguridad es un entorno limitado por proceso utilizado para las aplicaciones SDK, que no es el caso. – fadden

Cuestiones relacionadas