当前位置: 首页 > 工具软件 > SE Android > 使用案例 >

SE for Android 系列之整体概要(三)

宗政德宇
2023-12-01

内核LSM和SELinux的支持

文章 Security Enhanced (SE) Android: Bringing Flexible MAC to Android对内核的修改情况做了很好的描述,下面主要讲一下为支持Binder IPC服务所作的变化:

  1. Linux安全模块(LSM)在binder驱动代码(drivers/staging/android/binder.c和include/linux/security.h)添加了钩子逻辑;
  2. 在没有其他模块的情况下,默认支持能力("capabilities")(security/capability.c);
  3. LSM安全模块添加了钩子逻辑;
  4. 对显示在“SE for Android的类别和权限”一节中所列的客体类别和权限提供支持(security/selinux/include/classmap.h);


SE for Android的客体类别和权限

SE for Android添加了三个客体类别(binder, zygote和property_service),下表描述它们权限:
binder 类别 - 这是管理内核Binder IPC服务的客体类别
权限 描述
call 通过IPC方式访问一个指定的进程(A能否访问B?)。
impersonate 接管IPC通讯(A能否接管B的IPC通讯?)。
目前策略还没有使用,但selinux_binder_transaction调用时内核有做检查。
set_context_mgr

把自身注册成Binder Context Manager。如果A能为把B设置为context manager,就意味着A==B。参考策略文件servicemanager.te

transfer 传递binder引用给其他进程 (A能否把binder引用传递给B?)。


zygote  类别 – 这是用户空间的客体类别,管理Android应用的装载。参考SELinux.checkSELinuxAccess. In ZygoteConnection.java
权限 描述
specifyids 指定应用的uid或者gid
specifyrlimits 指定应用的资源限制
specifycapabilities 指定应用的capabilities
specifyinvokewith 指定应用要使用--invoke-with启动Zygote,这是一种包装命令的使用方式
specifyseinfo 指定seinfo标签决定应用的安全上下文


property_service 类别 – 这是用户空间的类别,用于管理Android Property Service
权限 描述
set 设置一个属性



SELinux命令行
SE for Android为Android了一个SELinux命令的子集,见表1。他们作用于Toolbox命令,也可以通过adb shell命令调用,比如:
adb shell su to setenforce permissive

表1:开启SELinux的adb shell命令(在Android toolbox里)

命令 注释
chcon 修改文件的安全上下文. 只支持第一部分的chcon(1)功能 (目前仅支持context pathname的格式).
chcon context pathname
getenforce 获取当前的工作模式
getenforce
getsebool Get SELinux boolean value(s):
getsebool [-a | boolean]
id 不带任意选项,如果开启了SELinux,那么安全上下文的信息就会自动显示
load_policy 把新策略加载入内核
load_policy policy-file
ls 支持通过-Z选项显示安全上下文信息
restorecon 按file_contexts文件的策略恢复文件的安全上下文。与restorecon(8)相比,有部分选项不支持
restorecon [-nrRv] pathname
runcon 以指定的安全上下文件运行命令
runcon context program args...
setenforce 修改SELinux的工作模式
setenforce [enforcing|permissive|1|0]
setsebool 修改SELinux布尔值(需要注意,这种修改重启后失效)
setsebool name [1|true|on|0|false|off]



SELinux 的公开方法
这些公开方法等价于在liselinux里的方法,见表2。源码在framework/base/java/andoid/os/SElinux.java。

表2:SELinux公开的类和方法

boolean isSELinuxEnabled()
获取SELinux开启状态
如果上开启状态,则返回true
boolean isSELinuxEnforced()
判断SELinux是否处于permissive或enforcing模式
如果是enforcing模式,则返回true
boolean setSELinuxEnforce(boolean value)
设置SELinux的工作模式(permissive或者enforcing)
value为true表示enforcing模式
设置成功返回true
boolean setFSCreateContext(String context)
设置新建文件对象的安全上下文
context为被指定安全上下文
设置成功返回true
boolean setFileContext(String path, String context)
修改现有文件的安全上下文
path是被修改的文件路径
context为被指定的安全上下文
设置成功返回true
String getFileContext(String path)
获取文件的安全上下文
path 文件路径.
返回文件的安全上下文件字符串或者null
String getPeerContext(FileDescriptor fd)
获取本地socket的安全上下文
FileDescriptor是socket所绑定的文件
返回socket上下文件字符串或者null
String getContext()
获取当前进程的安全上下文
返回当前进程的安全上下文或者null
String getPidContext(int pid)
获取指定pid的进程安全上下文
pid 进程pid
返回进程的安全上下文或者null
String[] getBooleanNames()
获取SELinux的布尔值键名列表
返回包含所有SELinux布尔值键名的字符串数组
boolean getBooleanValue(String name)
获取指定键名的布尔值
name 键名.
返回true或false
boolean setBooleanValue(String name, boolean value)
根据键名设置布尔值。需要注意,重启后会失效。
name 键名
value 重的布尔值
操作成功返回true
boolean checkSELinuxAccess(String scon, String tcon, String tclass, String perm)
判断两个安全上下文之间指定的权限是否被允许
scon 源或宾体安全上下文
tcon 目标或客体安全上下文
tclass 客体类别名称
perm 权限名称
权限允许则返回true
boolean restorecon(String pathname)
恢复文件为默认的安全上下文。如果系统没有包含SElinux或者处于关闭状态,都会自动返回true
pathname 文件路径
操作成功则返回true
如果pathname为null会抛NullPointerException异常
boolean restorecon(File file)
   恢复文件为默认的安全上下文。如果系统没有包含SElinux或者处于关闭状态,都会自动返回true
file 文件对象.
操作成功则返回true
如果file为null会抛NullPointerException异常



Android init语言对SELinux的扩展
Android的init进程语言已经被扩展成为能够支持SELinux,见表3。完整的Android init语言描述见system/core/init/readme.txt文件

表3:SELinux init 扩展
seclabel <securitycontext>

在服务在运行之前修改其安全上下文,主要用在位于rootfs分区的服务,比如ueventd, adbd。而位于system分区的服务,则可以通过transitions规则进行修改,如果没有指定transition规则,那么默认就是init context

restorecon <path>

根据file_contexts的配置恢复指定路径的文件安全上下文. 

setcon <securitycontext>

设置当前进程的安全上下文。这一般用在early-init里设置init进程的安全上下文用的(见下面使用示例)。

setenforce 0|1

设置SELinux工作模式. 0 代表 permissive , 1 代表 enforcing。

setsebool <name> <value>

设置SELinux的布尔值

<value> 可以是 1|true|on 或者 0|false|off

使用示例见下面init文件的片断:

# system/core/rootdir/init.rc

...
on early-init
    # Set init and its forked children's oom_adj.
write /proc/1/oom_adj -16

    # Set the security context for the init process.
    # This should occur before anything else (e.g. ueventd) is started.
setcon u:r:init:s0
start ueventd
...
on boot
...
service ueventd /sbin/ueventd
    class core
    critical
    seclabel u:r:ueventd:s0
# device/generic/goldfish/init.goldfish.rc

...
on boot
    setsebool in_qemu 1
    restorecon /sys/qemu_trace/process_name
    restorecon /sys/qemu_trace/state
    restorecon /sys/qemu_trace/symbol
...


 类似资料: