android中SELINUX规则分析和语法简介

#############################################

本文为极度寒冰原创,转载请注明出处

#############################################

1. SELINUX是可以理解为一种android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统

我们可以通过配置SELINUX的相关policy,来定制自己的手机的一些权限,比如,我们可以完全让root用户没有任何的权限和user一样

2. 在android里面,有两个类型,一种是文件,一种是进程。

针对这两种类型,我们可以先来看看他们的不同。

在android上面,adb shell之后进入手机,ps -Z可以查看当前进程所拥有的selinux的权限。

举例:

LABEL                          USER     PID   PPID  NAME
u:r:init:s0                    root      1     0     /init
u:r:kernel:s0                  root      2     0     kthreadd
...
u:r:kernel:s0                  root      258   2     irq/322-HPH_R O
u:r:logd:s0                    logd      259   1     /system/bin/logd
u:r:healthd:s0                 root      260   1     /sbin/healthd
u:r:lmkd:s0                    root      261   1     /system/bin/lmkd
u:r:servicemanager:s0          system    262   1     /system/bin/servicemanager
u:r:vold:s0                    root      263   1     /system/bin/vold
u:r:surfaceflinger:s0          system    264   1     /system/bin/surfaceflinger
u:r:tctd:s0                    root      265   1     /system/bin/tctd
u:r:rfs_access:s0              system    268   1     /system/bin/rfs_access
u:r:tee:s0                     system    271   1     /system/bin/qseecomd
u:r:kernel:s0                  root      280   2     kworker/3:1H
u:r:kernel:s0                  root      290   2     kauditd
u:r:rmt_storage:s0             nobody    291   1     /system/bin/rmt_storage
u:r:shell:s0                   shell     292   1     /system/bin/sh
u:r:netd:s0                    root      295   1     /system/bin/netd
u:r:debuggerd:s0               root      296   1     /system/bin/debuggerd
u:r:tee:s0                     system    297   271   /system/bin/qseecomd

在这个例子中,我们可以进行分析。

在android中,只定义了一个user即为u. 另外,如果是进程的话,都会统一定义为r,如果是文件的话,会被定义为object_r. 第三个是这个进程type,在andorid里面,定义了100多个type.按照目前我的理解,这个是进程所属的>类型。第四个是s0,这个是一个安全的等级。但是暂时还没有接触到配置这个的地方。

另外就是文件,文件想要查看相关SELINUX权限的话,需要去执行ls -Z

drwxr-x--x root     sdcard_r          u:object_r:rootfs:s0 storage
drwx--x--x root     root              u:object_r:tmpfs:s0 synthesis
dr-xr-xr-x root     root              u:object_r:sysfs:s0 sys
drwxr-xr-x root     root              u:object_r:system_file:s0 system
drwxrwxr-x system   tctpersist          u:object_r:tct_persist_file:s0 tctpersist
lrwxrwxrwx root     root              u:object_r:rootfs:s0 tombstones -> /data/tombstones
-rw-r--r-- root     root              u:object_r:rootfs:s0 ueventd.qcom.rc
-rw-r--r-- root     root              u:object_r:rootfs:s0 ueventd.rc

在这个例子中,结合上面的分析,我们知道了object_r是代表的文件,u是android的唯一的用户,rootfs是这个文件所对应的类型,s0是一个安全的等级限制。

3. 如何配置selinux

首先,按照Google的官方文档:

需要linux内核首先是支持selinux的,另外需要android的selinux的配置文件,也就是extern/sepolicy里面的内容。

然后就是修改BoardConfig.mk

Google的nexus的sepolicy的支持就放在了device/lge/mako/sepolicy

首先会包含厂商定制的sepolicy的文件夹:BOARD_SEPOLICY_DIRS

然后将规则添加到了sepolicy中:BOARD_SEPOLICY_DIRS

这样的话,我们编译出来的image其实就是具有了selinux的功能。

其实如果没有厂商定制的话,也是会编译到external/sepolicy的,这样的话,就是使用andriod所有默认的sepolicy(It defines the domains and types for the AOSP services and apps common to all devices. )

然后理解了这个之后,我们可以看到其实很多的厂商也是有自己的配置规则在device/***/***/sepolicy下面的.

4. selinux的配置规则:

首先要了解sepolicy的结构:

a. App进程 -> mac_permissions.xml

b. App数据文件 -> seapp_contexts

c. 系统文件  ->  file_contexts

d. 系统属性 -> property_contexts

在te文件中,我们一般遇到的语法是这样的:

rule_name source_type target_type:class perm_set

解读为: 为source_type设置一个rule_name的规则,规则是对target_type的class 进行 perm_set的操作。

然后是一些特殊的配置文件:

a. external/sepolicy/attributes -> 所有定义的attributes都在这个文件

b. external/sepolicy/access_vectors -> 对应了每一个class可以被允许执行的命令

c. external/sepolicy/roles  -> Android中只定义了一个role,名字就是r,将r和attribute domain关联起来

d. external/sepolicy/users  -> 其实是将user与roles进行了关联,设置了user的安全级别,s0为最低级是默认的级别,mls_systemHigh是最高的级别

e. external/sepolicy/security_classes -> 指的是上文命令中的class,个人认为这个class的内容是指在android运行过程中,程序或者系统可能用到的操作的模块

f. external/sepolicy/te_macros -> 系统定义的宏全在te_macros文件

f. external/sepolicy/***.te  -> 一些配置的文件,包含了各种运行的规则

另外,selinux有两种工作模式:

“permissive”:所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志

“enforcing”:所有操作都会进行权限检查

最后,type的命令如下:

type type_id [alias alias_id,] [attribute_id] # 将type_id(别名为alias)关联到attribute. 这样的话,方便用attribute来管理不同的type中包含相同的属性的部分。

class命令的格式为:

class class_name [ inherits common_name ] { permission_name ... }

inherits表示继承了common定义的权限,然后自己额外实现了permission_name的权限

在te文件中常见的四种命名的规则:

allow:赋予某项权限。

allowaudit:audit含义就是记录某项操作。默认情况下是SELinux只记录那些权限检查失败的操作。allowaudit则使得权限检查成功的操作也被记录。注意,allowaudit只是允许记录,它和赋予权限没关系。赋予权限必须且只能使

用allow语句。

dontaudit:对那些权限检查失败的操作不做记录。

neverallow:前面讲过,用来检查安全策略文件中是否有违反该项规则的allow语句。如例子5所示:

举例:

type init, domain;

将init关联到domain,即将domain设置为init类型的属性

allow init unlabeled:filesystem mount;

允许init类型对unlabeled类型的filesystem进行mount的操作

allow init fotad:unix_stream_socket { bind create };

允许init类型对fotad类型的unix_stream_socket 进行bind和create的操作

allow appdomain anr_data_file:dir search;

allow appdomain anr_data_file:file { open append };

首先appdomain是定义在te_macros里面的一个宏,很多的app规则会使用类似app_domain(shell)的命令将其添加进去

这两句话的意思是:1. 允许app去对anr_data_file类型的目录进行查找的操作

2. 允许app对anr_data_file类型的file进行打开和添加操作   其实就是规定了出现anr时候,app往/data/anr/里面写入的权限限制

neverallow { appdomain -unconfineddomain } kmem_device:chr_file { read write };

绝对不允许app(除了有unconfineddomain属性的app)对kmem_device类型的字符设备进行读写的操作

neverallow { appdomain -unconfineddomain } self:capability2 *;

绝对不允许除了unconfineddomain以外的app对self类型的capability2进行任何的操作

type httpd_user_content_t, file_type, httpdcontent;

声明一个httpd_user_content_t的类型,具有file_type和httpdcontent的属性

type httpd_user_content_t;

typeattribute httpd_user_content_t file_type, httpdcontent;

声明一个httpd_user_content_t的类型

定义httpd_user_content_t具有file_type, httpdcontent的属性

allow appdomain self:rawip_socket create_socket_perms;

所有可以设置类型的地方其实都可以设置为属性。

比如这个例子,我们允许所有具有app属性的内容可以去对self属性的rawip_socket进行create的操作

allow {user_t domain} {bin_t file_type sbin_t}:file execute ;

允许user_t和domain属性的类对bin_t, file_type, sbin_t类型的file进行可执行的操作

allow user_t user_t:process signal;

allow user_t self:process signal;

这两条语句的表述其实是一致的,其实self指的是目标的类型和发起人的类型是一致的

所以不能声明一个类型或者属性叫做self

allow user_t bin_t:file ~{ write setattr ioctl };

允许user_t对bin_t类型的file进行除了write setattr ioctl相关的操作

type_transition system wifi_data_file:sock_file system_wpa_socket;

当一个类型为system的类别去进行wifi_data_file类型的sock_file访问时,类型默认切换到system_wpa_socket

如果下面这条语句想要执行成功

type_transition init_t apache_exec_t:process apache_t;

至少首先声明下面的三条规则:

allow init_t apache_exec_t:file execute;

allow init_t apache_t:process transition;

allow apache_t apache_exec_t:file entrypoint;

type_transition和type_change的语法规则是一样的, type_change规则的影响不会在内核中生效,而是依赖于用户空间应用程序,如login或sshd

时间: 2024-10-21 08:00:08

android中SELINUX规则分析和语法简介的相关文章

PopupWindow在android中的使用分析

PopupWindow在android中的使用分析 PopupWindow是应用开发中经常用到的组建,使用它可以在当前屏幕的上层显示一个弹窗,同时也可以指定弹窗的位置以及背景色等特性,大大提高用户体验,那么这里我就以下几点介绍它的使用: 1 从指定的位置弹出这个窗口(淡入淡出动画) 2 从屏幕底部弹出这个窗口(带有透明度背景,自定义触摸其他位置自动关闭弹窗) 我的效果图如下: 下面直接上代码,具体如下所示(按开发顺序排列) 1 自定义一个继承自PopupWindow的类 publicclassP

【转载+整理】Android中TouchEvent事件分析

原文地址:http://mobile.51cto.com/abased-374715.htm 一.知识回顾 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 二.问题提出 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是 View

Android 中图片压缩分析(上)

作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情况下,改变图片的存储体积,而后者则是降低图像尺寸,达到相同目的. 由于本文的篇幅问题,分为上下两篇发布. 二.Android 质量压缩逻辑 在Android中,对图片进行质量压缩,通常我们的实现方式如下所示: ByteArrayOutputStream outputStream = new Byte

Android 中LayoutInflater原理分析

概述 在Android开发中LayoutInflater的应用非常普遍,可以将res/layout/下的xml布局文件,实例化为一个View或者ViewGroup的控件.与findViewById的作用类似,但是findViewById在xml布局文件中查找具体的控件,两者并不完全相同. 应用场景: 1.在一个没有载入或者想要动态载入的界面中,需要使用layoutInflater.inflate()来载入布局文件: 2.对于一个已经载入的界面,就可以使用findViewById方法来获得其中的界

如何使用Android中TraceView性能分析工具

现来看一下整个界面的图,整个界面包括上下两部分,上面是你测试的进程中每个线程的执行情况,每个线程占一行:下面是每个方法执行的各个指标的值 上面一部分是你测试进程的中每个线程运行的时间线,下图中可以可以看到,主要只有一个main线程在执行,因为我滑动了一下列表,main线程(UI线程)正在进行绘制View呢~ 附相关视频教程Android应用开发视频教程 然后我点击了序号为133的一个方法io.bxbxbai.android.examples.activity.ExpandableLayoutMa

Android中Parcel的分析以及使用

简单点来说:Parcel就是一个存放读取数据的容器, Android系统中的binder进程间通信(IPC)就使用了Parcel类来进行客户端与服务端数据的交互,而且AIDL的数据也是通过Parcel来交互的.在Java空间和C++都实现了Parcel,由于它在C/C++中,直接使用了内存来读取数据,因此,它更有效率. 分析Binder机制中的客户端与服务器端进行实际操作ontransact()函数 : [java] //参数说明: // code :是请求的ID号 // data :客户端请求

Android中应用安装分析

#1 安装方式 1 安装系统APK和预制APK时,通过PMS的构造函数中安装,即第一次开机时安装应用,没有安装界面. 2 网络下载安装,通过应用商店等,即调用PackageManager.installPackages(),有安装界面. 3 通过adb工具安装,没有安装界面,它通过启动pm脚本的形式,然后调用com.android.commands.pm.Pm类,之后调用到PMS.installStage()完成安装. 4 安装本地apk,有安装界面,由PackageInstaller系统应用安

android 中theme和style的语法相关

1.theme和style都是一组属性的集合,用于定义文本.颜色.大小等显示风格.他们都是资源,可以用android系统级别的一些默认的风格和主题资源,你也可以自定义你自己的主题和风格资源. 2.自定义style 1 <resources> 2 <style name="CustomTheme"> 3 <item name="android:windowNoTitle">true</item> 4 <item n

Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)

目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本来看其中主要涉及的语法. 1.assert(condition):如果condition参数的计算结果为False,则停止脚本执行,否则继续执行脚本. 2.show_progress(frac,sec):frac表示进度完成的数值,sec表示整个过程的总秒数.主要用与显示UI上的进度条. 3.for