SEAndroid
SEAndroid安全机制所要保护的对象是系统中的资源,这些资源分布在各个子系统中,例如我们经常接触的文件就是分布文件子系统中的。
实际上,系统中需要保护的资源非常多,除了前面说的文件之外,还有进程、socket和IPC等等。
在用户空间中,SEAndroid包含有三个主要的模块,分别是安全上下文(Security Context)、安全策略(SEAndroid Policy)和安全服务(Security Server)
例子:
init.rc u:object_r:rootfs:s0 init.rc
init.rc这个文件的SELinux用户、SELinux角色、类型和安全级别分别为u、object_r、rootfs和s0。
mac_permissions.xml
文件mac_permissions.xml给不同签名的App分配不同的seinfo字符串,例如,在AOSP源码环境下编译并且使用平台签名的App获得的seinfo为“platform”,使用第三方签名安装的App获得的seinfo签名为"default"。
这个seinfo描述的其实并不是安全上下文中的Type,它是用来在另外一个文件external/sepolicy/seapp_contexts中查找对应的Type的
设置ROM中的文件的安全上下文
以system.img为例,生成system.img的命令在build/core/Makefile文件中:
BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img
..........
$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS)$(INSTALLED_FILES_FILE)
$(callbuild-systemimage-target,$@)
可见system.img是由build-systemimage-target命令生成的。
再看build-systemimage-target的定义:
define build-systemimage-target
@echo "Target system fs image: $(1)"
$(call create-system-vendor-symlink)
@mkdir -p $(dir $(1))$(systemimage_intermediates) && rm -rf$(systemimage_intermediates)/system_image_info.txt
//call generate-userimage-prop-dictionary
$(call generate-userimage-prop-dictionary,$(systemimage_intermediates)/system_image_info.txt, \
skip_fsck=true)
$(hide) PATH=$(foreachp,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \
./build/tools/releasetools/build_image.py \
$(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt$(1) \
|| ( echo "Out of space? the tree size of $(TARGET_OUT) is (MB): "1>&2 ;\
du -sm $(TARGET_OUT) 1>&2;\
echo "The max is $$(( $(BOARD_SYSTEMIMAGE_PARTITION_SIZE) / 1048576)) MB." 1>&2 ;\
mkdir -p $(DIST_DIR); cp $(INSTALLED_FILES_FILE)$(DIST_DIR)/installed-files-rescued.txt; \
exit 1 )
endef
这里执行了两个命令:
第一个命令:generate-userimage-prop-dictionary,用来生成一个属性文件system_image_info.txt。它的第一个参数就是system_image_info.txt。
这里面存储一下变量供mkuserimg.sh使用
比如
fs_type=ext4
system_size=
userdata_size=
selinux_fc=...
查看这个命令的定义,可以发现这个命令依靠一系列的echo命令来将keyvalue格式的配置写入到文件system_image_info.txt当中。该命令的定义中有一行:
$(hide) echo "selinux_fc=$(SELINUX_FC)" >> $(1)
查看变量SELINUX_FC的赋值:
SELINUX_FC :=$(TARGET_ROOT_OUT)/file_contexts。即OUT/root/file_context,这个文件就是根据external/sepolicy/file_contexts来生成的。
第二个命令:./build/tools/releasetools/build_image.py,是一个python脚本,用来制作system.img镜像文件。而且这个命令将会使用到第一个命令里生成的属性文件/system_image_info.txt。
查看该命令的入口函数:
def main(argv):
if len(argv) != 3:
print__doc__
sys.exit(1)
in_dir = argv[0]
glob_dict_file =argv[1]
out_file =argv[2]
glob_dict =LoadGlobalDict(glob_dict_file)
image_filename =os.path.basename(out_file)
mount_point = ""
if image_filename == "system.img":
mount_point= "system"
elif image_filename == "userdata.img":
mount_point= "data"
elif image_filename == "cache.img":
mount_point= "cache"
elif image_filename == "vendor.img":
mount_point= "vendor"
elif image_filename == "oem.img":
mount_point= "oem"
else:
print>> sys.stderr, "error: unknown image file name ",image_filename
exit(1)
image_properties = ImagePropFromGlobalDict(glob_dict,mount_point)
if not BuildImage(in_dir,image_properties, out_file):
print>> sys.stderr, "error: failed to build %s from %s" %(out_file, in_dir)
exit(1)
参数argv[1]指向的就是我们上面提到的属性文件system_image_info.txt,最终保存在本地变量glob_dict_file中。另外一个参数argv[2]指向的要输出的system.img文件路径,最终保存在本地变量out_file中。
函数LoadGlobalDict用来打开属性文件system_image_info.txt,并且将它每一行的key和value提取出来,并且保在字典glob_dict中。注意,这个字典glob_dict包含有一个key等于selinux_fc、value等于file_contexts文件路径的项。
接下来再通过os.path.basename将输出的文件路径out_file的最后一项提取出来,就可以得到image_filename的值为”system.img“,因此再接下来就会得到本地变量mount_point的值为”system“,表示我们现在正在打包的是system.img文件。
函数ImagePropFromGlobalDict用来从字典glob_dict中提取与安装点mount_point相关的项,并且保存在另外一个字典中返回给调用者,在它的实现中有:
common_props = (
"extfs_sparse_flag",
"mkyaffs2_extra_flags",
"selinux_fc",
"skip_fsck",
"verity",
"verity_key",
"verity_signer_cmd",
"transparent_compression_method"
)
for p in common_props:
copy_prop(p,p)
if fc_config is not None:
build_command.append(fc_config)
elif"selinux_fc" in prop_dict:
build_command.append(prop_dict["selinux_fc"])
..............
if "selinux_fc" in prop_dict:
build_command.append(prop_dict["selinux_fc"])
build_command.append(prop_dict["mount_point"])
通过这些命令,系统会编译出一个关联有安全上下文的system.img镜像文件。
mkuserimg.sh
mkuserimg.sh 调用make_ext4fs
-s就是生成ext4的S模式制作;
"-a system",是指这个img用于android系统,挂载点是/system,使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,
也可以不使用 “-a system”参数,这样就会使用文件的默认权限。
如果不使用-a参数,则可。
SEAndroid的更多相关文章
- [Android L]SEAndroid开放设备文件结点权限(读或写)方法(涵盖常用操作:sys/xxx、proc/xxx、SystemProperties)
温馨提示 建议你先了解一下上一篇博文([Android L]SEAndroid增强Androd安全性背景概要及带来的影响)所讲的内容,先对SEAndroid窥个全貌,然后再继续本节内容. ...
- [Android L]SEAndroid增强Androd安全性背景概要及带来的影响
1 SEAndroid背景 Android对于操作系统安全性方面的增强一直沿用Linux内核所提供的MAC强制访问控制套件SELinux,对权限进行了更为深度的管理,有效地控制着进程对资源的访问 ...
- chcon可实现对文件的SEAndroid安全标签的修改
chcon可实现对文件的SEAndroid安全标签的修改 参考使用如下: chcon -u u system/app/ chcon -r object_r system/app/ chcon -t s ...
- SEAndroid安全机制对Binder IPC的保护分析
在SEAndroid安全机制中,除了文件和属性,还有Binder IPC须要保护.Binder IPC是Android系统的灵魂,使用得相当广泛又频繁.比如,应用程序都是Binder IPC请求訪问系 ...
- DAC,MAC和SELinux,SEAndroid
1. 被ROOT了怎么办 2. SELinux 3. SEAndroid 4. JB(4.3) MR2的漏洞弥补 ------------------------------------------- ...
- SEAndroid安全机制中的进程安全上下文关联分析
前面一篇文章分析了文件安全上下文关联过程.可是在SEAndroid中,除了要给文件关联安全上下文外,还须要给进程关联安全上下文.由于仅仅有当进程和文件都关联安全上下文之后,SEAndroid安全策略才 ...
- SELinux/SEAndroid 实例简述(二) TE语言规则【转】
本文转载自:https://blog.csdn.net/shell812/article/details/54930246 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- SEAndroid安全机制简要介绍和学习计划
与iOS相比.Android最被人诟病的是其流畅性和安全性. 然而,从4.0開始,Android不遗余力地改善其流畅性. 特别是在即将公布的L版本号中,用ART替换了Dalvik,相信会越来越流畅.至 ...
- S005SELinux(SEAndroid)的实际文件组成无标题文章
SEAndroid 是将SELinux 移植到Android 上的产物,可以看成SELinux 辅以一套适用于Android 的策略. 那么在android系统中那些文件是与SELinux(SEAnd ...
- Android 5.x SEAndroid/SElinux内核节点的读写权限【学习笔记】
本文转载自:http://blog.csdn.net/tung214/article/details/44461985 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制 ...
随机推荐
- 024:Java流实现Shell:cat 1.log | grep a | sort | uniq -c | sort -rn
本文阅读时间大约13分钟(本文实践性很强,建议pc端阅读,最好亲自实践). 参考答案 这个问题考察的是对Linux命令的熟悉程度,以及对Java中集合操作的综合运用,自从转到Java 8以后,我就一直 ...
- 数据结构与算法5—KMP算法
串的模式匹配算法 子串(模式串)的定位操作通常称为串的模式匹配. 这是串的一种重要操作,很多 软件,若有“编辑”菜单项的话, 则其中必有“查找”子菜单项. 串的顺序存储实现 #include<s ...
- css transform解释及demo(基于chrome)
transform 属性向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. Transform:(css3 转换) 注意:这些效果叠加时,中间用空格隔开 作用:能够对元 ...
- ELK快速入门(一)基本部署
ELK快速入门一-基本部署 ELK简介 什么是ELK?通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件组成的一个组合体,这三个软件当中,每个软件用于完成不同 ...
- 初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明
1. 说到面向对象, 一个绕不开的话题,就是面向过程. 面向过程适合简单.不需要协作的事务. 面向过程 = 分解问题 + 逻辑为先 = 先细节,再整体. 对比面向过程, 面向对象是模块化的, 当我们思 ...
- 第六篇 -- LINQ to XML
一.LINQ to XML常用成员 LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument EmptySequence 获取空的元 ...
- JUnit 5.x 知识点
出处:https://blinkfox.github.io/2018/11/15/hou-duan/java/dan-yuan-ce-shi-zhi-nan/#toc-heading-14 表面上来看 ...
- python基础语法13 内置模块 subprocess,re模块,logging日志记录模块,防止导入模块时自动执行测试功能,包的理论
subprocess模块: - 可以通过python代码给操作系统终端发送命令, 并且可以返回结果. sub: 子 process: 进程 import subprocess while Tru ...
- wordpress定时发布失败Missed Schedule解决方法
今天一位客户的网站设置了文章定时发布但却没有发布成功,提示Missed Schedule错误,把所有的插件都暂停了再设置定时发布也不行,那就只能寻找其他的解决方案了.ytkah查看一下有没相关修复插件 ...
- Virtual DOM的渲染机制--猜测
一个node的状态发生变化: 会对当前结点和子节点的数据全部进行更新: 然后进行dom比较: 比较完毕后一次性提交: 相对于以前的渲染方式: 每一个node的数据发生变化,都会产生一次渲染提交: 以上 ...