Android Selinux 权限配置

1.SElinux三种权限:

enforcing:强制模式、代表SELinux运行中,且已经正确的开放限制 domain/type

permissive:宽容模式、代表SELinux运行中,不过金会有警告信息并不会直接限制 domian/type

disabled:关闭模式、SELinux 关闭状态

2.基础权限的配置

比如内核报这样的错:

[  172.554381] type=1400 audit(22611.739:4): avc:  denied  { getattr } for  pid=257 comm="demo" path="/system/rfs" dev="mmcblk0p42" ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0

[  173.287498] type=1400 audit(22612.479:5): avc:  denied  { relabelfrom } for  pid=257 comm="demo" name="rfs" dev="mmcblk0p42" ino=2070 scontext=u:r:recovery:s0 tcontext=u:object_r:rfs_system_file:s0 tclass=dir permissive=0123

在相应的te、文件中增加语句,语句格式为:

allow sourcecontext targetcontext:class 许可;

sourcecontext指的是“scontext=u:r:recovery:s0”recovery

targetcontext指的是“tcontext=u:object_r:rfs_system_file:s0”中的rfs_system_file

class指的是“tclass=dir中的dir

许可指的是“{}”中的getattr

所以在demo.te中增加语句:

allow recovery rfs_system_file:dir getattr;

另外的下一行的报错语句增加权限的是

allow recovery rfs_system_file:dir relabelfrom;

3.特殊权限Ioctl配置

08-07 10:49:20.149 4795 4795 I iwpriv : type=1400 audit(0.0:3457): avc: denied { ioctl } for path="socket:[1607798]" dev="sockfs" ino=1607798 ioctlcmd=8bfc scontext=u:r:system_app:s0 tcontext=u:r:system_app:s0 tclass=udp_socket permissive=1

从上面的日志来看,按照我们通用的添加权限的方式规则,应该如下:

allow system_app self:udp_socket ioctl;

但是实际效果如何???

操作依然被denied,这是由于ioctl的控制在底层划分的更细,需要允许对应ioctlcmd操作

具体方法为:

1、查找对应的ioctlcmd在ioctl_defines中的定义,如上文中的8bfc,对应的是SIOCIWFIRSTPRIV_1C在对应的系统中查看定义

2、在对应的文件加入如下的配置:

allowxperm system_app self:udp_socket ioctl SIOCIWFIRSTPRIV_1C;

这样,在ioctl操作时,对应的ioctlcmd就会被允许了。

4.新增APP类型

当前系统中app的domain和文件类型默认的分配原则为:

1、platform签名 + share systemuid -> system_app + system_app_data_file;

2、platform签名 + 普通用户-> platform_app + app_data_file;

3、platform签名 + 特定用户 : 如bluetooth,对应的domain为bluetooth + bluetooth_data_file

4、三方应用 -> untrusted_app + app_data_file

根据特性需求,需要新增app类型:

1、system/sepolicy/mac_permissions.xml

2、seapp_contexts

user=_app seinfo=theme name=com.nearme.themespace* domain=theme_app type=theme_app_data_file levelFrom=user

3、file.te

type theme_app_data_file, file_type, data_file_type;

4、theme_app.te

type theme_app, domain, mlstrustedsubject;

这样,签名是@THEME(定义在system/sepolicy/keys.conf文件)和包名是comthemespace的应用,domain是theme_app,对应的文件类型是theme_app_data_file

5.新增修改文件类型

如某些需求,需要新增文件类型,只允许特定的domain访问,如存放字体文件的目录,只允许主题应用写入和删除,其他domain只有读的权限。

1、file_contexts

/data/system/font(/.*)? u:object_r:font_data_file:s0

2、file.te

type font_data_file, file_type, data_file_type;

3、system/core/rootdir/init.rc

在restorecon_recursive /data之前加入:

mkdir /data/system/font 0777 system system

chmod 0777 /data/system/font

这样,adb shell ls -l -Z /data/system/font 查看到的就是上面配置的文件类型:

-rwxrwxrwx 1 u0_a18 u0_a18 u:object_r:font_data_file:s0:c512,c768 3553188 2017-08-19 16:40 Regular.ttf

6.新增可执行程序和service

init.rc中新增service,但没有对应的bin,一般通过sh脚本启动一些功能。这类service,需要在配置rc时,加上seclabel操作,之后,init启动service时,就会根据这个关键字解析出对应的context。以screen_record service为例

1、system/core/rootdir/init.rc

service screen_record /system/bin/sh /autochmod.sh "screen_record”

seclabel u:r:screen_record:s0

2、screen_record.te

type screen_record, domain;

type screen_record_exec, exec_type, file_type;

init_daemon_domain(screen_record)

binder_use(screen_record)

allow screen_record shell_exec:file {read open execute_no_trans execute getattr entrypoint};

allow screen_record rootfs:lnk_file {getattr};

allow screen_record rootfs:file {read open};

allow screen_record system_file:file { read open execute_no_trans };

allow screen_record toolbox_exec:file { read open execute_no_trans execute getattr};

allow screen_record self:capability dac_override;

allow screen_record self:process execmem;

如上,新增service需要的默认权限在步骤2中,需要的时候拷贝、修改screen_record为对应的service即可。

7.学会使用audit2allow

我们遇到需要添加权限很多的时候,下面列举一条看下效果:

avc: denied { create } for name="hsdi_tmp" scontext=u:r:system_app:s0 tcontext=u:object_r:protect_f_data_file:s0 tclass=dir permissive=0

当然我们可以一眼就知道怎么去添加了:

allow system_app  protect_f_data_file:dir create

将日志保存在test.txt中,然后执行audit2allow –i test.txt > test.te,打开test.te看到和我们手动得到的是一样的。

#============= system_app ==============

allow system_app protect_f_data_file:dir create;

当需要手动添加的数量比较多的时候,就体现出来audit2allow的方便了。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android SELinuxAndroid操作系统中的一种安全机制,它可以限制应用程序的访问权限,保护用户数据的安全性。SELinux是一种强制访问控制(MAC)机制,它通过强制规则来限制应用程序的访问权限,即使应用程序本身存在漏洞,也可以保护系统的安全性。Android SELinux的实现基于Linux内核的SELinux模块,它通过定义安全策略来控制应用程序的访问权限,包括文件系统、网络、进程等方面。Android SELinux的实现需要在系统级别进行配置,因此需要一定的技术知识和经验。 ### 回答2: 安卓的SELinux是一项安全功能,做到了不同级别权限间的隔离。它与Linux的SELinux相似,都是基于Mandatary Access Control(MAC)的实现。MAC使用了定义好的安全策略来决定进程访问对象的许可。每个对象有一个或多个安全标签,决定了可访问这些对象的访问者。SELinux实现了一个高度定制化的MAC实现,以达到保护系统免受攻击的效果。 SELinux可以将任何应用程序、库或系统进程在安全上互相隔离。每个进程可以分配一个不同的安全上下文,用于决定该进程可以执行的操作。SELinux允许管理员定义一个策略集,以确保只有那些拥有特定权限的应用程序可以执行特定的操作。SELinux包括以下4个组件。 * Security-enhanced kernel:该内核支持SELinux,并且为应用程序和系统提供安全保护。通常,操作系统上的SELinux是直接编译到内核配置中的。 * SELinux policy:这是一组规则,它定义了哪些进程可以访问哪些资源,以及何时可以访问它们。这是SELinux的“脑”。SELinux策略通过使用安全标签来标识资源和进程,并使用规则来决定它们之间的安全关系。 * SELinux utilities:这些社区提供的工具用于安装、更新和管理SELinux策略。通常情况下,管理员会安装每个Linux发行版自带的安全工具。 * SELinux-aware applications:这是应用程序和守护进程,它们能够在SELinux的约束下运行。这些应用程序还懂得如何处理SELinux策略,以确保它们对系统的安全有积极贡献。 总的来说,SELinux是一项强大而高度定制化的MAC实现,能够确保安卓系统和应用程序免受攻击。它通过一组规则定义了可用资源和进程之间的安全关系,从而在操作系统和应用层上实现了分离和隔离。作为一项优秀的安全保护功能,它能够在各种安卓设备上为用户提供强大的保护措施,从而发挥关键的作用。 ### 回答3: Android操作系统是目前全球手机、平板等终端设备最常用的操作系统之一。Android系统架构中有一个非常重要的安全机制,即SE_LINUX(Security-Enhanced Linux)。SE_LINUX是由美国国家安全局(NSA)和Redhat合作研发的一种新型操作系统,它基于强制性访问控制(Mandatory Access Control)机制,是一种可扩展的安全模型,功能十分强大。 Android系统使用SE_LINUX来保障应用程序的安全。在Android的SE_LINUX中,安全策略旨在为每个进程提供最佳的资源保护。当应用程序尝试访问受限制的资源时,安全策略会检查该应用程序的标记是否具有访问受限制资源的许可权,以确保安全性。如果没有访问权限,访问请求就会被拒绝,在应用程序层面上保证了Android系统的安全。 其中,SE_LINUX的工作原理是在内核上增加了一个“SELinux子系统”,具体实现过程如下:(1)在内核源代码中添加SELinux子系统;(2)在Linux 内核上开发安全模块;(3)编写用户空间程序和共享代码,实现SELinux规则和策略以及管理SELinux权限的机制。Android系统的SE_LINUX是基于SMLS架构,即安全、多层、标签、安全。 同时,SE_LINUX还为Android系统中的进程、文件系统、系统服务进行了标记化管理。每个进程都有一个唯一的SELinux安全上下文标签进行标识,涉及到的对象都会增加一个SELinux标签,当某个进程尝试访问某个对象时,它的SELinux上下文标签需要满足该对象的SELinux上下文标签的安全策略,否则该进程就会被降级或者拒绝访问该对象。 总之,Android SE_LINUX是Android操作系统架构中的重要安全机制,它通过强制性访问控制(Mandatory Access Control)机制来保护应用程序的安全,在访问受限制的资源时会进行检查、获取许可证以保证安全。SE_LINUX的工作原理是标记化管理,确保每个进程、文件系统、系统服务都对应一个唯一的安全标签,实现了权限的有效、高效管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值