SELinuxがEnforcingのままシステムファイルを書き換えたい

システムアプリを追加したらSELinuxにブロックされて動かない…
SELinuxをEnforcingのまま使う方法を調べてみた。


SELinuxが有効だと導入したOpenGappsが動かないことがある

YotaPhone2でシステムアプリを手動で追加するとエラーが出て動かない。。。

dmesg(DDMS)のログ一部
[  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」に変更する。

  1. 一旦root化してchconする方法(めんどくさい)
  2. 一度SuperSUをインストールしてコンテンツタイプを変えた後unroot
    $ su
    # mount -o rw,remount /system
    # chcon -R u:object_r:system_file:s0 /system/app/GoogleJapaneseInput
    
  3. TWRPからchconする方法(簡単)
  4. Systemをマウント後、
    # 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」)
  1. seinfo
  2. sepolicy-inject
  3. sesearch
  4. sepolicy ←boot.imgの中にあるやつ
  5. (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 件のコメント :