2 votos

¿Por qué se deniega el permiso de lectura a /proc/1/maps y por qué no aparece la denegación en logcat?

Estoy desarrollando una aplicación nativa para Android, y de vez en cuando me encuentro con un permiso denegado que no desencadena un registro en los registros de logcat. Por ejemplo, al intentar ejecutar:

shell@kltevzw:/ $ cat /proc/<some-not-shell-pid>/maps
/system/bin/sh: cat: /proc/<some-not-shell-pid>/maps: Permission denied

desde el prompt del adb shell resulta en un mensaje de permiso denegado enviado a stderr, pero no aparece nada en el logcat. Tampoco es un problema de permisos unix, ya que cualquiera debería poder leer el archivo. Por ejemplo:

shell@kltevzw:/ $ ls -lZ /proc/1/maps
-r--r--r-- root     root              u:r:init:s0 maps

También ocurre en otras situaciones en las que tengo menos control del entorno. ¿Es posible que esto sea causado por algunas reglas de dontaudit en la política? He ejecutado sesearch --dontaudit /sepolicy pero no he encontrado ninguna regla relevante. ¿Alguien sabe por qué algunas denegaciones se envían al registro y otras no, y cómo depurar estos casos?

Gracias.

8voto

Jack Wade Puntos 231

RAZÓN 1:

Además de los tradicionales Control de acceso discrecional (DAC), - que hace uso de *NIX propietario/grupo/modo de los procesos/archivos para permitir/denegar el acceso - Android implementa varios otros mecanismos de control de acceso del kernel de Linux para hacerse más seguro, tales como El filtro Seccomp se implementó en Oreo .

RAZÓN 2:

Mientras que el DAC es allowed by-default , SELinux (a Control de acceso obligatorio ) trabaja en denied by-default modo. Cualquier intento de acceso que no esté explícitamente permitido en una regla de Política SE será denegado. Utilizando lo mismo, el acceso a /proc fs se ha endurecido en Android O, que no dejará leer a un proceso/usuario sin privilegios -por ejemplo-. /proc/stat y /proc/filesystem . Lo mismo te restringe la lectura /proc/1 cuando se ejecuta como un usuario no root de su aplicación.

Si SELinux en su dispositivo no es Enforcing , deberías ser capaz de leer /proc/1 pero hay otras restricciones de seguridad que, a diferencia de DAC y MAC, son específicas de /proc pseudo sistema de archivos.

RAZÓN 3:

Montajes por defecto de Android /proc con hidepid=2,gid=3009 lo que significa que un usuario sin privilegios sólo podrá ver sus propios procesos (que se ejecutan con el mismo UID). Así que su aplicación no podrá ver el directorio /proc/1 . La única excepción son los procesos que son miembros del grupo AID_READPROC (GID 3009).

RAZÓN 4:

Pero aún así, si se (re)monta /proc sin opción hidepid no podrá leer /proc/1/maps porque el kernel de Linux sólo permite procesos con capacidad SYS_PTRACE para leer los detalles de actualmente regiones de memoria mapeadas .

Un ejemplo de proceso no root que funciona en Android es incidented que se ejecuta con CAP_SYS_PTRACE así como un miembro del grupo READPROC . También la regla de la Política SE como la siguiente debe ser definida para permitir el acceso:

allow incidentd init : file { read getattr open }

REGISTRO:

En cuanto al registro de las denegaciones de permisos, logcatd es un demonio de registro específico de Android que necesariamente registra eventos desde el marco nativo de Android y Java (como permiso manifiesto denials), pero opcionalmente incluye eventos del kernel (que también podemos ver usando la herramienta nativa de línea de comandos dmesg ). Las denegaciones de SELinux también se registran en el registro del kernel:

$ ls /proc/1
ls: cannot access '/proc/1': Permission denied

# dmesg | grep avc
[37914.650314] type=1400 audit(1548757064.171:33323): avc: denied { getattr } for pid=28576 comm="ls" path="/proc/1" dev="proc" ino=803674 scontext=u:r:untrusted_app_27:s0:c512,c768 tcontext=u:r:init:s0 tclass=dir permissive=0

# logcat | grep avc
01-29 14:17:44.171 28576 28576 W ls      : type=1400 audit(0.0:33323): avc: denied { getattr } for path="/proc/1" dev="proc" ino=803674 scontext=u:r:untrusted_app_27:s0:c512,c768 tcontext=u:r:init:s0 tclass=dir permissive=0

Sin embargo, el kernel de Linux puede o no registrar todas sus denegaciones de permiso internas, dependiendo de múltiples construcciones y tiempos de ejecución configuraciones incluyendo printk loglevel , DYNAMIC_DEBUG y/u otros de los que no estoy seguro. Por lo tanto, estos mensajes pueden no aparecer en los registros.

PS:

Otra razón de no poder acceder a un determinado PID en procfs es PID namespace que no es relevante en Android hasta ahora, pero muy común para los mecanismos de aislamiento como contenedores . En un nuevo espacio de nombres PID, cualquier proceso del espacio de nombres padre no es visible y un proceso podría tener el mismo PID (incluyendo PID 1; init) que el de algún otro proceso en algún otro espacio de nombres PID.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X