SELinux в Android (SEAndroid) - разрешающее правило не действует
1,00
р.
р.
Устройство или ОС, прошивка: CyanogenMod 13.0 (Android 6.0.1) Проблема: При SELinux=enforcing приложение фонарика из CM-12.0 в режиме работы через sysfs крашится. logcat: 01-04 20:36:35.315 3320 3320 D TorchRoot: Starting torch 01-04 20:36:35.332 3320 3320 W t.cactii.flash2: type=1400 audit(0.0:11): avc: denied { write } for name="brightness" dev="sysfs" ino=22032 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:torch_sysfs:s0 tclass=file permissive=0 01-04 20:36:35.343 3320 3320 D TorchDevice: setFlashMode 3 01-04 20:36:35.344 3320 3320 D AndroidRuntime: Shutting down VM --------- beginning of crash 01-04 20:36:35.345 3320 3320 E AndroidRuntime: FATAL EXCEPTION: main 01-04 20:36:35.345 3320 3320 E AndroidRuntime: Process: net.cactii.flash2, PID: 3320 01-04 20:36:35.345 3320 3320 E AndroidRuntime: java.lang.RuntimeException: Can't open flash device 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at net.cactii.flash2.FlashDevice.setFlashMode(FlashDevice.java:252) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at net.cactii.flash2.TorchService.handleMessage(TorchService.java:44) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5466) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: Caused by: java.io.FileNotFoundException: ys/class/leds/torch-light/brightness: open failed: EACCES (Permission denied) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at libcore.io.IoBridge.open(IoBridge.java:452) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at java.io.FileOutputStream.(FileOutputStream.java:87) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at java.io.FileOutputStream.(FileOutputStream.java:72) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at java.io.FileWriter.(FileWriter.java:80) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at net.cactii.flash2.FlashDevice.setFlashMode(FlashDevice.java:228) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: ... 7 more 01-04 20:36:35.345 3320 3320 E AndroidRuntime: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at libcore.io.Posix.open(Native Method) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: at libcore.io.IoBridge.open(IoBridge.java:438) 01-04 20:36:35.345 3320 3320 E AndroidRuntime: ... 11 more 01-04 20:36:35.349 840 1039 W ActivityManager: Force finishing activity net.cactii.flash2/.MainActivity dmesg: [ 614.870153,1] type=1400 audit(1451928995.332:11): avc: denied { write } for pid=3320 comm="t.cactii.flash2" name="brightness" dev="sysfs" ino=22032 scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:torch_sysfs:s0 tclass=file permissive=0 При SELinux=permissive приложение работает как должно (но в dmesg выдаётся аналогичное вышеприведенному предупреждение). SELinux настроен так: $ grep torch device/jsr/d10fepolicy/* device/jsr/d10fepolicy/file_contexts:ys/class/leds/torch-light/brightness u:object_r:torch_sysfs:s0 device/jsr/d10fepolicy/file_contexts:ys/devices/qcom,camera-led-flash.([0-9])+/leds/torch-light/brightness u:object_r:torch_sysfs:s0 device/jsr/d10fepolicy/file.te:type torch_sysfs, fs_type, sysfs_type device/jsr/d10fepolicy/platform_app.te:allow platform_app torch_sysfs:file write То есть: На базе типа sysfs_type создан новый тип torch_sysfs Файлам torch-light/brightness в sysfs присвоен контекст u:object_r:torch_sysfs:s0 Приложениям в домене platform_app разрешена запись в файлы с типом torch_sysfs Почему разрешающее правило allow platform_app torch_sysfs:file write не действует? Правило сгенерировано автоматически, командой: adb shell dmesg | audit2allow -p out/target/product/d10f/rootepolicy #============= platform_app ============== allow platform_app torch_sysfs:file write Спасибо.
Ответ Я никогда не использовал такую систему защиты на телефоне, но немного работал с SELinux на самом Линуксе. Вот тут (https://russianblogs.com/article/41261316723/) я прочёл, что можно написать так, как вы верно написали (это пример с сайта): allow radio sysfs:file write Попробуйте, если вы не пробовали, вместо torch_sysfs написать саму sysfs