android SElinux

本文介绍如何在Android环境中配置SELinux以解决权限问题,包括配置步骤、验证方法及解决策略冲突的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1配置内核SELinux
1.1配置步骤
 在android源码的根目录依次执行以下命令:
# cd kernel-3.10.14/
# make xconfig

 按键盘的Ctrl + f 键,在弹出的搜索栏中写上 SECURITY ,
接着按回车键,在下拉选项中找到()Enable different security models 这项,勾选上。
 继续在搜索栏中写上 SECURITY_NETWORK ,
按回车键,在下拉选项中找到 ()Socket and Networking Security Hooks 这项,勾选上。
 继续在搜索栏中写上 AUDIT ,
按回车键,在下拉选项中找到 ()Auditing support 这项,勾选上。
 继续在搜索栏中写上 selinux,
按回车键,在下拉选项中找到 ()NSA SELinux Support 这项,勾选上。
 接着把NSA SELinux Support 这项下面的()SELinux 这项勾选上,保存并退出。
以上几步的可见1.2 步骤图

接着执行以下命令:
#cd ..
#make bootimage
这里写图片描述2 查看和了解串口打印信息
2.1验证selinux是否生效
把生成的boot.img烧录到开发板,打开串口并重启开发板。接着在本地终端执行命令:
# adb shell
# ps -Z
显示的信息如图所示:
这里写图片描述2.2了解串口打印信息
 接着执行以下命令:
# getenforce
# setenforce 0
显示的信息如下图所示:
这里写图片描述(提示:Enforcing 表示selinux机制处于强制模式,selinux默认是强制模式,Permissive 表示处于允许模式,也就是只打印出警告信息,不阻止进程执行相应动作)
 查看串口打印信息,如果发现串口中不停的打印类似如下信息:
type=1400 audit(1430209697.780:17451): avc: denied { read write } for pid=1219 comm=”surfaceflinger” name=”galcore” dev=”tmpfs
scontext=u:r:surfaceflinger:s0
tcontext=u:object_r:graphics_device:s0
tclass=chr_file

说明当前板子运行的坏境中存在违规现象,也就是说策略文件中没有那样的规则。
其中
Comm=“surfaceflinger”意思是进程命令,也就是进程是谁,
name=”galcore” 意思是目标的名字

打印出的字符串只需关注以下四点:
(1){ read write } , —–违规进程要执行的那些动作。

(2)scontext=u:r:surfaceflinger:s0 —-进程的安全上下文,只需关注进程的type 也就是第二个和第三个冒号之间的信息即“surfaceflinger”这个字符串。

(3)tcontext=u:object_r:graphics_device:s0 —-进程执行动作施加对象的安全上下文,只需关注对象的type 也就是第二个和第三个冒号之间的信息即“graphics_device”这个字符串。

(4)tclass=chr_file —对象的类型,这里chr_file表示对象是一个文件。
3解决方法
3.1 一般情况解决步骤
在android 的源码根目录下执行命令:

cd external/sepolicy

ls

 会看到很多xxx.te文件,根据上面报的进程安全上下文信息,也就是第二个和第三个冒号之间的信息即“surfaceflinger”这个字符串。
执行命令

ls surfaceflinger.te

 会发现当前路径下有这个文件。(提示:系统中的所有进程的标签类型在这都有对应的.TE 文件)
执行命令

vim surfaceflinger.te

 在里面有allow 语句的上面或下面添加如下信息:

allow  surfaceflinger   graphics_dev:chr_file  { read write }; 

(提示:这条语句表示添加了一条规则既允许标签类型是surfaceflinger的进程去对标签类型是graphics_device的chr_file类型的对象执行 Read write 两个动作)

注意:
 本着不改动android源码的原则,需要修改的te文件放在/device/ingenic/dorado
路径下。执行命令:

cd device/ingenic/dorado

mkdir sepolicy

cd sepolicy

vim surfaceflinger.te

 把需要添加的allow 语句写进去,保存并退出。
执行命令:

cd ..

vim BoardConfig.mk

添加如下配置信息:
#sepolicy
BOARD_SEPOLICY_DIRS += device/ingenic/dorado/sepolicy
BOARD_SEPOLICY_UNION += \
surfaceflinger.te \
AAA.te \
BB.te

 这步目的是添加sepolicy 目录里的文件编译规则,保存并退出。回退到android
源码的根目录,执行
# make bootimage

(提示:所有的te文件最终编译生成sepolicy 二进制文件,这个文件在ramdisk 中,在路径out/target/product/dorado/root/会看到。编译过程的中间文件在路径
out/target/product/dorado/obj/ETC/sepolicy_intermediates/policy.conf
这个policy.conf文件包含了所有.te文件里的策略信息。)

把boot.img烧录到开发板,重启开发板,并查看串口打印信息。
 3.2特殊情况解决步骤
  如果按照3.1步骤执行,在执行make bootimage 编译过程中,生成目标文件失败,错误信息是AA.te 文件中的 allow xx xx 语句和BB.te文件中的neverallow xx  xx 语句冲突。这种情况原因是自己添加的规则语句和android源码的规则有冲突,android是禁止允许这个规则的。如下图所示:

这里写图片描述 解决方法 执行命令:
# cd external/sepolicy
# grep graphics_device -rn .

 会找到file_contexts 文件有如下定义:

/dev/graphics(/.*)? u:object_r:graphics_device:s0

和文件device.te 有这样定义
type graphics_device, dev_type;

 根据前面提到的audit 错误信息语句 

name=”galcore” 要把/dev/graphics/galcore 这个文件重新设置安全上下文,
在android源码根目录执行命令

cd device/ingenic/dorado

vim device.te

添加如下信息:
type graphics_dev, dev_type; (提示 type 后的第一个字符可以自拟)
执行

vim file_context

添加如下信息:
/dev/graphics/galcore u:object_r:graphics_dev:s0
执行

cd ..

vim BoardConfig.mk

添加如下信息:

#sepolicy
BOARD_SEPOLICY_DIRS += device/ingenic/dorado/sepolicy
BOARD_SEPOLICY_UNION += \
file_contexts
device.te
surfaceflinger.te \
AAA.te \
BB.te \
……
回退到android源码的根目录 重新编译bootimage烧录并打开串口,可查看是否还有错误信息。
另一种参考方法是在android_SRC/device/ingenic/
grep 其它厂商的安全策略文件,参考它们的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值