内核LSM和SELinux的支持
文章 Security Enhanced (SE) Android: Bringing Flexible MAC to Android对内核的修改情况做了很好的描述,下面主要讲一下为支持Binder IPC服务所作的变化:
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 | 设置一个属性 |
命令 | 注释 |
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] |
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异常 |
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 ...