Estoy trabajando en una aplicación que necesita acceso Root y tengo un dispositivo que está rooteado pero no con Magisk. Este dispositivo sólo tiene adb shell
Root disponible. Por lo tanto, necesito una alternativa para llamar a la funcionalidad requerida sin el uso de Magisk u otras herramientas. Lo hice colocando mi ejecutable dentro del directorio del sistema y ejecutándolo como un demonio. Este demonio requiere acceso en alguna ubicación que está restringida por las políticas de SELinux.
He inyectado la política requerida con los siguientes comandos:
sepolicy-inject -s init -t su -c process -p transition -l
sepolicy-inject -s su -t system_file -c file -p entrypoint -l
sepolicy-inject -s init -t su -c process -p rlimitinh -l
sepolicy-inject -s init -t su -c process -p siginh -l
sepolicy-inject -s su -t shell_exec -c file -p read -l
sepolicy-inject -s su -t shell_exec -c file -p execute -l
sepolicy-inject -s su -t shell_exec -c file -p getattr -l
sepolicy-inject -s su -t vendor_toolbox_exec -c file -p execute_no_trans -l
sepolicy-inject -s init -t su -c process -p noatsecure -l
sepolicy-inject -s su -t toolbox_exec -c file -p getattr -l
sepolicy-inject -s su -t toolbox_exec -c file -p execute -l
sepolicy-inject -s su -t system_file -c file -p execute_no_trans -l
sepolicy-inject -s su -t storage_file -c dir -p search -l
sepolicy-inject -s su -t storage_file -c lnk_file -p read -l
sepolicy-inject -s su -t tmpfs -c dir -p search -l
sepolicy-inject -s su -t mnt_user_file -c dir -p search -l
sepolicy-inject -s su -t mnt_user_file -c lnk_file -p read -l
sepolicy-inject -s su -t sdcardfs -c dir -p search -l
sepolicy-inject -s su -t sdcardfs -c file -p append -l
sepolicy-inject -s su -t toolbox_exec -c file -p read -l
sepolicy-inject -s su -t toolbox_exec -c file -p open -l
sepolicy-inject -s su -t sdcardfs -c file -p read -l
sepolicy-inject -s su -t sdcardfs -c file -p write -l
sepolicy-inject -s su -t sdcardfs -c file -p open -l
sepolicy-inject -s su -t media_rw_data_file -c file -p read -l
sepolicy-inject -s su -t media_rw_data_file -c file -p write -l
sepolicy-inject -s su -t media_rw_data_file -c file -p open -l
sepolicy-inject -s su -t media_rw_data_file -c file -p append -l
El problema es que no son persistentes después de reiniciar. Sé que puedo extraer boot.img y ramdisk, reemplazar /sepolicy con el nuevo archivo de políticas copiado de /sys/fs/selinux/policy, volver a empaquetar boot.img y flashear de nuevo.
Quiero hacerlo sin reflashear boot.img
. ¿Hay alguna manera de ejecutar los comandos anteriores después de que Android termine de generar los archivos de SELinux?
He probado los siguientes archivos rc:
#/etc/init/custom.rc
# define service, use executable here if script not needed
service custom /system/bin/custom.sh
# don't start unless explicitly asked to
disabled
# Use `seclabel u:r:magisk:s0` to run with unrestricted SELinux context to avoid avc denials
# can also use "u:r:su:s0" on userdebug / eng builds if no Magisk
# it's required if SELinux is enforcing and service needs access
# to some system resources not allowed by default sepolicy
seclabel u:r:su:s0
# start the service when boot is completed
on property:sys.boot_completed=1
sepolicy-inject -s init -t su -c process -p transition -l
sepolicy-inject -s su -t system_file -c file -p entrypoint -l
sepolicy-inject -s init -t su -c process -p rlimitinh -l
sepolicy-inject -s init -t su -c process -p siginh -l
sepolicy-inject -s su -t shell_exec -c file -p read -l
sepolicy-inject -s su -t shell_exec -c file -p execute -l
sepolicy-inject -s su -t shell_exec -c file -p getattr -l
sepolicy-inject -s su -t vendor_toolbox_exec -c file -p execute_no_trans -l
sepolicy-inject -s init -t su -c process -p noatsecure -l
sepolicy-inject -s su -t toolbox_exec -c file -p getattr -l
sepolicy-inject -s su -t toolbox_exec -c file -p execute -l
sepolicy-inject -s su -t system_file -c file -p execute_no_trans -l
sepolicy-inject -s su -t storage_file -c dir -p search -l
sepolicy-inject -s su -t storage_file -c lnk_file -p read -l
sepolicy-inject -s su -t tmpfs -c dir -p search -l
sepolicy-inject -s su -t mnt_user_file -c dir -p search -l
sepolicy-inject -s su -t mnt_user_file -c lnk_file -p read -l
sepolicy-inject -s su -t sdcardfs -c dir -p search -l
sepolicy-inject -s su -t sdcardfs -c file -p append -l
sepolicy-inject -s su -t toolbox_exec -c file -p read -l
sepolicy-inject -s su -t toolbox_exec -c file -p open -l
sepolicy-inject -s su -t sdcardfs -c file -p read -l
sepolicy-inject -s su -t sdcardfs -c file -p write -l
sepolicy-inject -s su -t sdcardfs -c file -p open -l
sepolicy-inject -s su -t media_rw_data_file -c file -p read -l
sepolicy-inject -s su -t media_rw_data_file -c file -p write -l
sepolicy-inject -s su -t media_rw_data_file -c file -p open -l
sepolicy-inject -s su -t media_rw_data_file -c file -p append -l
start custom
pero no funciona porque creo que Android genera archivos SELinux después de que mi servicio personalizado se haya activado.
También he probado los comandos anteriores en onrestart
opción de servicio init pero falló.
¿Alguna sugerencia?
0 votos
El tiempo es su único problema yo sugeriría comando de sueño
0 votos
He intentado añadir 5 minutos de sueño con
sleep 300
después deon property:sys.boot_completed=1
pero el servicio se inicia instantáneamente en el arranque completo por lo que este comando no está funcionando como se esperaba.