28、SELinux策略安全审计:策略规则安全审查,最小权限原则实施,策略漏洞扫描

说到SELinux策略审计,我脑子里第一个蹦出来的词就是「后怕」。

为什么?因为早期做Android系统开发时,我总觉得SELinux就是个麻烦精——动不动就avc denial,搞得我焦头烂额。后来有一次线上事故,某个第三方应用通过一个过于宽松的SELinux规则,直接读到了系统敏感文件。嗯,从那以后,我再也不敢轻视策略审计了。

策略规则安全审查——别让规则变成后门

说白了,策略规则审查就是拿着放大镜检查你写的每一条allow规则。我个人习惯是,每写完一条规则,先问自己三个问题:

  • 这条规则真的需要吗?
  • 权限范围能不能再缩小?
  • 如果这条规则被滥用,后果是什么?

举个例子,我曾经在项目中看到过这样的规则:

allow appdomain system_file:file read;

这条规则允许所有应用读取所有系统文件。你想想看,这等于把整个系统的敏感信息都暴露了。正确的做法应该是:

allow com.example.app system_data_file:file read;

只允许特定应用读取特定类型的数据文件。

审查要点清单:

  • 检查allow规则的源域和目标域是否过于宽泛
  • 确认权限集是否最小(比如只需要read,就不要给write)
  • 审查neverallow规则是否覆盖了所有关键路径
  • 检查type_transition规则是否合理

最小权限原则实施——能不给的,坚决不给

最小权限原则,说白了就是「够用就好」。我在做系统启动优化时,发现很多厂商为了省事,直接给系统服务开了「绿灯」权限。这种做法,我称之为「懒人式安全」。

实施最小权限,我建议分三步走:

  1. 梳理权限清单:列出每个域实际需要的权限
  2. 逐条裁剪:去掉所有「可能用不到」的权限
  3. 回归验证:跑一遍完整功能测试,确认没有遗漏

我曾经遇到过一个案例:某个系统服务需要访问网络,开发人员直接给了netdomain的全部权限。我仔细一查,其实它只需要connectsendto两个操作。裁剪后,攻击面直接缩小了80%。

我的小技巧:使用sesearch工具可以快速查看某个域的所有权限。命令如下:

sesearch --allow -s my_domain -t all -c all -p all

然后逐条分析,哪些是真正需要的。

策略漏洞扫描——自动化检查不能少

手动审查总有遗漏,所以我们需要自动化工具来帮忙。我常用的扫描方法包括:

扫描类型 工具/方法 检查内容
静态分析 sediff、sechecker 策略版本差异、已知漏洞模式
动态分析 audit2allow + 日志分析 运行时权限滥用检测
合规检查 自定义脚本 最小权限原则符合度

我记得有一次,用sechecker扫描一个第三方ROM的策略文件,发现了17条高危规则。其中有一条允许untrusted_app访问keystore_data——这要是被恶意利用,用户的密钥就全暴露了。

警告:不要完全依赖自动化工具。工具只能发现已知模式,真正的安全漏洞往往藏在「看起来合理」的规则组合中。我建议每季度做一次人工+自动的联合审计。

知识体系结构图

下面这张图,是我自己总结的SELinux策略安全审计的核心逻辑。你看一眼就能明白整个流程:

SELinux策略安全审计核心流程 策略规则审查 人工逐条检查 最小权限实施 裁剪+验证 漏洞扫描 自动化检测 • allow规则范围检查 • neverallow覆盖 • type_transition审查 • 域间权限分析 • 权限清单梳理 • 逐条裁剪冗余 • 回归验证测试 • 攻击面评估 • 静态分析(sediff) • 动态分析(audit2allow) • 合规检查脚本 • 已知漏洞模式匹配 输出:安全审计报告 + 策略优化建议 持续迭代

实战中的避坑指南

我曾经踩过一个坑,分享出来希望大家别重蹈覆辙。

有一次,我在审查一个系统服务的策略文件时,发现了一条allow system_server self:capability sys_admin;。当时觉得「嗯,系统服务嘛,需要管理员权限也正常」。结果后来安全团队扫描发现,这个权限被一个子进程继承了,导致子进程可以修改系统时间——这本来是不允许的。

从那以后,我给自己定了个规矩:任何capability权限,必须单独评估,并且确认不会被继承到子进程

我的审计清单(简化版):

  • ✅ 所有allow规则都有明确注释说明用途
  • ✅ 没有使用通配符*all作为权限
  • ✅ 每个域只拥有完成功能所需的最小权限
  • ✅ 关键路径(如init、zygote)有neverallow保护
  • ✅ 第三方应用的策略独立且受限

最后说一句:SELinux策略审计不是一次性工作。随着系统版本迭代、功能增加,策略文件会越来越庞大。我建议每个大版本发布前,都做一次完整的策略安全审计。别等到出了安全问题再后悔——嗯,那滋味我尝过,不好受。


公众号:蓝海资料掘金营,微信deep3321