SELinux on Android(四)

最近比较忙,在做新版的MVC框架,没更新文章。继续更。


  • 验证你当前SELinux的配置

 

安卓强力推荐OEM去测试他们的整个SELinux实现方案。当设备生产商实现自己的SELinux策略时,应该首先发布他们自己的策略在permissive mode状态下。如果可能,可以把新的策略应用到设备列表的测试池。

一旦予以应用,一定要确保SELinux是跑在正确的mode上,这可以通过下面命令实现:

getenforce

这将会打印全局SELinuxmode:或者disabled,或者enforcing或者permissive。请注意,这个命令仅仅显示全局SELinux mode。如果要为每个domain决定SELinux mode,你必须检查相应的文件。

然后检查错误。错误码是以事件日志的方式发送并存储在内核 dmesg中,并且你在本地设备上可以看见它。设备生产商应该在设备商的demsg中认真审查SELinux的输出,并在发布为permissive模式 之前,精炼和改善SELinux的策略配置,并最终使之成为enforcing mode。

利用这个内核dmesg,设备生产商可以轻易的确认系统用户或者系统组件什么时候违反了SELinux策略。设备生产商此时可以处理并解决掉这个恶意的行为:或者对软件做一些修改,或者对SELinux策略做一些修改,或者全都修改。

特别的,这些日志消息暗示着什么样的角色和什么样的进程会在策略加强下失败并且为什么会失败。下面是一个例子:

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

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

  • 解释说明:

l  上面的 { connectto } 代表到底做了什么操作。它和最后的tclass(unix_stream_socket)一起,粗略的告诉你“之前到底在谁身上发生了什么事情”。在这种 情况下,我们可以大概了解到,一些什么东西曾试图链接一个unix stream socket。

l  Scontext(u:r:shell:s0)告诉你这个曾发生的行为是在什么上下文。这里,我们可以看到有一个什么东西曾以shell的身份运行。

l  tcontext (u:r:netd:s0)告诉你曾发生过的行为的最终目标是谁。这里,我们可以看到目标是netd所拥有unix_stream_socket。

l  上面的comm="ping" 给你一个额外的提示:在denial日志产生的时候,当时正在运行什么。这里,我们就不多解释了:ping。

安卓会不断把这些信息拿过来仔细分析,并且改善默认的安全策略,以实现对SELinux策略稍加定制,就可以跑在更多地不同的安卓设备上。因为有这种机制,OEM必须让他们自己的修改内容去适应安卓操作系统。

然后,通过安卓兼容性测试(CTS),运行SELinux处于激活状态(使能状态)的设备。如前所述,任何新的策略仍然必须满足安卓兼容程序要求。

最后,如果可能的话,在内部开启为enforcement(在雇员的设备上),目的是提高失败的能见度。确定任何用户问题,并解决它们。

 

帮助

 

安卓强力推荐设备生产商工作在他们的安卓账户管理器上,以便分析SELinux的检测结果并改善策略配置。


本文由Hack Blog原创,如需转载注明原文链接

作者:wesly 分类:Android 浏览:1857 评论:0
留言列表
发表评论
来宾的头像