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 其它厂商的安全策略文件,参考它们的方法。