Open-Q 845开发板Android环境下/dev/i2c访问权限与SELinux配置问询
Open-Q 845开发套件I2C总线访问权限配置方案
项目实施背景
- 当前在Intrinsyc推出的Open-Q 845开发套件上开展I2C传感器集成工作
- 常规最优实现路径为修改内核源码、在设备树中添加I2C传感器节点配置,但当前项目阶段希望尽可能规避源码编译工作
- 现有预编译Android 9系统已内置I2C总线驱动,可通过C程序打开
/dev/i2c-0设备节点操作总线,也可借助iotcl函数库驱动对应传感器
现存核心问题
- 访问
/dev/i2c-0设备节点需要root权限,即便执行chmod 777 /dev/i2c-0修改文件权限位,普通应用依然无法正常访问该节点 - 初步推断根因是
/dev/i2c-0的属主和属组均为root,普通应用的运行权限组不在授权范围内。当前设备节点的权限状态为字符设备节点,属主root、属组root,默认权限位禁止非root组用户读写 - 目前唯一可落地的临时调试方案是执行
/system/bin/setenforce 0将SELinux设置为宽容模式,绕过权限校验,但该方案存在安全风险,不希望长期禁用SELinux强制访问控制模块 - 待验证的核心需求:
- 是否可以修改
/dev/i2c-0的属主/属组配置,将设备访问权限限定为仅自有应用可用? - 是否可以在Android Manifest中添加对应权限配置,实现仅自有应用可访问I2C总线的效果?
- 是否可以修改
无源码编译前提下的可落地方案
1. Linux文件权限层配置
无需直接给/dev/i2c-0分配全局开放的777权限,可通过系统启动阶段的init脚本(对应/init.rc或厂商分区内的专属init配置),在系统启动时自动完成设备节点的权限配置:
chown system system /dev/i2c-0 chmod 0660 /dev/i2c-0
配置完成后,所有以system UID运行的进程都可以正常读写该设备节点。如果需要进一步缩小权限范围,可以自定义专属Linux组,在系统配置中为该组分配固定GID,再将/dev/i2c-0的属组设置为该自定义组,仅需要访问I2C的应用申请对应GID权限即可。
2. SELinux规则配置
执行chmod后普通应用依然无法访问节点的核心原因,是SELinux的强制访问控制会拦截未授权的进程访问。整个过程完全不需要禁用SELinux,仅需添加针对性的细粒度规则:
- 为需要访问I2C的应用配置专属SELinux域,给应用进程分配独立的SELinux上下文
- 添加规则允许该自定义域对
/dev/i2c-0设备节点拥有read/write权限,匹配设备节点本身的SELinux上下文 - 配置完成后SELinux将保持Enforcing强制模式,仅对已授权的应用开放对应设备的访问权限,不会降低系统整体安全防护能力
3. Manifest权限配置说明
Android原生Manifest中没有预置对应I2C设备节点的权限项,因为I2C属于硬件层的自定义访问路径,并非Android标准框架开放的公共API。如果要实现仅自有应用可访问的隔离效果,核心逻辑是将上述的用户ID分配、SELinux规则和应用专属签名绑定——其他未使用同签名的应用,即便申请了相同的GID权限,也会被SELinux规则拦截,无法越权访问I2C设备。
内容的提问来源于stack exchange,提问作者Jerónimo Agulló
相关产品推荐
相关产品推荐

