システムアプリを追加したらSELinuxにブロックされて動かない…
SELinuxをEnforcingのまま使う方法を調べてみた。
SELinuxが有効だと導入したOpenGappsが動かないことがある
YotaPhone2でシステムアプリを手動で追加するとエラーが出て動かない。。。
[ 613.402829] type=1400 audit(65841161.489:119): avc: denied { search } for pid=6559 comm="lowpool[4]" name="GoogleHome" dev="mmcblk0p12" ino=8233 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=dir permissive=0
[ 613.515156] type=1400 audit(65841161.599:120): avc: denied { search } for pid=6559 comm="lowpool[4]" name="Velvet" dev="mmcblk0p12" ino=8235 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=dir permissive=0
[ 613.774596] type=1400 audit(65841161.859:132): avc: denied { search } for pid=6559 comm="lowpool[4]" name="GoogleJapaneseInput" dev="mmcblk0p12" ino=16385 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:unlabeled:s0 tclass=dir permissive=0
SELinuxの状態を確認
shell@yotaphone2:/ $ getenforce
Enforcing
root化してSELinuxのモードをPermissiveに変更することで簡単に回避することができます
$ su
# setenforce 0
…が、root化・SELinuxのモードを変更していると動かないアプリがあるようです。(Pokemon GOとか?)root化・SELinuxをPermissiveにせずシステムアプリを書き換えたい!!
chconコマンドでSELinuxコンテンツタイプの変更
現在のSELinuxコンテンツタイプはlsコマンドのZオプションで確認できます。
$ ls -Z /system/app/
コンテンツタイプを「u:object_r:unlabeled:s0」→「u:object_r:system_file:s0」に変更する。- 一旦root化してchconする方法(めんどくさい) 一度SuperSUをインストールしてコンテンツタイプを変えた後unroot
- TWRPからchconする方法(簡単) Systemをマウント後、
$ su
# mount -o rw,remount /system
# chcon -R u:object_r:system_file:s0 /system/app/GoogleJapaneseInput
# chcon -R -h u:object_r:system_file:s0 /system/app/GoogleJapaneseInput
sepolicy-injectを使ってSELinuxのルールを編集
setools-android with sepolicy-inject
https://forum.xda-developers.com/android/software/setools-android-sepolicy-inject-t2977563
XDAで公開されていたsepolicy-injectを使った所、YotaPhone2では以下のエラーで使用できず。
shell@yotaphone2:/data/local/tmp $ ./sesearch --allow
ERROR: policydb version 30 does not match my version range 15-29
ERROR: Unable to open policy /sepolicy.
ERROR: Success
↓policydb version 30に対応したものを発見。
https://github.com/xmikos/setools-android
必要ファイル(YotaPhone2は「armeabi-v7a」)
- seinfo
- sepolicy-inject
- sesearch
- sepolicy ←boot.imgの中にあるやつ (boot.imgを展開・再構築する)
>adb push seinfo /data/local/tmp/
>adb push sepolicy-inject /data/local/tmp/
>adb push sesearch /data/local/tmp/
>adb push sepolicy /data/local/tmp/
>adb shell
$ cd /data/local/tmp/
$ chmod 755 *
$ chmod 777 sepolicy
sepolicy-injectを使ってsepolicyを編集していくだけですが、sepolicyのルールの書き方がよくわからない\(^o^)/↓↓補助ツールがあった!!
https://github.com/DeckerSU/dmesg2selinux-inject
使用にはPHPのインストールが必要(Visual Studio 2015 Visual C++ 再頒布可能パッケージが必要?)
dmesgのログを標準出力でテキストに保存し、dmesg2selinux-inject.phpを実行するとsepolicy-inject用のルールが作成される。
>adb shell dmesg > dmesg.txt
>php.exe dmesg2selinux-inject.php
sepolicy-inject -s untrusted_app -t unlabeled -c dir -p search -P ./sepolicy
(system_appのルールを確認)$ ./sesearch --allow | grep "system_app system_app"
...(略)
allow system_app system_app : dir { ioctl read getattr search open } ;
allow system_app system_app : file { ioctl read write getattr lock append open } ;
(上記のsystem_appのルールと同じにしてみる)./sepolicy-inject -s untrusted_app -t unlabeled -c dir -p ioctl,read,getattr,search,open -P ./sepolicy -o sepolicy
./sepolicy-inject -s untrusted_app -t unlabeled -c file -p ioctl,read,write,getattr,lock,append,open -P ./sepolicy -o sepolicy
./sepolicy-inject -s system_app -t unlabeled -c dir -p ioctl,read,getattr,search,open -P ./sepolicy -o sepolicy
./sepolicy-inject -s system_app -t unlabeled -c file -p ioctl,read,write,getattr,lock,append,open -P ./sepolicy -o sepolicy
./sepolicy-inject -s platform_app -t unlabeled -c dir -p ioctl,read,getattr,search,open -P ./sepolicy -o sepolicy
./sepolicy-inject -s platform_app -t unlabeled -c file -p ioctl,read,write,getattr,lock,append,open -P ./sepolicy -o sepolicy
適用後sepolicyをboot.imgに書き戻した所、SELinuxコンテンツタイプが「u:object_r:unlabeled:s0」のままでも動くようになった。これでSELinuxをEnforcingのまま無効化状態にできる(?)
0 件のコメント :
コメントを投稿
当ブログの内容は私感を含むため確実性は保証できかねます。