J'ai un appareil Sony qui prend en charge treble
et qui est un appareil system-as-root
et A/B
. Il a une ROM user-debug installée dessus, donc son shell adb est rooté.
J'ai désactivé dm-verity
en utilisant adb disable-verity
après avoir exécuté les commandes adb root
et adb remount
.
Comme documenté ici, cet appareil a également des politiques split
à /system/etc/selinux
(la partie 'plat' de la politique) et /vendor/etc/selinux
(la partie 'nonplat' de la politique).
J'essaie d'exécuter test.sh
en utilisant le script d'initialisation suivant :
#/etc/init/m_daemon.rc
# définir le service, utiliser l'exécutable ici si le script n'est pas nécessaire
service m_daemon /system/xbin/test.sh
# ne démarre pas à moins d'être explicitement demandé
disabled
# Utilisez `seclabel u:r:magisk:s0` pour exécuter avec un contexte SELinux non restreint pour éviter les refus avc
# peut également utiliser "u:r:su:s0" sur les compiles userdebug / eng s'il n'y a pas de Magisk.
# C'est nécessaire si SELinux est en vigueur et que le service a besoin d'accéder
# à certaines ressources système non autorisées par défaut dans sepolicy
# seclabel u:object_r:qlogd_exec:s0
seclabel u:r:su:s0
# démarrer le service lorsque le démarrage est terminé
on property:sys.boot_completed=1
# Utilisez-le pour démarrer le service
start m_daemon
Le fichier /system/xbin/test.sh
a le contenu suivant :
#!/system/bin/sh
echo `date` > /sdcard/test
Lorsque l'appareil redémarre, il échoue à s'exécuter avec l'erreur suivante :
202.932913 / 11-26 20:21:04.074 audit : type=1400 audit(1574763664.074:213) : avc : refusé { transition } pour pid=8534 comm="init" path="/system/xbin/test.sh" dev="sda24" ino=8150 scontext=u:r:init:s0 tcontext=u:r:su:s0 tclass=process permissif=0
202.933268 / 11-26 20:21:04.074 init: impossible d'exécuter('/system/xbin/test.sh') : Permission refusée
Pour résoudre ce problème, j'ai utilisé sepolicy-inject
et exécuté les commandes suivantes :
sepolicy-inject -s init -t su -c process -p transition -P /sys/fs/selinux/policy -l
sepolicy-inject -s init -t su -c process -p noatsecure -P /sys/fs/selinux/policy -l
sepolicy-inject -s init -t su -c process -p rlimitinh -P /sys/fs/selinux/policy -l
sepolicy-inject -s init -t su -c process -p siginh -P /sys/fs/selinux/policy -l
mais cela doit être exécuté à nouveau après le redémarrage.
Donc, j'ai essayé de patcher precompiled_sepolicy
en utilisant les commandes suivantes :
sepolicy-inject -s init -t su -c process -p transition -P /vendor/etc/selinux/precompiled_sepolicy -l
sepolicy-inject -s init -t su -c process -p noatsecure -P /vendor/etc/selinux/precompiled_sepolicy -l
sepolicy-inject -s init -t su -c process -p rlimitinh -P /vendor/etc/selinux/precompiled_sepolicy -l
sepolicy-inject -s init -t su -c process -p siginh -P /vendor/etc/selinux/precompiled_sepolicy -l
mais les politiques ne sont pas injectées : ni en direct, ni après le redémarrage.
Pour tester, je vérifie juste la date dans le fichier /sdcard/test
.
Alors, je veux juste savoir :
- Pourquoi le patching de
precompiled_sepolicy
n'a pas fonctionné ? - Où injecter les politiques requises en utilisant un shell adb rooté qui devraient persister après un redémarrage ?