En Android 9.0, debido a la adopción del mecanismo de seguridad SEAndroid/SElinux, incluso si tiene permisos de raíz o establece los permisos en 777 para un nodo del kernel, aún no puede acceder a él en la capa JNI.
Este artículo tomará el nodo kernel definido por el usuario /dev/ wf_bt como ejemplo para enseñar a los lectores cómo obtener acceso a este nodo en la capa JNI.
1. Encuentra el nombre del proceso
Encuentre el proceso (proceso) que necesita acceder al nodo del kernel. El proceso system_server accede al propio nodo del autor.
2. Modificar file_contexts.te
Abra el archivo dispositivo\mediatek\xxx[chip]\sepolicy\basic\ file_contexts.te o file_contexts
Siguiendo la escritura en este archivo, defina el nombre que desea para su nodo:
- dev/tegra.* u:objeto_r:video_dispositivo:s0
- /dev/tf_driver u:objeto_r:tee_device:s0
- /dev/tty u:object_r:owntty_device:s0
- /dev/tty[0-9]* u:objeto_r:dispositivo_tty:s0
- # Agregamos aquí
- /dev/wf_bt u:objeto_r:wf_bt_dispositivo:s0
wf_bt_device está personalizado y el contenido de los lados izquierdo y derecho es coherente con el ejemplo anterior.
3. Modificar dispositivo.te
Abra el archivo \device\mediatek\xxx[chip]\sepolicy\basic\ device.te
Siguiendo el método de escritura en este archivo, declare el wf_bt_device recién escrito en el segundo paso como dev_type:
- # tipos de dispositivos
- tipo de dispositivo, dev_type, fs_type;
- escriba alarm_device, dev_type, mlstrustedobject;
- escriba adb_device, dev_type;
- escriba ashmem_device, dev_type, mlstrustedobject;
- escriba dispositivo_audio, tipo_dispositivo;
- escriba binder_device, dev_type, mlstrustedobject;
- escriba block_device, dev_type;
- # Agregamos aquí
- escriba wf_bt_device, dev_type;
Cuarto, modifique el archivo del proceso.
Muchos archivos .te en el directorio AndroidL/android/external/sepolicy/ terminan con el nombre del proceso , como surfaceflinger para el proceso de surfaceflinger, vold.te para el proceso de vold,
Solo desde el primer paso, el proceso system_server accede a este nodo, por lo que buscamos system_server.te y lo abrimos, y agregamos el permiso de lectura y escritura para permitir este proceso a /dev/wf_bt,
- # Leer/Escribir en /proc/net/xt_qtaguid/ctrl y /dev/xt_qtaguid.
- permitir system_server qtaguid_proc:file rw_file_perms;
- permitir system_server qtaguid_device:chr_file rw_file_perms;
- # chr_file indica un archivo de dispositivo de caracteres, si es un archivo ordinario, use file y use dir para el directorio
- # rw_file_perms representa permisos de lectura y escritura
- // Permitir que el proceso system_server tenga permisos de lectura y escritura para el dispositivo de caracteres de wf_bt_device;
- //La primera forma de escribir
- permitir system_server wf_bt_device:chr_file rw_file_perms;
- //La segunda forma de escribir
- permitir system_server wf_bt_device:file {abrir escribir leer};