J'ai rencontré un problème étrange sur un Samsung Galaxy Note 2, fonctionnant sous Android 4.3, avec une rom rootée origin-forgetton.
- getenforce retourne "Permissive", donc selinux est Permissive.
- cat /proc/self/status retourne CapBnd/CapEff/CapPrm ffffffffffffffff après su, donc toutes les capacités sont accordées.
- su provient du SuperSU de Chainfire.
Le syndrome est, après su tout exécutable sous /data appelant execve() échoue avec EACCES. MAIS, execve() sous /data est autorisé par un utilisateur normal.
Pour démontrer, toutes les expériences suivantes sont réalisées après su. Compilez le programme suivant dans un binaire lié statiquement, disons 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);
}
Exécuter "execve /system/bin/ls" devrait être équivalent à "ls hello world".
Mais si execve est placé sous n'importe quel sous-répertoire de /data, "execve /system/bin/ls" donne comme résultat "Permission refusée".
-
Si execve est placé dans l'un de /, /system, /cache, /mnt/obb. execve() fonctionne.
-
Remonter /data avec exactement les mêmes options de montage que /cache n'aide pas.
-
La liaison symétrique d'un sous-répertoire de /cache à /data contenant execve fonctionne.
ln -s /cache/test /data/test # /data/test/execve fonctionne
Et à l'inverse, l'execve ne fonctionne pas.
ln -s /cache/test1 /data/test1 # /cache/test1/execve Permission refusée
-
Lier le montage /data à /bind. /bind/execve fonctionne, mais pas /data/execve.
mount -o bind /data /bind
Conclusion : Il y a quelque chose qui empêche tout exécutable sous /data de faire l'appel système execve(). Le mécanisme n'a rien à voir avec les attributs du système de fichiers, et le lien symbolique est déréférencé avant que le mécanisme ne soit appliqué.
Question : Quel mécanisme dans Android pourrait donner ce comportement étrange ?
Référence :