簡體   English   中英

設置 shell 腳本 Android SELinux 策略以在系統引導時啟動它已完成

[英]Set shell script Android SELinux policies for starting it at sys boot completed

我在為具有以下內容的 sh 腳本 (init.myservice.sh) 創建 SELinux 策略時遇到了麻煩:

#!/system/bin/sh
/system/bin/am force-stop 'com.myapp.apptest'
/system/bin/tinymix 'Headphone Volume' 35;tinymix 'Capture Input' ADC;tinymix 'DMIC Mux' DMIC2;
/system/bin/am start -n ' com.myapp.apptest/ com.myapp.apptest.MainActivity' -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
/system/bin/my_board_service &

如您所見,此腳本執行以下操作:

  • 停止(和啟動)APK 應用程序
  • 使用 tinymix 設置一些麥克風和音頻設置
  • 啟動一個二進制文件 (my_board_service),它是一個 C++ 編譯程序,它與自定義板外設(GPIO、I2C 等)交互

我在“init.rc”文件中添加了以下幾行:

on property:sys.boot_completed=1
    start init-myservice

service init-myservice /system/bin/sh /system/bin/init.myservice.sh
    class main
    user root
    group root system
    disabled
    oneshot

我可以在路徑“/system/bin”下看到構建系統中的腳本和具有正確權限(755)的二進制文件,如果我手動啟動它,它運行良好。 但我無法在系統啟動時啟動它,因為(沒有設置任何策略)我在 shell 上收到此錯誤:

命令 'start init-myservice' action=sys.boot_completed=1 (/vendor/etc/init/hw/init.freescale.rc:334) 耗時 5ms 失敗:無法啟動服務:文件 /system/bin/init. myservice.sh(標記為“u:object_r:system_file:s0”)的 label 不正確,或者沒有從 u:r:init:s0 到定義的另一個 SELinux 域的域轉換。 您是否正確配置了服務? https://source.android.com/security/selinux/device-policy#label_new_services_and_address_denials

所以我試圖在沒有任何運氣的情況下生成服務策略。 我嘗試了以下方法: my.te 文件的內容如下:

# foo service
type foo, domain;
type foo_exec, exec_type, file_type;
init_daemon_domain(foo)

我在此位置下的“file_contexts”文件中添加了以下行:“android_build/device/variscite/imx8m/dart_mx8mm/sepolicy/”

/system/bin/init\.myscript\.sh      u:object_r:foo_exec:s0

當我構建我的 AOSP 項目時,我很少遇到這樣的錯誤:

失敗:out/target/product/dart_mx8mm/obj/ETC/treble_sepolicy_tests_28.0_intermediates/treble_sepolicy_tests_28.0 /bin/bash -c "(out/host/linux-x86/bin/treble_sepolicy_tests -l
out/host/linux-x86/lib64/libsepolwrap.so -f out/target/product/dart_mx8mm/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts -f out/target/product/dart_mx8mm/obj/ETC/vendor_file_contexts_intermediates/vendor_file_contexts -b out /target/product/dart_mx8mm/obj/ETC/built_plat_sepolicy_intermediates/built_plat_sepolicy -m out/target/product/dart_mx8mm/obj/ETC/treble_sepolicy_tests_28.0_intermediates/28.0_mapping.combined.cil -o out/target/product/dart_mx8mm/obj/ ETC/treble_sepolicy_tests_28.0_intermediates/built_28.0_plat_sepolicy -p out/target/product/dart_mx8mm/obj/ETC/sepolicy_intermediates/sepolicy -u out/target/product/dart_mx8mm/obj/ETC/built_plat_sepolicy_intermediates/base_plat_pub_policy.cil --fake-treble ) && (touch out/target/product/dart_mx8mm/obj/ETC/treble_sepolicy_tests_28.0_intermediates/treble_sepolicy_tests_28.0 )" 以下域必須與“coredomain”屬性相關聯,因為它們是在 /system 之外執行的:foo

我最近能夠得到你所描述的工作,但我們的方法存在一些差異。 我所有的更改都在目標的“/vendor”中。 我不確定您的 init.rc 更改在哪里,但您將腳本描述為安裝在“/system”中。

否則,您所描述的大部分內容都很熟悉,包括在編譯 SELinux 策略時遇到問題。 最后,對我有用的政策看起來像這樣:

# foo service
type foo, domain;
type foo_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(foo)

# followed by all the particulars of my service.

如果您設置在“系統”而不是“供應商”中安裝服務,則錯誤消息的措辭似乎是在告訴您將您的域與“核心域”相關聯。 我認為這意味着您的策略應在“init_daemon_domain”之前的某處包含以下行:

typeattribute foo coredomain;

您還應該知道,我已經看到它說有一個 SELinux 政策禁止將“供應商”與“系統”混合。 我不確定,但我認為這意味着如果你修改了 /vendor 文件系統中的 init.rc 來運行你的腳本,那么你只能使用 /vendor 文件系統中的“stuff”。 上面的示例顯示了使用 /system/bin/sh 的腳本,因此如果您修改 /vendor 文件系統中的 init.rc 以啟動該腳本,我認為這將是違規行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM