android本地验证,验证 SELinux  |  Android 开源项目  |  Android Open Source Project

Android 强烈建议 OEM 全面测试其 SELinux 实现。制造商在实现 SELinux 时,应先在一组测试设备上实施新政策。

实施新政策后,您可以通过执行 getenforce 命令来确认 SELinux 在设备上的运行模式是否正确。

该命令会输出全局 SELinux 模式:强制或宽容。如需确定每个域的 SELinux 模式,您必须检查相应的文件,或运行带有相应 (-p) 标记的最新版 sepolicy-analyze(位于 /platform/system/sepolicy/tools/ 中)。

读取拒绝事件

检查是否有错误,错误会以事件日志的形式传给 dmesg 和 logcat,并可在设备上从本地查看。制造商应先检查这些设备上传给 dmesg 的 SELinux 输出并优化设置,然后再在宽容模式下公开发布,最后切换到强制模式。SELinux 日志消息中包含“avc:”字样,因此可使用 grep 轻松找到。您可以通过运行 cat /proc/kmsg 来获取当前的拒绝事件日志,也可以通过运行 cat /sys/fs/pstore/console-ramoops 来获取上次启动时的拒绝事件日志。

根据这些输出内容,制造商可以轻松发现系统用户或组件违反 SELinux 政策的行为。然后,制造商便可更改相应软件和/或 SELinux 政策,以防范此类恶意行为。

具体来说,这些日志消息会指明在强制模式下哪些进程会失败以及失败原因。示例如下:

avc: denied { connectto } for pid=2671 comm="ping" path="/dev/socket/dnsproxyd"

scontext=u:r:shell:s0 tcontext=u:r:netd:s0 tclass=unix_stream_socket

该输出的解读如下:

上方的 { connectto } 表示执行的操作。根据它和末尾的 tclass (unix_stream_socket),您可以大致了解是对什么对象执行什么操作。在此例中,是操作方正在试图连接到 UNIX 信息流套接字。

scontext (u:r:shell:s0) 表示发起相应操作的环境,在此例中是 shell 中运行的某个程序。

tcontext (u:r:netd:s0) 表示操作目标的环境,在此例中是归 netd 所有的某个 unix_stream_socket。

顶部的 comm="ping" 可帮助您了解拒绝事件发生时正在运行的程序。在此示例中,给出的信息非常清晰明了。

我们再看看另一个示例:

adb shell su root dmesg | grep 'avc: '

输出:

<5> type=1400 audit: avc: denied { read write } for pid=177

comm="rmt_storage" name="mem" dev="tmpfs" ino=6004 scontext=u:r:rmt:s0

tcontext=u:object_r:kmem_device:s0 tclass=chr_file

以下是此拒绝事件的关键元素:

操作 - 试图进行的操作会使用括号突出显示:read write 或 setenforce。

操作方 - scontext(来源环境)条目表示操作方;在此例中为 rmt_storage 守护程序。

对象 - tcontext(目标环境)条目表示对哪个对象执行操作;在此例中为 kmem。

结果 - tclass(目标类别)条目表示操作对象的类型;在此例中为 chr_file(字符设备)。

切换到宽容模式

注意:生产设备不支持宽容模式。CTS 测试会确认是否已启用强制模式。

SELinux 强制模式可以在 userdebug 或 eng build 中通过 ADB 停用。为此,请先运行 adb root 以将 ADB 切换为 root 权限。然后,如需停用 SELinux 强制模式,请运行以下命令:adb shell setenforce 0

或在内核命令行中输入以下命令(适用于设备开发初期):

androidboot.selinux=permissive

androidboot.selinux=enforcing

使用 audit2allow

selinux/policycoreutils/audit2allow 工具可以获取 dmesg 拒绝事件并将其转换成相应的 SELinux 政策声明。因此,该工具有助于大幅加快 SELinux 开发速度。audit2allow 包含在 Android 源代码树中,会在您基于源代码构建 Android 时自动编译。

如需使用该工具,请运行以下命令:

adb pull /sys/fs/selinux/policy

adb logcat -b all -d | audit2allow -p policy

注意:运行这些命令不会更改 bugreport.txt,因为所有日志都已经存在,包括上次重新启动之前存在的日志。在设备进行 OTA 更新或向设备刷入开发版系统时,新旧违规行为会混杂在一起,直到下一次重新启动为止。如需解决此问题,请重新启动设备,或者从您的错误报告中滤除 console-ramoops 和 LAST_LOGCAT。

不过,请务必仔细审核要添加到政策中的条目,以免出现权限过宽的情况。例如,如果将上面的 rmt_storage 拒绝事件输入到 audit2allow 中,会生成以下 SELinux 政策声明建议:

#============= shell ==============

allow shell kernel:security setenforce;

#============= rmt ==============

allow rmt kmem_device:chr_file { read write };

这会授予 rmt 向内核内存写入内容的权限,从而形成明显的安全漏洞。通常情况下,audit2allow 给出的声明建议只是一个大致的基础。在添加这些声明后,您可能需要更改来源域和目标标签,并纳入适当的宏,才能实现良好的政策配置。有时,应对拒绝事件的合理方式不是更改政策,而是更改违规的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值