service获取selinux权限_SELinux学习笔记

bf45125fbc1fa3599956f0e5f97df77e.png

1 SEAndroid

1.1 查看系统selinux状态

Linux系统一般可以通过命令getenforce命令查看系统的selinux是否开启了。Android系统是基于Linux内核开发的,所以也可以通过getenforce命令进行查看。

1762439a62e36bebd397dabf068298c8.png

selinux有下面三种状态,也就是getenforce命令返回的结果:

1. Disabled // selinux未启用

2. Enforcing // selinux 处于开启状态(强制模式)

3. Permissive // selinux 处于关闭状态(只给出警告,)(宽容模式)

1.2 selinux开关及配置

从kernel彻底关闭SELinux,可以修改kernel的config文件,拿掉CONFIG_SECURITY_SELINUX=y。这里是配置kernel是否开启SELinux模块。

通过Linux kernel的启动参数bootargs进行SELinux配置。可以配置为enforcing和permissive模式。androidboot.selinux=permissive

使用命令setenforce 0暂时关闭SELinux,重启失效,一般多用于调试使用。

1.3 Android系统selinux策略修改

Android系统的SELinux策略文件位于Android/system/sepolicy/目录。

10a07f72ccfb287e252930cade811ea4.png

编译之后生成到system/etc/selinux/和vendor/etc/selinux/路径:

7020d07c7551fcd5bc7d25c7a297779b.png

1.3.1 selinux策略修改

7bade2b62e8914265966696e5169e710.png

一般情况下,不要修改Android系统原生的策略。可以通过在自己的device下面增加sepolicy文件夹,然后设置BOARD_SEPOLICY_DIRS属性。在新增的sepolicy文件夹里面增加自己的selinux策略。

541934d9edeb91441218938599734a06.png

1.3.2 修改后快速验证

sepolicy模块可以独立编译:mmm system/sepolicy 或者 make sepolicy。

8b7ecda461a96dfb58a5d6de3e01a8af.png

1.3.3 注意

添加sepolicy可能会导致系统编译失败,这个时候可以搜索关键字"Error while expanding policy"。

1.4 调试及问题分析

任何非法操作都会被阻止,并且尝试进行的所有违规行为都会被内核记录并打印到dmesg和logcat中。

1.4.1 怎样提取SELinux log?

从kernel日志提取:dmesg/(cat /proc/kmsg) | grep avc。

从logcat日志提取:logcat -b events | grep avc。

1.4.2 实例

4e6daa021f64cf999d414f3b52ab304a.png

这个问题的产生是,系统增加了属性ro.kdp.devicetype,生成到vendor/build.prop,init进程设置这个属性的时候,不成功。

上面这段日志是,vendor_init对default_prop执行property_service的set操作被阻止。

查看系统的sepolicy,可以知道这个操作是被禁止的,如下:

system/sepolicy/public/domain.te

73435f5676437a57ca9f3585355bd267.png

搜索一下,vendor_init对vendor_default_prop是有property_service的set操作权限的:

system/sepolicy/public/vendor_init.te

6fbe66baf177a0b889b6f686ca250571.png

set_prop是te macro,定义在system/sepolicy/public/te_macros文件里面。

属性的默认上下文都是default_prop(不明确设置的情况下)。所以,这个问题只需要设置一下新增属性的ro.kdp.devicetype的安全上下文即可:

system/sepolicy/private/property_contexts(最好添加到device下面新增的sepolicy里面)

7a1617d82c1966e7f7591c1de97a68b1.png

2 SELinux

2.1 简介

SELinux: Secure Enhanced Linux, 是美国国家安全局(NSA=The National Security Agency)和 SCC(Secure Computing Corporation)开发的 Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中。SELinux是为了提高系统的安全性,非法操作都会被阻止,并且尝试进行的所有违规操作都会被内核记录到dmesg和logcat。

访问控制涉及到两个概念:DAC(自由访问控制)、MAC(强制访问控制)。访问控制表述的是进程和文件的关系。访问是对文件的,控制是对进程的。DAC环境下,进程是无束缚的;MAC环境下,进程是可以被限制的。

在传统的Linux中,一切皆文件,由用户、组权限控制访问。

在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素控制其访问所有文件和端口资源和进程都具备安全标签:安全上下文(security context)。

访问控制,表述的是进程对资源(文件和端口)的访问控制。

SELinux运行原则是:所有没有明确指定为allow的操作都会被拒绝。

Permissive mode, 会有denials的log,但是不会强制执行。在前期porting的时候可以使用这种mode。

Enforcing mode, 会有denials的log,也会强制执行。在基本跑通之后还是尽快切到这个mode,尽早发现更多问题。

2.2 传统Linux

文件的权限有三种:读(r)、写(w)、执行(x)。文件属于用户和组。

464e01bc6c44aa83df9d20373b645046.png

通过ll(或者ls -l)可以查看文件的属性,依次是:user、group、other。后面的system和root分别表示文件所属于的用户和组。

进程会有一个user,当进程对文件进行访问的时候,会根据文件属性做权限判断和控制。

2.3 安全元素

User:指登录系统的用户类型。如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程。

Role:定义文件、进程和用户的用途。文件:object_r,进程和用户:system_r。

Type:指定数据类型。规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务公用:public_conten_t。

Sensitivity:限制访问需要。由组织定义的分层安全级别,如unclassified,secret,top,secret,一个对象有且只要一个sensitivity,分0-15级,s0最低,Target策略默认使用s0。

Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret,一个对象可以有多个catagroy,c0-c1-23共1024个分类,Target策略不适用category。

3055815d2d1c1af28a04584d1ac58616.png

Android系统的/vendor/build.prop文件的selinux信息,依次为user:role:type:sensitivity。type为vendor_file。

48f1c7ff5d89f407d9c6f57d7c2e62f5.png

Android系统的zygote进程的selinux信息,依次为user:role:type:sensitivity。type为zygote。

2.4 安全上下文

安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),"域"和"域类型"意思都一样,即都是安全上下文中的"TYPE"。

956dcfc7321806e113f670bcd2ae6a9f.png

安全上下文,存放在文件系统中,可以通过命令"ls -Z"和"ps -Z"查看详细信息。

2.4.1 上下文定义

file_contexts 文件上下文

property_contexts 属性上下文

genfs_contexts 虚拟文件系统上下文

service_contexts service上下文

seapp_contexts app安全上下文

port_contexts 端口上下文

system/sepolicy/private/file_contexts

c415de942f82cf987cd630b994a38b15.png

文件的上下文定义在file_contexts里面,以行为单位,前面是文件路径,后面是文件上下文。

属性、虚拟文件系统、端口等,依次在对应的*contexts文件中定义。即contexts文件中定义的是安全上下文

2.5 Selinux策略

对象(object):所有可以读取的对象,包括文件、目录、进程、端口等。

主体(subject):进程称为主体。

安全策略:定义主体读取对象的规则类数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝,并且定义了哪种行为是允许或拒绝。

当一个subject试图访问一个object,Kernel中的策略执行服务将检查AVC,在AVC中,subject和object的权限被缓存,查找"应用+文件"的安全环境,然后根据查询结果允许或拒绝访问。

001a462932b9dee2866534dac7a79d98.png

依次为:allow scontext tcontext:tclass oprations;

2.5.1 策略定义

system/sepolicy/users -> 其实是将user与roles进行了关联,设置了user的安全级别,s0为最低级是默认的级别,mls_systemHigh是最高的级别。

system/sepolicy/roles -> Android中只定义了一个role,名字就是r,将r和attribute domain关联起来。

external/sepolicy/security_classes -> 指的是上文命令中的class,个人认为这个class的内容是指在android运行过程中,程序或者系统可能用到的操作的模块。

external/sepolicy/attributes -> 所有定义的attributes都在这个文件。

external/sepolicy/access_vectors -> 对应了每一个class可以被允许执行的命令

external/sepolicy/te_macros -> 系统定义的宏全在te_macros文件。

external/sepolicy/*.te -> 一些配置的文件,包含了各种运行的规则。

users和roles是Android系统预先定义好的,基本不会用到,只是在上下文中占据前面两个字段。

security_classes对应TE语句的tclass。access_vectors里面包含每个tclass的oprations。*.te文件定义的是se规则,用到的所有宏(函数)都在te_macros文件里面定义。

2.5.2 TE规则

在TE中,多有东西都被抽象成类型,属性是类型的集合。

类型声明:

0a2cc2aefda826fdd8f6bef57b85988e.png

属性声明:

09808efd102a6339e8f4944c887d15ee.png

关联类型和属性:

880b6c89a4a7e98e85373c81efbcede9.png

3 总结

在分析时时刻牢记,TE规则描述的是主体对客体访问的许可。TE的最小单位是类型,这个概念抽象了主体和客体。每个主体对客体执行某种许可,都需要有对应的av规则描述,否则就会失败。在实际项目过程中如果碰到相关的问题,可能就需要修改te文件,编辑相关的操作许可。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值