He conocido a un extraño problema en un Samsung Galaxy Note 2, con Android 4.3, con un origen de forgetton rooteado rom.
- getenforce devuelve "Permisivo", por lo que selinux Permisivo.
- cat /proc/self/estado devuelve CapBnd/CapEff/CapPrm ffffffffffffffff después de la ub, así que todas las prestaciones que se otorgan.
- su es de chainfire del SuperSU.
El síndrome de down es, después de la ub cualquier ejecutable en /datos de llamada execve() falla con EACCES. PERO, execve() en /de datos es permitido por un usuario normal.
Para demostrar, todos los siguientes experimentos se llevan a cabo después de la ub. Compilar el siguiente programa en una estática vinculado binario, decir execve.
# gcc -static execve.c -o execve
/* execve.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
char *newargv[] = { NULL, "hello", "world", NULL };
char *newenviron[] = { NULL };
if (argc != 2) {
fprintf(stderr, "Usage: %s <file-to-exec>\n", argv[0]);
exit(EXIT_FAILURE);
}
newargv[0] = argv[1];
execve(argv[1], newargv, newenviron);
perror("execve"); /* execve() only returns on error */
exit(EXIT_FAILURE);
}
La ejecución de "execve /system/bin/ls" debe ser equivalente a "ls hola mundo".
Pero si execve se pone bajo cualquier subdirectorio de /data, "execve /system/bin/ls", "Permiso Denegado".
- Si execve es puesto en cualquiera de /, /system, /cache, /mnt/obb. execve() funciona.
- Volver a montar /data con exactamente las mismas opciones de montaje como /cache no ayuda.
-
Crear enlace simbólico para un subdirectorio de /cache /datos que contiene execve obras.
ln -s /cache/test /datos/prueba # /datos/test/execve obras
Y a la inversa, execve no funciona.
ln -s /cache/prueba1 /datos/prueba1 # /cache/prueba1/execve Permiso Denegado
-
Se unen mount /data /bind. /bind/execve obras, pero en /data/execve no.
mount-o bind /datos /bind
Conclusión: Hay soming la prevención de los ejecutables en /datos a partir de hacer execve() syscall. El mecanismo no tiene nada que ver con el sistema de ficheros atributos, y un enlace simbólico se eliminan las referencias antes de que el mecanismo se aplica.
Pregunta: ¿Qué mecanismo en Android podría dar a este extraño comportamiento?
Referencia: