赞
踩
AOSP: Android 中的安全增强型 Linux、SELinux 概念
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
查看
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 。
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
4、检查 init.device.rc
和 fstab.device
文件,确保每一次使用 mount
都对应一个添加了适当标签的文件系统,或者指定了 context= mount
选项。
5、构建 SELinux 政策,编译 make selinux_policy
AOSP:自定义 SELinux、构建 SELinux、编写 SELinux 政策、供应商 init (vendor_init)、调试和验证
file_contexts
用于为文件
分配标签,并且可供多种用户空间组件使用。在创建新政策时,请创建或更新该文件,以便为文件分配新标签。如需应用新的 file_contexts,请重新构建文件系统映像,或对要重新添加标签的文件运行 restorecon
。在升级时,对 file_contexts 所做的更改会在升级过程中自动应用于系统和用户数据分区。此外,您还可以通过以下方式使这些更改在升级过程中自动应用于其他分区:在以允许读写的方式装载相应分区后,将 restorecon_recursive
调用添加到 init.board.rc
文件中。genfs_contexts
用于为不支持扩展属性的文件系统
(例如,proc
或 vfat
)分配标签。此配置会作为内核政策的一部分进行加载,但更改可能对内核 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
会读取此配置。查看 init进程 中
SetupSelinux
:FirstStageMain > 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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。