Android Selinux详解[一]---整体介绍

    Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。

    借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。

    SELinux 按照默认拒绝的原则运行:任何未经明确允许的行为都会被拒绝。SELinux 可按两种全局模式运行:

  • 宽容模式permissive:权限拒绝事件会被记录下来,但不会被强制执行。
  • 强制模式enforcing:权限拒绝事件会被记录下来强制执行.

下面大概介绍一下工作中经常遇到的Selinux相关知识

目录

1. 如何打开/关闭Selinux

1.1 打开Selinux

1.2 关闭Selinux

2. 关于Android12 高通平台Selinux的目录介绍

2.1 原生Sepolicy目录

2.2 QSSI侧Sepolicy定制目录

 2.3 VENDOR侧Sepolicy定制目录

3. 一些使用场景的分析

3.1 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们想让它被vendor侧访问,应该在哪里添加type才能被vendor侧访问呢?

3.2 假如我们的功能都实现在VENDOR侧,实现的是一个hal服务, 我们想让它被system侧访问,应该在哪里添加type才能被system侧访问呢?

3.3 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们不想让它被vendor侧访问,应该在哪里添加type才能不被vendor侧访问呢?

3.4 假如我们的功能都实现在VENDOR侧,实现的是一个HAL服务, 我们不想让它被system侧访问,应该在哪里添加type才能不被system侧访问呢?


1. 如何打开/关闭Selinux

1.1 打开Selinux

打开Selinux即将Selinux处于enforcing模式,所以权限事件都会被记录下来并强制执行。

    adb root

    adb shell setenforce 1

    adb shell getenforce
      Enforcing           (返回结果)

如果Selinux处于打开状态下,权限事件的log如下, 可以看到permissive=0,即可以确定当前处于enforcing模式,这时候test进程是不可以读取test.json的,会被明确拒绝。

01-01 20:15:07.355  1035  1035 I auditd  : type=1400 audit(0.0:23): avc: denied { read } for comm="test" name="test.json" dev="sda12" ino=25609 scontext=u:r:test:s0 tcontext=u:object_r:test_file:s0 tclass=file permissive=0 

1.2 关闭Selinux

关闭Selinux即将Selinux处于permissive模式,所以权限事件都会被记录下来,但不会强制执行。

    adb root

    adb shell setenforce 0

    adb shell getenforce
      Permissive     (返回结果)

如果Selinux处于关闭状态下,权限事件的log如下, 可以看到permissive=1,即可以确定当前处于permissive模式,这时候test进程可以读取test.json的,虽然log也打印出来了,但是这个log只是打印出来供用户读取,并不会起到任何拒绝的作用

01-01 20:15:07.355  1035  1035 I auditd  : type=1400 audit(0.0:23): avc: denied { read } for comm="test" name="test.json" dev="sda12" ino=25609 scontext=u:r:test:s0 tcontext=u:object_r:test_file:s0 tclass=file permissive=1

2. 关于Android12 高通平台Selinux的目录介绍

Android 12 上,高通的主目录分为两个,一个是QSSI, 一个是VENDOR,  QSSI下存放着Android原生的一些东西, VENDOR下放着厂商定制的东西。Selinux策略sepolicy在QSSI和VENDOR下都有,sepolicy分为原生sepolicy 和厂商自己定制的sepolicy

2.1 原生Sepolicy目录

请不要在原生的sepolicy目录下修改文件,否则会导致CTS失败。请在Sepolicy定制目录下根据需求添加。

根目录子目录编译后的生成路径如果在这个目录下定义一个新的type,system/vendor访问限制

QSSI/system

/sepolicy/

privateout/target/product/qssi/
system/etc/selinux
system可以访问,vendor无法访问
publicout/target/product/qssi/
system/etc/selinux
system,vendor都可访问
private/compat------当在system/sepolicy/public新增一个type的时候,需要在compat/api/api.ignore.cil中添加这个新增的标签,否则会编译失败

2.2 QSSI侧Sepolicy定制目录

QSSI侧Sepolicy定制目录,如果是我们自己添加Selinux策略,请添加到此处,

根目录子目录编译后的生成路径如果在这个目录下定义一个新的type,system/vendor访问限制
QSSI/device/
qcom/sepolicy/
generic/

private

out/target/product/qssi/
system_ext/etc/selinux
system可以访问,vendor无法访问
publicout/target/product/qssi/
system_ext/etc/selinux
system,vendor都可访问
private/compat-----当在device/qcom/sepolicy/generic/public新增一个type的时候,需要在compat/api/api.ignore.cil中添加这个新增的标签,否则会编译失败

 2.3 VENDOR侧Sepolicy定制目录

VENDOR侧Sepolicy定制目录

根目录子目录编译后的生成路径如果在这个目录下定义一个新的type,system/vendor访问限制
VENDOR/device/
qcom/
sepolicy_vndr/
generic/
vendor/

common

所有芯片共用的

out/target/product/qssi/
vendor/etc/selinux
vendor可以访问,system无法访问
还有其他子目录,分别是不同的芯片不同的sepolicy

3. 一些使用场景的分析

3.1 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们想让它被vendor侧访问,应该在哪里添加type才能被vendor侧访问呢?

    答案是,在QSSI/device/qcom/sepolicy/generic/public下添加相关的type声明,并在QSSI/device/qcom/sepolicy/generic/private/compat/api/api.ignore.cil中添加这个新增的标签。

allow语句在哪里添加都可以

3.2 假如我们的功能都实现在VENDOR侧,实现的是一个hal服务, 我们想让它被system侧访问,应该在哪里添加type才能被system侧访问呢?

    答案是,在QSSI/device/qcom/sepolicy/generic/public下添加相关的type声明,并在QSSI/device/qcom/sepolicy/generic/private/compat/api/api.ignore.cil中添加这个新增的标签。

allow语句在哪里添加都可以

3.3 假如我们的功能都实现在QSSI侧,实现的是一个系统服务, 我们不想让它被vendor侧访问,应该在哪里添加type才能不被vendor侧访问呢?

答案是,在QSSI/device/qcom/sepolicy/generic/private下添加相关的type声明,并且只能在这个目录下添加相关allow语句。

3.4 假如我们的功能都实现在VENDOR侧,实现的是一个HAL服务, 我们不想让它被system侧访问,应该在哪里添加type才能不被system侧访问呢?

答案是,在VENDOR/device/qcom/sepolicy_vndr/generic/vendor/common下添加相关的type声明,并且只能在这个目录下添加相关allow语句。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值