Android强烈建议OEM全面测试其SELinux实现。制造商在实现SELinux时,应先在一组测试设备上施行政策策。
施行政策策后,您可以通过执行getenforce命令来确认SELinux在设备上的运行模式是否正确。
该命令会输出全局SELinux模式:强制或宽恕。如需确定每位域的SELinux模式,您必须复查相应的文件android内核 linux内核,或运行带有相应(-p)标记的最新版sepolicy-analyze(坐落/platform/system/sepolicy/tools/中)。
读取拒绝风波
检测是否有错误,错误会以风波日志的方式传给dmesg和logcat,并可在设备上从本地查看。制造商应先检测这种设备上传给dmesg的SELinux输出并优化设置,之后再在宽恕模式下公开发布,最后切换到强制模式。SELinux日志消息中包含“avc:”字样android内核 linux内核,因而可使用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
该输出的剖析如下:
我们再瞧瞧另一个示例:
adb shell su root dmesg | grep 'avc: '
输出:
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
以下是此拒绝风波的关键元素:
存贮用户和内核堆栈
在个别情况下中文linux操作系统,风波日志中包含的信息不足以查明拒绝风波的来源。一般,获取调用链(包括内核和用户空间)有助于更好地了解发生拒绝风波的诱因。
最新的内核定义了一个名为avc:selinux_audited的跟踪点。使用Androidsimpleperf可启用此跟踪点并获取调用链。
支持的配置获取调用链
第一步是使用simpleperfrecord录制风波:
adb shell -t "cd /data/local/tmp && su root simpleperf record -a -g -e avc:selinux_audited"
接出来,应触发引起拒绝风波的风波。以后,应停止录制。在此例中应使用Ctrl-c获取样本:
^Csimpleperf I cmd_record.cpp:751] Samples recorded: 1. Samples lost: 0.
最后,可使用simpleperfreport检测获取的堆栈轨迹。诸如:
adb shell -t "cd /data/local/tmp && su root simpleperf report -g --full-callgraph" [...] Children Self Command Pid Tid Shared Object Symbol 100.00% 0.00% dmesg 3318 3318 /apex/com.android.runtime/lib64/bionic/libc.so __libc_init | -- __libc_init | -- main toybox_main toy_exec_which dmesg_main klogctl entry_SYSCALL_64_after_hwframe do_syscall_64 __x64_sys_syslog do_syslog selinux_syslog slow_avc_audit common_lsm_audit avc_audit_post_callback avc_audit_post_callback
里面的调用链是一个统一的内核和用户空间调用链,可发起跟踪从用户空间直至内核中发生拒绝风波的位置,让您更好地查看代码流。如需详尽了解simpleperf,请参阅Simpleperf可执行文件命令参考。
切换到包容模式注意:生产设备不支持包容模式。CTS测试会确认是否已启用强制模式。
SELinux强制模式可以在userdebug或engbuild中通过ADB停用。因此linux 下载,请先运行adbroot以将ADB切换为root权限。之后,如需停用SELinux强制模式,请运行以下命令:
adb shell setenforce 0
或在内核命令行中输入以下命令(适用于设备开发早期):
androidboot.selinux=permissive
androidboot.selinux=enforcing
或使用Android12中的bootconfig功能:
androidboot.selinux=permissive
androidboot.selinux=enforcing
使用audit2allow注意:AOSP不再提供audit2allow。请使用Linux发行版提供的软件包(Debian和Ubuntu上为policycoreutils-python-utils软件包)。
audit2allow工具可以获取dmesg拒绝风波并将其转换成相应的SELinux新政申明。因而,该工具有助于急剧推进SELinux开发速率。
如需使用该工具,请运行以下命令:
adb pull /sys/fs/selinux/policy
adb logcat -b events -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给出的申明建议只是一个大致的基础。在添加这种申明后,您可能须要修改来源域和目标标签,并列入适当的宏,就能实现良好的新政配置。有时,应对拒绝风波的合理方法不是修改新政,而是修改违法的应用。
文章评论