Android Sepolicy 介绍及配置

04-27 1434阅读

前言

最近在一个安卓项目中遇到了关于 audit 的打印信息,如下:

03-06 14:02:20.386  3008  3008 I xxxxxx: type=1400 audit(0.0:455989): avc: denied { ioctl } for path="/proc/vidin_adapt" dev="proc" ino=4026533030 ioctlcmd=0x4536 scontext=u:r:system_app:s0 tcontext=u:object_r:proc:s0 tclass=file permissive=1
03-06 14:02:26.326  3301  3301 W audit   : audit_lost=448673 audit_rate_limit=5 audit_backlog_limit=64
03-06 14:02:26.326  3301  3301 E audit   : rate limit exceeded

对内核中的 audit 机制不是很了解,参考 SDK 的文档学习一下。

一、Android Sepolicy

1. SeAndroid 简介

  SeAndroid 指的是安卓系统中的安全增强功能,全称为 Security-Enhanced Android。它是基于SELinux(Security-Enhanced Linux)的安全机制,在安卓系统中提供了更加细粒度的安全控制和权限管理。

SeAndroid 的作用包括但不限于以下几个方面:

  强化安全性:SeAndroid通过实施强制访问控制(MAC)策略,限制了应用程序和进程对系统资源(如文件、设备、网络等)的访问权限。这有助于防止恶意应用程序获取系统敏感信息或对系统进行破坏。

  隔离应用:SeAndroid可以根据定义的安全策略,将不同应用程序之间进行隔离,防止恶意应用程序跨应用攻击或数据泄露。

  保护系统完整性:SeAndroid可以防止未经授权的修改系统文件或关键资源,确保系统的完整性和稳定性。

审计和监控:SeAndroid可以记录和监控系统的安全事件,包括违反安全策略的行为,帮助管理员进行安全审计和故障排查。

  定制策略:SeAndroid允许管理员根据实际需求定制安全策略,以适应不同的安全要求和环境。

  总的来说,SeAndroid在安卓系统中扮演着重要的安全角色,提高了系统的安全性和稳定性,使得用户和系统数据更加安全。通过细粒度的访问控制和权限管理,SeAndroid有效地减少了系统受到恶意攻击的风险,为安卓系统的安全提供了一定保障。

2. SeAndroid 安全策略

  安全上下⽂实际上就是⼀个附加在对象上的标签(label)。这个标签实际上就是⼀个字符串,它由四部分内容组成,分别是 SELinux ⽤户、SELinux ⾓⾊、类型、安全级别,每⼀个部分都通过⼀个冒号来分隔,格式为 “user:role:type:rank”。可通过 ps -Z 命令查看,如下所⽰:

Android Sepolicy 介绍及配置

最左边的那⼀列是进程的 SContext,以第⼀个进程 init 的 SContext 为例,其值为u:r:init:s0,其中:

u 为 user 的意思。SEAndroid 中定义了⼀个 SELinux ⽤户,值为u。
r 为 role 的意思。role 是⾓⾊之意,它是 SELinux 中⼀种⽐较⾼层次,⼀个 u 可以属于多个 role,不同的 role 具有不同的权限。
init,代表该进程所属的 Domain 为 init,是这个进程 type,在 andorid ⾥⾯,定义了 100 多个type。按照⽬前我的理解,这个是进程所属的类型。
S0 是⼀个安全的等级MLS将系统的进程和⽂件进⾏了分级,不同级别的资源需要对应级别的进程
 才能访问。

3. 工作模式

  在 SeAndroid 中,有两种主要的工作模式:Enforcing Mode(强制模式)和Permissive Mode(宽松模式)。

Enforcing Mode(强制模式):

  在强制模式下,SeAndroid会严格执行安全策略规则,并拒绝所有未经授权的访问尝试。如果应用程序或进程试图执行不符合安全策略规则的操作,SeAndroid将会阻止该操作,并记录相关的安全事件。

  强制模式提供了最高级别的安全保护,确保系统资源不受未经授权的访问,因此被认为是更加安全的模式。

Permissive Mode(宽松模式):

  在宽松模式下,SeAndroid 仍然会执行安全策略规则,但对于违反规则的访问尝试,系统不会立即阻止,而是会记录相关的安全事件并允许操作继续进行。宽松模式通常用于调试和开发目的,因为它允许系统管理员查看哪些操作会触发安全策略规则的违反。

  宽松模式可能会降低系统的安全性,因为一些未经授权的访问可能会被允许,从而增加系统受到攻击的风险。

选择使用哪种模式取决于具体的安全需求和系统管理目标。在实际生产环境中,通常会选择Enforcing Mode以获得更高级别的安全保护,而在开发和调试过程中可能会暂时切换到Permissive Mode以便于排查和调试安全策略相关的问题。

二、Sepolicy 相关问题确认

  如果出现了 selinux 相关的权限拒绝,则在 kernel log 或者 android log 中都有对应的 ”avc:denied”,当然也可能和 selinux 的模式有关系,我们需要⾸先要确认当时 SELinux 的模式, 是enforcing mode 还是 permissve mode。如果问题容易复现,我们可以先将 SELinux 模式调整到 Permissive mode,然后再测试确认是否与 SELinux 约束相关。

1.日志信息确认

  selinux报错的信息,看下此 log 的末尾,如有 permissive=0,说明此log有效。permissive=1 说明只是提⽰,不会造成问题,但是如果一直在刷,也会把日志空间占满。

2.模式设置

getenforce,结果显⽰ permissive 即兼容模式,enforcing 则强制模式。
setenforce 0 设置 SELinux 成为permissive模式,临时关闭selinux
setenforce 1 临时打开 selinux

三、Sepolicy Rule 添加

1.search 权限

audit(1444651438.800:8): avc: denied { search } for pid=158 comm="setmacaddr"
name="/" dev="nandi" ino=1 scontext=u:r:engsetmacaddr:s0
tcontext=u:object_r:vfat:s0 tclass=dir permissive=0
缺少什么权限: 缺少 search 权限
谁缺少权限: engsetmacaddr
对哪个节点缺少权限: vfat
什么类型的⽂件: dir
最后输⼊的命令:
allow engsetmacaddr vfat:dir { search }; 

2.write 权限

auditd ( 627): avc: denied { write } for pid=15848 comm=“system_server”
 name=“enable” dev=“sysfs” ino=9381 scontext=u:r:zygote:s0
 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
缺少什么权限: 缺少 write 权限
谁缺少权限: scontext=u:r:zygote:s0
对哪个⽂件缺少权限: tcontext=u:object_r:sysfs:s0
什么类型的⽂件: tclass=file
最后输⼊的命令:
allow zygote sysfs:file write

3.read 权限

audit(1441759284.810:5): avc: denied { read } for pid=1494 comm="sdcard"
 name="0" dev="nandk" ino=245281 scontext=u:r:sdcardd:s0
 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=0
缺少什么权限: 缺少 read 权限
谁缺少权限: sdcardd
对哪个⽂件缺少权限: system_data_file
什么类型的⽂件: dir
最后输⼊的命令:
allow sdcardd system_data_file:dir read

4.ioctl 权限

例1 -- 针对ioctl的特殊说明
audit(1444651438.800:8): avc: denied { ioctl } for path="/dev/cmx_ddlsw" dev="tmpfs" ino=10422
 ioctlcmd=4d02 scontext=u:r:system_server:s0
 tcontext=u:object_r:cmx_ddlsw_device:s0 tclass=chr_file permissive=0
在rules中添加ioctl后,还需要声明具体的iocmd,必须结合源代码添加,例如:
    allow system_server cmx_ddlsw_device:file { ioctl };
    allowxperm system_server cmx_ddlsw_device:file ioctl { 0x4d02 };

四、关闭 audit 打印

  上面的修改比较繁琐,如果我们仅仅是不需要 audit 功能,我们可以将它关闭,只需要给 bootargs 参数赋值 audit=0,就可以了。

  简单罗列一下审计的概念及作用

  在计算机系统中,内核中的审计(audit)是一种安全机制,用于记录系统中的关键操作和事件,以便于后续的安全审计、故障排除和追踪。审计功能通常由操作系统内核提供,并提供了一种监控和记录系统活动的手段。

下面是关于内核中审计的一些基本概念和特点:

  审计规则和策略:审计功能通过定义审计规则和策略来确定需要监控和记录的事件类型。这些规则可以根据不同的需求和安全要求进行配置,比如监视文件访问、进程创建、网络连接等。

  审计日志:审计功能会将记录的事件和操作存储在审计日志中,用于后续的审计分析。审计日志通常以一种结构化的格式存储,包含时间戳、事件类型、相关主体和对象的标识等信息。

  审计事件:审计功能可以监视和记录各种事件,如文件访问、用户登录、系统调用等。这些事件可以提供有关系统活动的详细信息,帮助发现潜在的安全问题和异常行为。

  审计策略引擎:内核中的审计功能通常由一个审计策略引擎负责实现和管理。该引擎根据配置的审计规则,监视系统活动并生成相应的审计日志记录。

  审计分析和报告:通过审计日志,安全管理员可以进行审计分析和报告,以检测潜在的安全威胁、追踪异常行为和满足合规要求。审计分析工具可以帮助管理员对大量的审计日志数据进行搜索、过滤和分析。

  审计功能在保护系统安全、探测威胁和满足合规性方面具有重要作用。它可以提供对系统活动的全面可见性,并支持安全团队进行实时监控和后续的审计分析,以确保系统的安全性和稳定性。

  SeAndroid(Security-Enhanced Android)和审计功能在安全领域中有密切的关联性,它们可以相互配合以提供全面的安全防护和审计追踪。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]