Android aosp 自定义 SELinux

15 篇文章 0 订阅
3 篇文章 0 订阅
  • 背景

Android 安全模型部分基于应用沙盒的概念。每个应用都在自己的沙盒内运行。在 Android 4.3之前的版本中,这些沙盒是通过为每个应用创建独一无二的 Linux UID(在应用安装时创建)来定义的。Android 4.3 及更高版本使用 SELinux 进一步定义 Android 应用沙盒的边界。
基于 Android 4.3(宽容模式)和 Android 4.4(部分强制模式),在 Android 5.0 及更高版本中,已全面强制执行SELinux。通过此项变更,Android 已从对有限的一组关键域(installd、netd、vold 和 zygote)强制执行 SELinux 转为对所有域(超过 60 个)强制执行 SELinux。具体而言: 在 Android 5.x 及更高版本中,所有域均处于强制模式。 init 以外的任何进程都不应在 init 域中运行。 出现任何常规拒绝事件(对于
block_device、socket_device、default_service),都表示设备需要一个特殊域。
Android 6.0 通过降低我们政策的宽容度强化了系统安全,从而实现更好的用户隔离和 IOCTL 过滤、降低可从设备/系统之外访问的服务面临的威胁、进一步强化 SELinux 域,以及高度限制对 /proc 的访问。
Android 7.0 更新了 SELinux 配置,以进一步锁定应用沙盒并缩小受攻击面。此版本还将单片式 mediaserver 堆栈拆分为较小的进程,以缩小其权限范围。如需了解详情,请参阅利用更多的 Linux 内核防护功能保护 Android 系统和媒体堆栈安全强化。
Android 8.0 更新了 SELinux 以便与 Treble 配合使用,后者可将较低级别的供应商代码与 Android系统框架分离开来。此版本更新了 SELinux 政策以允许设备制造商和 SOC 供应商更新自己的政策部分、构建自己的映像(vendor.img、boot.img 等),然后更新这些映像而不受平台影响,反之亦然。虽然可以在设备上运行更高/更新版本的平台(框架),但反之并不成立;供应商映像 (vendor.img/odm.img) 的版本不能高于平台
(system.img) 的版本。因此,较新版平台可能会带来 SELinux 兼容性问题,因为平台 SELinux政策的版本要比该政策的供应商 SELinux 部分更新。Android 8.0 模型提供了一种保持兼容性的方法,以免进行不必要的同时OTA。

  • 关键文件

如需启用 SELinux,请集成最新的 Android 内核,然后整合 system/sepolicy 目录中的文件。这些文件在编译后会包含 SELinux 内核安全政策,并涵盖上游 Android 操作系统。
通常情况下,您不能直接修改 system/sepolicy 文件,但您可以添加或修改自己的设备专用政策文件(位于 /device/manufacturer/device-name/sepolicy 目录中)。在 Android 8.0 及更高版本中,您对这些文件所做的更改只会影响供应商目录中的政策。如需详细了解 Android 8.0 及更高版本中的公共 sepolicy 分离,请参阅在 Android 8.0 及更高版本中自定义 SEPolicy。无论是哪个 Android 版本,您都仍需要修改以下文件:

  1. 政策文件

以 *.te 结尾的文件是 SELinux 政策源代码文件,用于定义域及其标签。您可能需要在
/device/manufacturer/device-name/sepolicy 中创建新的政策文件,但您应尽可能尝试更新现有文件。

  1. 上下文的描述文件

您可以在上下文的描述文件中为您的对象指定标签。
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 会读取此配置。 BoardConfig.mk makefile
修改或添加政策文件和上下文的描述文件后,请更新您的
/device/manufacturer/device-name/BoardConfig.mk makefile 以引用 sepolicy
子目录和每个新的政策文件。如需详细了解 BOARD_SEPOLICY 变量,请参阅 system/sepolicy/README 文件。

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

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te

重新进行构建后,您的设备会启用 SELinux。现在,您可以根据您向 Android 操作系统添加的内容自定义 SELinux
政策(如自定义中所述),也可以验证现有设置(如验证中所述)。

在新政策文件和 BoardConfig.mk 更新部署到位后,新政策设置会自动内置到最终的内核政策文件中。如需详细了解如何在设备上构建
sepolicy,请参阅构建 sepolicy。

SELinux 采用白名单方法,这意味着只能授予政策中明确允许的访问权限。由于 Android 的默认 SELinux 政策已经支持
Android 开放源代码项目,因此您无需以任何方式修改 SELinux 设置。如果您要自定义 SELinux
设置,则应格外谨慎,以免破坏现有应用。要开始使用,请按下列步骤操作:

使用最新的 Android 内核。 采用最小权限原则。 仅针对您向 Android 添加的内容调整 SELinux
政策。默认政策能够自动适用于 Android 开源项目代码库。 将各个软件组件拆分成多个负责执行单项任务的模块。
创建将这些任务与无关功能隔离开来的 SELinux 政策。 将这些政策放在
/device/manufacturer/device-name/sepolicy 目录中的 *.te 文件内(te 是 SELinux
政策源代码文件使用的扩展名),然后使用 BOARD_SEPOLICY 变量将它们纳入到您的 build 中。
先将新域设为宽容域。为此,可以在该域的 .te 文件中使用宽容声明。 分析结果并优化域定义。 当 userdebug
版本中不再出现拒绝事件时,移除宽容声明。

  • 政策声明示例

SELinux 基于 M4 计算机语言,因此支持多种有助于节省时间的宏。

在以下示例中,所有域都被授予向 /dev/null 读写数据的权限以及从 /dev/zero 读取数据的权限。

# Allow read / write access to /dev/null
allow domain null_device:chr_file { getattr open read ioctl lock append write};

# Allow read-only access to /dev/zero
allow domain zero_device:chr_file { getattr open read ioctl lock };
此声明也可以通过 SELinux *_file_perms 宏编写(简短版):


# Allow read / write access to /dev/null
allow domain null_device:chr_file rw_file_perms;

# Allow read-only access to /dev/zero
allow domain zero_device:chr_file r_file_perms;
  • 政策示例

以下是一个完整的 DHCP 政策示例,我们将在下文中对其进行分析:

type dhcp, domain;
permissive dhcp;
type dhcp_exec, exec_type, file_type;
type dhcp_data_file, file_type, data_file_type;

init_daemon_domain(dhcp)
net_domain(dhcp)

allow dhcp self:capability { setgid setuid net_admin net_raw net_bind_service
};
allow dhcp self:packet_socket create_socket_perms;
allow dhcp self:netlink_route_socket { create_socket_perms nlmsg_write };
allow dhcp shell_exec:file rx_file_perms;
allow dhcp system_file:file rx_file_perms;
# For /proc/sys/net/ipv4/conf/*/promote_secondaries
allow dhcp proc_net:file write;
allow dhcp system_prop:property_service set ;
unix_socket_connect(dhcp, property, init)

type_transition dhcp system_data_file:{ dir file } dhcp_data_file;
allow dhcp dhcp_data_file:dir create_dir_perms;
allow dhcp dhcp_data_file:file create_file_perms;

allow dhcp netd:fd use;
allow dhcp netd:fifo_file rw_file_perms;
allow dhcp netd:{ dgram_socket_class_set unix_stream_socket } { read write };
allow dhcp netd:{ netlink_kobject_uevent_socket netlink_route_socket
netlink_nflog_socket } { read write };
  • 构建 SELinux 政策

Android 8.0 中的 SELinux 政策通过合并 /system 和 /vendor 中的部分内容而创建。适当设置该政策的逻辑位于
/platform/system/sepolicy/Android.mk。

政策存在于以下位置:

位置 包含 system/sepolicy/public 平台的 sepolicy API
system/sepolicy/private 平台实现详情(供应商可以忽略)
system/sepolicy/vendor 供应商可以使用的政策和上下文文件(供应商可以根据情况忽略)
BOARD_SEPOLICY_DIRS 供应商 sepolicy
构建系统会采用该政策,并在系统分区和供应商分区中分别生成平台政策组件和供应商政策组件。具体步骤包括:

将政策转换为 SELinux 通用中间语言 (CIL) 格式,具体如下: 平台公共政策 专用 + 公共组合政策 公共 + 供应商和
BOARD_SEPOLICY_DIRS 政策 将公开提供的政策作为供应商政策的一部分进行版本控制。为此,使用生成的公共 CIL 政策向公共供应商 + BOARD_SEPOLICY_DIRS 组合政策指明必须将哪些部分转换为将与平台政策相关联的属性。 创建将平台和供应商部分关联在一起的映射文件。最初,该文件只是将公共政策中的类型与供应商政策中对应的属性相关联;之后,该文件还为未来的平台版本中维护的文件提供依据,从而兼容以此平台版本作为目标版本的供应商政策。
合并政策文件(描述设备解决方案和预编译解决方案)。 合并映射政策、平台政策和供应商政策。 编译输出二进制政策文件。

参考: https://source.android.com/docs/security/features/selinux/customize?hl=zh-cn

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值