当前位置:   article > 正文

Android SELinux_android selinux tcontext

android selinux tcontext

1、概念

AOSP: Android 中的安全增强型 LinuxSELinux 概念
system/sepolicy/README.md


日志: avc: denied { getattr } for path=“/proc/stat” dev=“proc” ino=4026532043 scontext=u:r:system_app:s0 tcontext=u:object_r:proc_stat:s0 tclass=file permissive=1
说明:
1、audit2allow -i avc_log(包含avc日志文件) > avc_te(如下生成需要配置的权限)
allow system_app proc_stat:file { read getattr open }
2、scontext=u:r:system_app:s0 - 规则主题的类型(或属性)。谁正在请求访问权限?
3、tcontext=u:object_r:proc_stat:s0 - 对象的类型(或属性)。对哪些内容提出了访问权限请求?
4、tclass=file - 要访问的对象(例如,文件、套接字)的类型。
5、denied { getattr } - 要执行的操作(或一组操作,例如读取、写入)。
6、permissive=1 - 设备处于SELinux的宽容模式,出厂设备都是强制模式Enforcing(即permissive=0),通过adb shell getenforce查看

2、实现 SELinux

AOSP:实现 SELinux


1、通常情况下,添加或修改自己的设备专用SELinux文件(/device/manufacturer/device-name/sepolicy);不能直接修改 system/sepolicy 文件,影响CTS。
2、以 *.te 结尾的文件是 SELinux 政策源代码文件,用于定义域及其标签。
3、mk添加编译:BOARD_SEPOLICY_DIRS += device/manufacturer/device-name/sepolicy ;了解 BOARD_SEPOLICY 变量 system/sepolicy/README

2.1 开启SELinux

1、在内核中启用 SELinux:CONFIG_SECURITY_SELINUX=y
2、更改 kernel_cmdline 参数 BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive (这仅适用于初始制定设备政策的情况。在拥有初始引导程序政策后,请移除此参数,以便将设备恢复强制模式,否则设备将无法通过 CTS 验证。)
3、设置 BOARD_CONFIG.mk 以使用 BOARD_SEPOLICY_* 变量。 BOARD_SEPOLICY 变量 system/sepolicy/README

BOARD_SEPOLICY_DIRS += \
        <root>/device/manufacturer/device-name/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、检查 init.device.rcfstab.device 文件,确保每一次使用 mount 都对应一个添加了适当标签的文件系统,或者指定了 context= mount 选项。
5、构建 SELinux 政策,编译 make selinux_policy

2.2 了解 SELinux 文件

AOSP:自定义 SELinux构建 SELinux编写 SELinux 政策供应商 init (vendor_init)调试和验证

  • file_contexts 用于为文件分配标签,并且可供多种用户空间组件使用。在创建新政策时,请创建或更新该文件,以便为文件分配新标签。如需应用新的 file_contexts,请重新构建文件系统映像,或对要重新添加标签的文件运行 restorecon。在升级时,对 file_contexts 所做的更改会在升级过程中自动应用于系统和用户数据分区。此外,您还可以通过以下方式使这些更改在升级过程中自动应用于其他分区:在以允许读写的方式装载相应分区后,将 restorecon_recursive 调用添加到 init.board.rc 文件中。
  • genfs_contexts 用于为不支持扩展属性的文件系统(例如,procvfat)分配标签。此配置会作为内核政策的一部分进行加载,但更改可能对内核 inode 无效。要全面应用更改,您需要重新启动设备,或卸载并重新装载文件系统。此外,通过使用 context=mount 选项,您还可以为装载的特定系统文件(例如 vfat)分配特定标签。
  • property_contexts 用于为 Android 系统属性分配标签,以便控制哪些进程可以设置这些属性。在启动期间,init 进程会读取此配置。
  • service_contexts 用于为 Android Binder 服务分配标签,以便控制哪些进程可以为相应服务添加(注册)和查找(查询)Binder 引用。在启动期间,servicemanager 进程会读取此配置。
  • seapp_contexts 用于为应用进程/data/data 目录分配标签。在每次应用启动时,zygote 进程都会读取此配置;在启动期间,installd 会读取此配置。
  • mac_permissions.xml 用于根据应用签名和应用软件包名称(后者可选)为应用分配 seinfo 标记。随后,分配的 seinfo 标记可在 seapp_contexts 文件中用作密钥,以便为带有该 seinfo 标记的所有应用分配特定标签。在启动期间,system_server 会读取此配置。

3、启动加载

查看 init进程SetupSelinuxFirstStageMain > SetupSelinux > SecondStageMain


system/core/init/selinux.cpp

ReadPolicy(&policy) - 将策略读取为字符串
LoadSelinuxPolicy(policy) - 在/dev/中加载sepolicy并发布关键的restorecons,小心避免从/system读取任何内容。
SelinuxSetEnforcement() - 是否开启SELinux

int SetupSelinux(char** argv) {
    SetStdioToDevNull(argv);
    InitKernelLogging(argv);

    if (REBOOT_BOOTLOADER_ON_PANIC) {
        InstallRebootSignalHandlers();
    }

    boot_clock::time_point start_time = boot_clock::now();

    MountMissingSystemPartitions();

    SelinuxSetupKernelLogging();

    LOG(INFO) << "Opening SELinux policy";

    PrepareApexSepolicy();

    // Read the policy before potentially killing snapuserd.
    std::string policy;
    ReadPolicy(&policy);
    CleanupApexSepolicy();

    auto snapuserd_helper = SnapuserdSelinuxHelper::CreateIfNeeded();
    if (snapuserd_helper) {
        // Kill the old snapused to avoid audit messages. After this we cannot
        // read from /system (or other dynamic partitions) until we call
        // FinishTransition().
        snapuserd_helper->StartTransition();
    }

    LoadSelinuxPolicy(policy);

    if (snapuserd_helper) {
        // Before enforcing, finish the pending snapuserd transition.
        snapuserd_helper->FinishTransition();
        snapuserd_helper = nullptr;
    }

    // This restorecon is intentionally done before SelinuxSetEnforcement because the permissions
    // needed to transition files from tmpfs to *_contexts_file context should not be granted to
    // any process after selinux is set into enforcing mode.
    if (selinux_android_restorecon("/dev/selinux/", SELINUX_ANDROID_RESTORECON_RECURSE) == -1) {
        PLOG(FATAL) << "restorecon failed of /dev/selinux failed";
    }

    SelinuxSetEnforcement();

    // We're in the kernel domain and want to transition to the init domain.  File systems that
    // store SELabels in their xattrs, such as ext4 do not need an explicit restorecon here,
    // but other file systems do.  In particular, this is needed for ramdisks such as the
    // recovery image for A/B devices.
    if (selinux_android_restorecon("/system/bin/init", 0) == -1) {
        PLOG(FATAL) << "restorecon failed of /system/bin/init failed";
    }

    setenv(kEnvSelinuxStartedAt, std::to_string(start_time.time_since_epoch().count()).c_str(), 1);

    const char* path = "/system/bin/init";
    const char* args[] = {path, "second_stage", nullptr};
    execv(path, const_cast<char**>(args));

    // execv() only returns if an error happened, in which case we
    // panic and never return from this function.
    PLOG(FATAL) << "execv(\"" << path << "\") failed";

    return 1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/961996
推荐阅读
相关标签
  

闽ICP备14008679号