Android一時停止と永久停止selinux


selinuxを一時的に閉じる場合は、root権限が得られる場合は、adbの次のコマンドでselinuxを一時的に閉じることができます.
setenforce 0

長期的に閉じる必要がある場合は、slinueが起動した場所を参照してください.
Android起動selinuxはinitから始まります.ここにいるcppには次のものがあります.
static void selinux_initialize(bool in_kernel_domain) {
    Timer t;

    selinux_callback cb;
    cb.func_log = selinux_klog_callback;
    selinux_set_callback(SELINUX_CB_LOG, cb);
    cb.func_audit = audit_callback;
    selinux_set_callback(SELINUX_CB_AUDIT, cb);

    if (in_kernel_domain) {
        INFO("Loading SELinux policy...
"); if (selinux_android_load_policy() < 0) { ERROR("failed to load policy: %s
", strerror(errno)); security_failure(); } bool kernel_enforcing = (security_getenforce() == 1); bool is_enforcing = selinux_is_enforcing(); if (kernel_enforcing != is_enforcing) { if (security_setenforce(is_enforcing)) { ERROR("security_setenforce(%s) failed: %s
", is_enforcing ? "true" : "false", strerror(errno)); security_failure(); } } if (write_file("/sys/fs/selinux/checkreqprot", "0") == -1) { security_failure(); } NOTICE("(Initializing SELinux %s took %.2fs.)
", is_enforcing ? "enforcing" : "non-enforcing", t.duration()); } else { selinux_init_all_handles(); } }

ここでsecurity_setenforce関数はselinuxを起動するかどうかを設定し、起動の条件はkernel_です.Enforcingとis_Enforcing一致しない場合はselinux起動オプションをis_に設定します.enforcing.
securityを見てみましょうgetenforce実装、/external/selinux/libselinux/src/getenforce.cディレクトリの下:
int security_getenforce(void)
{
    int fd, ret, enforce = 0;
    char path[PATH_MAX];
    
    snprintf(path, sizeof path, "%s/enforce", selinux_mnt);
    fd = open(path, O_RDONLY);
    
    memset(buf, 0, sizeof buf);
    ret = read(fd, buf, sizeof buf - 1);
    close(fd);
    
    if (sscanf(buf, "%d", &enforce) != 1)
        return -1;
    return enforce;
    
}

まず、Androidが/sys/fs/selinux/enforceにノードパスを変更したノードの数値を取得します.この値はselinuxをオンにするかどうかを示します.
もう一つの判定条件はselinux_is_Enforcing()関数.定義は次のとおりです.
enum selinux_enforcing_status { SELINUX_PERMISSIVE, SELINUX_ENFORCING };

static selinux_enforcing_status selinux_status_from_cmdline() {
    selinux_enforcing_status status = SELINUX_ENFORCING;

    import_kernel_cmdline(false, [&](const std::string& key, const std::string& value, bool in_qemu) {
        if (key == "androidboot.selinux" && value == "permissive") {
            status = SELINUX_PERMISSIVE;
        }
    });

    return status;
}

ここではcmdlineからandroid bootを取得する.selinuxの値、permissiveの場合はSELINUX_を返しますPERMISSIVE、すなわち0、そうでなければSELINUX_に戻るENFORCING.
enforceノードとcmdlineの設定が一致しない場合はsecurity_を呼び出します.setenforce selinuxのenforceノード値を再設定します.
したがってselinuxを閉じるには、cmdlineでパラメータのセットを設定するだけです.
androidboot.selinux=permissive

Android 7について1,設置場所はプラットフォームのBoardConfigであるもよい.mk:
BOARD_KERNEL_CMDLINE := console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci lpm_levels.sleep_disabled=1 earlyprintk androidboot.selinux=permissive

カーネルが起動すると、次のように印刷されます.
<6>[    0.001053] Security Framework initialized
<6>[    0.001091] SELinux:  Initializing.
<7>[    0.001185] SELinux:  Starting in permissive mode

<5>[    9.117477] audit: type=1400 audit(1489810287.106:3): avc:  denied  { net_raw } for  pid=368 comm="pm-service" capability=13  scontext=u:r:per_mgr:s0 tcontext=u:r:per_mgr:s0 tclass=capability permissive=1


selinueはpermissiveモードで実行されていることがわかります.つまりdomain/typeアクセスは制限されず、logのみが印刷され、logにもpermissive=1が表示されます.