一、背景
SEAndroid
是Google在Android体系上运用的一套以SELinux
为根底核心的体系安全机制(下统称SElinux)。其最早发布于Android 4.3, 经过多年的开展, 目前已经成为了Android用户态安全的重要保障。
无恒实验室在近期的安全研讨中,对于SELinux
的进犯面和进犯办法有一些研讨成果,特此同享给大家,希望与业界进行学习沟通。
SELinux(Security-Enhanced Linux)
是美国国家安全局(NSA)主导开发的Linux内核安全模块,为内核供给了强制拜访操控(MAC)
,项目于2000年发布到开源社区,并于2003年集成到上游 Linux 内核中。
「所以说优异的安全机制便是揭露一切细节,依旧可以让进犯者束手无策 :)」
Linux默认的拜访操控战略是 自主拜访操控(DAC
,可以经过下面两张图来直观了解一下DAC与MAC的差异:
图片源自 https://blog.csdn.net/headwind_/article/details/119704755
在DAC
中,方针的具有者可以恣意修正或授予此方针相应的权限,且进程理论上所具有的权限与履行它的用户的权限相同; 这导致假如一个以root
权限运转的进程被攻破, 进犯者就可以借此在体系中畅行无阻。
而在MAC
中, 为一切进程和文件都设置了安全上下文, 当用户履行某项操作时, 除了要经过DAC
的查看, 还需要契合MAC
中拟定的规矩; 因而即便是root
进程,其权限也会被约束在特定范围内,这虽然不能完全防护进犯,但可以将丢失降到最低。
二、SElinux的完结
SElinux的完结依赖于Linux内核的安全模块结构(LSM)
,当内核对用户态拜访做处理时,LPM会在 DAC查看之后预留钩子函数,SElinux便是经过此接口来完结MAC;因而Android渠道权限是DAC+MAC
,即两个权限管理独立存在,操作行为有必要一起经过两种机制的查验才会被答应。
https://www.kernel.org/doc/ols/2002/ols2002-pages-604-617.pdf
三、根本元素
3.1 标签
SElinux
是一个依据标签的体系,一切的进程,文件,socket等都有标签。标签是一个四元组字符串**user:role:type:level
**,其间我们首要重视的是type
。
在 Android体系中,一切方针大致可以分为两类:
-
一种是
死
的(文件、端口、体系特点等被调用方针),例如:u:object_r:proc:s0
-
一种是
活
的(进程、App等调用资源的方针),例如:u:r:vendor_init:s0
查看标签的办法便是在常用命令后边加上-Z,如下:
进程 ps -ZA
u:r:vendor_init:s0 root 545 1 6728 2376 poll_sche+ 0 S init
u:r:zygote:s0 root 678 1 4308756 142888 poll_sche+ 0 S zygote64
文件 ls -lZ
drwxr-x--- 2 root shell u:object_r:rootfs:s0 4096 2009-01-01 00:00 sbin
drwxr-xr-x 18 root root u:object_r:vendor_file:s0 4096 2009-01-01 00:00 vendor
特点 getprop -Z
[DEVICE_PROVISIONED]: [u:object_r:default_prop:s0]
[aaudio.hw_burst_min_usec]: [u:object_r:exported_default_prop:s0]
3.2 规矩
有了标签
之后,还需要编写规矩
来约束标签, 依据SELinux规范,完好的规矩相关的语句格局为:
rule_name source_type target_type:class perm_set
-
rule_name 规矩名
-
allow
: 答应主体对客体进行操作 -
neverallow
:回绝主体对客体进行操作 -
dontaudit
: 表明不记载某条违反规矩的决议计划信息 -
auditallow
:记载某项决议计划信息,通常 SElinux 只记载失利的信息,运用这条规矩后会记载成功的决议计划信息
-
-
source_type 主体
-
Domain
:一个进程或一组进程的标签。也称为域类型
-
-
target_type 客体
-
Type
:一个方针(例如,文件、套接字)或一组方针的标签
-
-
class 类别
- 要拜访的方针的类型,例如文件、套接字等
- 在
system/sepolicy/private/security_classes
中被界说
-
perm_set 动作集
- 要履行的操作,例如读取、写入等
- 在
system/sepolicy/private/access_vectors
中被界说
下面结合例子阐明一下:
# 答应user域中的进程 读取 script标签中的file类型文件
allow user script:file {read};
# 不答应user域中的进程 写入 script标签中的file类型文件
neverallow user script:file {write};
3.3 装备文件
SElinux编译后的标签
和规矩
等文件会保存在每个分区的etc/selinux
目录下:
$ls -l system/etc/selinux
drwxrwxr-x 2 root root 4096 12月 9 15:53 mapping/
-rw-rw-r-- 1 root root 40561 12月 10 15:56 plat_file_contexts
-rw-rw-r-- 1 root root 8614 12月 10 15:56 plat_hwservice_contexts
-rw-rw-r-- 1 root root 7243 12月 9 15:53 plat_mac_permissions.xml
-rw-rw-r-- 1 root root 48646 12月 10 15:56 plat_property_contexts
-rw-rw-r-- 1 root root 1905 12月 10 15:56 plat_seapp_contexts
-rw-rw-r-- 1 root root 65 12月 10 15:55 plat_sepolicy_and_mapping.sha256
-rw-rw-r-- 1 root root 1623615 12月 10 15:55 plat_sepolicy.cil
-rw-rw-r-- 1 root root 19798 12月 10 15:56 plat_service_contexts
-rw-rw-r-- 1 root root 818418 12月 10 15:55 sepolicy_neverallows
其间 plat_sepolicy.cil
中记载的是SElinux规矩, plat_sepolicy_and_mapping.sha256
为校验文件, 其余的文件中记载的都是标签数据。
四、SEAndroid安全危险
SElinux经过最大限度地约束体系中服务进程可拜访的资源,以到达收敛进犯面,减小丢失的意图;但其也不是全能的,开发留传的调试接口、内核缝隙、过错的战略装备等问题都可能导致进犯者绕过SELinux的约束进犯体系。
4.1 自界说后门
所谓“敌在本能寺”, 有些厂商在开发时为了方便调试, 会预留封闭SElinux的后门接口
, 假如这类后门
在正式发布前没有删去, 就有可能被进犯者利用来封闭SElinux。
4.2 内核缝隙
SElinux首要约束用户态的操作,假如进犯者经过内核缝隙取得恣意地址读写的能力,就可以经过覆写全局变量selinux_enforcing
的办法将SElinux封闭。
为此,三星运用自研的RKP(Real-time Kernel Protection)
机制,将灵敏的全局变量放置在受保护的kdp_ro节
,一定程度上缓解了此类进犯。
4.3 战略过于广泛
SELinux中相同存在人
引进的问题,假如将灵敏服务
开放给普通用户,或许对System APP
、Property
的权限划分不详尽,就会导致受到进犯时的影响范围被扩展。
4.4 服务功能与SElinux战略不对齐
在Android体系中有些区域需要频繁的写入各类数据,如 /data/local/tmp
、/sdcard
等,因而SElinux不会对这些位置做严格的约束, 普通用户权限就可以读写其间的数据。
原则上这些目录是不可以寄存灵敏数据的,假如研发人员将一些重要文件保存在这些目录下(如装备文件、隐私信息、晋级固件等),就会存在被进犯者窃取篡改的危险。
五、SEAndroid封闭办法
上面介绍的都是在运转时绕过SElinux的办法,但在日常工作中还存在这样一种场景,我们需要在一台已解锁的Android设备上获取Root权限来进行测试;目前高版别Android 上有一些优异的Root工具,例如Magisk
、KernelSU
等,但运用自动化工具终究是无法了解底层原理, 假如要手动ROOT设备,封闭SElinux便是非常要害的一步, 下面来介绍几种手动封闭SElinux的办法。
5.1 Patch Boot
下载Android设备对应的全量Rom包,解开Boot分区后可以发现其布局如下
header # 内核运转参数 & 其他信息
kernel # Linux 内核
ramdisk.cpio # boot分区
header
的结构如下, 其间cmdline
会传递给内核作为发动参数, 因而我们可以经过修正cmdline
的办法,传入封闭SElinux的命令enforcing=0 androidboot.selinux=permissive
。
cmdline=
os_version=12.0.0
os_patch_level=2021-12
不过在高版别Android体系中,很多厂商不再解析cmdline
,通用性较差。
5.2 Patch Init
init
是Linux Kernel发动后运转的第一个用户态进程,其功能首要是完结初始化、解析履行init.rc
中界说的各种服务, 过程首要分为四个过程:
FirstStateMain
->SetupSelinux
->SecondStageMain
->ueventd_main
其间SetupSelinux
阶段的要害函数如下:
-
LoadSelinuxPolicy
:加载sepolicy战略 -
selinux_android_restorecon
:重载sepolicy战略 -
SelinuxSetEnforcement
:设置SElinux开关
显然要害在于SelinuxSetEnforcement
函数,其内部完结如下。
void SelinuxSetEnforcement() {
bool kernel_enforcing = (security_getenforce() == 1);
bool is_enforcing = IsEnforcing();
if (kernel_enforcing != is_enforcing) {
if (security_setenforce(is_enforcing)) {
PLOG(FATAL) << "security_setenforce(" << (is_enforcing ? "true" : "false")
<< ") failed";
}
}
if (auto result = WriteFile("/sys/fs/selinux/checkreqprot", "0"); !result.ok()) {
LOG(FATAL) << "Unable to write to /sys/fs/selinux/checkreqprot: " << result.error();
}
}
bool IsEnforcing() {
if (ALLOW_PERMISSIVE_SELINUX) {
return StatusFromProperty() == SELINUX_ENFORCING;
}
return true;
}
这里只需要Patch IsEnforcing
使其永久返回False
即可在init阶段
封闭Selinux
5.3 重编译Kernel
依据GPL
协议,厂商会开源修正的Linux Kernel
,因而可以经过重编译内核的办法, 在编译时封闭SElinux。
详细办法为在内核装备文件.config中设置 CONFIG_SECURITY_SELINUX=n
。
5.4 Patch Kernel
假如厂商未开源内核,或许开源不完全无法正常编译,也可以经过Patch的办法绕过SElinux
这里以文件翻开操作 open
为例,整理SElinux的相关调用链
图片源自 blog.csdn.net/bruk_spp/ar…
当用户空间调用open
翻开文件时,会触发体系调用 do_dentry_open
,接着调用Linux LSM公共接口security_file_open
,之后会走到SElinux处理open操作的函数selinux_file_open
, 下一步SElinux会调用avc公共函数
来完结权限查看和日志审计功能,假如发现操作越权,则会调用avc_denied
来阻止该行为。
因而我们只需要将阻止操作的相关逻辑 Patch掉,就可以变相封闭 SElinux。
六、总结
总的来说,SElinux的引进极大的降低了针对用户态进犯所造成的丢失, 即便经过缝隙获取了Root权限, 也会被约束在影响相对小的范围内。近年来,跟着很多软硬件防护机制的引进,Android的安全性有了明显的提高;经过优异的,可揭露的安全机制来收敛进犯面,提高安全水位,这也是我们国产操作体系学习的榜样和努力完结的方针。
七、关于无恒实验室
无恒实验室是由字节跳动资深安全研讨人员组成的专业攻防实验室,致力于为字节跳动旗下产品与事务保驾护航。经过缝隙发掘、实战演练、黑产冲击、应急呼应等手法,不断提高公司根底安全、事务安全水位。无恒实验室亦极为重视开源软件与体系对事务安全的影响,在检测公司引进的开源结构和体系的一起,无恒实验室也着力于构建第三方结构和组件的缝隙缓解机制,并将持续与业界同享研讨成果,帮忙企业事务防止遭受安全危险,亦望能与业界同行一起合作,为网络安全行业的开展做出贡献。
参考
- source.android.com/security/se…