修改sepolicy编译
1. 如何设置SElinux 策略规则
[SELinux Policy]如何设置SELinux策略规则?
[Description]
android KK 4.4 版本后,Google 默认启用了SELinux, 并会把SELinux 审查异常打印在kernel log
或者 android log(L 版本)中,对应的关键字是: "avc: denied" 或者"avc: denied"
如一行LOG:
<5>[ 17.285600].(0)[503:idmap]type=1400 audit(1356999072.320:202): avc: denied { create
} for pid=503 comm="idmap" name="overlays.list" scontext=u:r:zygote:s0
tcontext=ubject_r:resource_cache_data_file:s0 tclass=file
即表明idmap 这个process, 使用zygote 的source context, 访问/data/resource_cache 目录,并
创建文件时,被SELinux 拒绝访问。
[Keyword]
android, SELinux, avc: denied, audit
[Solution]
KK 版本, Google 只有限制的启用SELinux, 即只有针对netd, installd, zygote, vold 以及它们
直接fork 出的child process 使用enforcing mode, 但不包括zygote fork的普通app.
L 版本, Google 全面开启SELinux, 几乎所有的process 都使enforcing mode, 影响面非常广.
目前所有的SELinux check 失败,在kernel log 或者android log(L版本后)中都有对应的"avc:
denied" 或者 "avc: denied"的LOG 与之对应。反过来,有此LOG,并非就会直接失败,还需要确认
当时SELinux 的模式, 是enforcing mode 还是 permissve mode.
首先, 务必确认对应进程访问系统资源是否正常, 是否有必要 ?如果本身是异常非法访问,那么
就要自行消除访问。
其次, 如果确认访问是必要,并且正常的,那么就要对对应的process/domain 增加新的policy.
1). 简化方法
1.1 提取所有的avc LOG. 如 adb shell "cat /proc/kmsg | grep avc" > avc_log.txt
1.2 使用 audit2allow tool 直接生成policy. audit2allow -i avc_log.txt 即可自动输出生成的
policy
1.3 将对应的policy 添加到selinux policy 规则中,对应MTK Solution, 您可以将它们添加在KK:
mediatek/custom/common/sepolicy, L: device/mediatek/common/sepolicy 下面,如
allow zygote resource_cache_data_file:dir rw_dir_perms;
allow zygote resource_cache_data_file:file create_file_perms;
===> mediatek/custom/common/sepolicy/zygote.te (KK)
===> device/mediatek/common/sepolicy/zygote.te (L)
注意audit2allow 它自动机械的帮您将LOG 转换成policy, 而无法知道你操作的真实意图,有可能
出现权限放大问题,经常出现policy 无法编译通过的情况。
2). 按需确认方法
此方法需要工程人员对SELinux 基本原理,以及SELinux Policy Language 有了解.
2.1 确认是哪个进程访问哪个资源,具体需要哪些访问权限,read ? write ? exec ? create ?
search ?
2.2 当前进程是否已经创建了policy 文件? 通常是process 的执行档.te,如果没有,并且它的父
进程即source context 无须访问对应的资源,则创建新的te 文件.
在L 版本上, Google 要求维护关键 security context 的唯一性, 比如严禁zygote, netd,
installd, vold, ueventd 等关键process 与其它process 共享同一个security context.
2.3 创建文件后,关联它的执行档,在file_contexts 中, 关联相关的执行档.
比如 /system/bin/idmap 则是 /system/bin/idmap ubject_r:idmap_exec:s0
2.4 填写policy 到相关的te 文件中
如果沿用原来父进程的te 文件,则直接添加.
如果是新的文件,那么首先:
#==============================================
# Type Declaration
#==============================================
type idmap, domain;
type idmap_exec, exec_type,file_type;
#==============================================
# Android Policy Rule
#==============================================
#permissive idmap;
domain_auto_trans(zygote, idmap_exec, idmap);
然后添加新的policy
# new policy
allow idmap resource_cache_data_file:dir rw_dir_perms;
allow idmap resource_cache_data_file:file create_file_perms;
3). 权限放大情况处理
如果直接按照avc: denied 的LOG 转换出SELinux Policy, 往往会产生权限放大问题. 比如因为要
访问某个device, 在这个device 没有细化SELinux Label 的情况下, 可能出现:
<7>[11281.586780] avc: denied { read write } for pid=1217 comm="mediaserver"
name="tfa9897" dev="tmpfs" ino=4385 scontext=u:r:mediaserver:s0
tcontext=ubject_r:device:s0 tclass=chr_file permissive=0
如果直接按照此LOG 转换出SELinux Policy: allow mediaserver device:chr_file {read write};
那么就会放开mediaserver 读写所有device 的权限. 而Google 为了防止这样的情况, 使用了
neverallow 语句来约束, 这样你编译sepolicy 时就无法编译通过.
为了规避这种权限放大情况, 我们需要细化访问目标(Object) 的SELinux Label, 做到按需申请.
通常会由三步构成
3.1 定义相关的SELinux type.
比如上述案例, 在 device/mediatek/common/sepolicy/device.te 添加
type tfa9897_device, dev_type;
3.2 绑定文件与SELinux type.
比如上述案例, 在 device/mediatek/common/sepolicy/file_contexts 添加
/dev/tfa9897(/.*)? ubject_r:tfa9897_device:s0
3.3 添加对应process/domain 的访问权限.
比如上述案例, 在 device/mediatek/common/sepolicy/mediaserver.te 添加
allow mediaserver tfa9897_device:chr_file { open read write };
那么哪些访问对象通常会遇到此类呢?(以L 版本为例)
* device
-- 类型定义: external/sepolicy/device.te;device/mediatek/common/sepolicy/device.te
-- 类型绑定:
external/sepolicy/file_contexts;device/mediatek/common/sepolicy/file_contexts
* File 类型:
-- 类型定义: external/sepolicy/file.te;device/mediatek/common/sepolicy/file.te
-- 绑定类型:
external/sepolicy/file_contexts;device/mediatek/common/sepolicy/file_contexts
* 虚拟File 类型:
-- 类型定义: external/sepolicy/file.te;device/mediatek/common/sepolicy/file.te
-- 绑定类型:
external/sepolicy/genfs_contexts;device/mediatek/common/sepolicy/genfs_contexts
* Service 类型:
-- 类型定义: external/sepolicy/service.te; device/mediatek/common/sepolicy/service.te
-- 绑定类型
:external/sepolicyservice_contexts;device/mediatek/common/sepolicy/service_contexts
* Property 类型:
-- 类型定义: external/sepolicy/property.te;device/mediatek/common/sepolicy/property.te
-- 绑定类型:
external/sepolicy/property_contexts;device/mediatek/common/sepolicy/property_contexts;
通常我们强烈反对更新google default 的policy, 大家可以更新mediatek 下面的相关的policy.
2. 我有一个delphi的源码,编译的时候有错:找不到se_controls.pas
用Delphi编译的时候,每一个单元都对应一个pas文件,所以你找不到这个pas文件,只能说明几种情况,你的编译文件夹下缺失了这个单元文件,或者你在重新编译另存的时候没有把这个文件保存过来,你还是找找你这个源码的来源地,然后把pas文件拷过来,要是没有pas文件,你就把相应的这部分的代码源码保存并命名为se_controls.pas;要是都没有的话,要么这个Delphi源码你放弃好了;要么在主文件里面的代码去掉USE这个单元的代码。在编译的主文件中你创建一个新的单元,里面代码就会增加一句use unit1,Unit2。。。。。。之类的,去掉那个,还有其他单元里面有引用到这个单元的代码也要去掉,不过很麻烦就是了。建议你另找寻新源代码。
3. seandroid policy update是什么软件
第一步:找到需要访问该内核节点的进程(process),笔者自己这个节点由system_server进程来访问第二步:打开文件AndroidL/android/external/sepolicy/file_contexts.be仿照这个文件里的写法,为这个定义一个自己想要的名字:/dev/tegra.*u:object_r:video_device:s0/dev/tf_driveru:object_r:tee_device:s0/dev/ttyu:object_r:owntty_device:s0/dev/tty[0-9]*u:object_r:tty_device:s0/dev/ttyS[0-9]*u:object_r:serial_device:s0/dev/wf_btu:object_r:wf_bt_device:s0wf_bt_device是自定义,其他左右两边的内容都和上面的范例一致。第三步:打开文件AndroidL/android/external/sepolicy/device.te仿照这个文件里的写法,将刚刚第二步写的wf_bt_device声明为dev_type:#Devicetypestypedevice,dev_type,fs_type;typealarm_device,dev_type,mlstrustedobject;typeadb_device,dev_type;typeashmem_device,dev_type,mlstrustedobject;typeaudio_device,dev_type;typebinder_device,dev_type,mlstrustedobject;typeblock_device,dev_type;typecamera_device,dev_type;typewf_bt_device,dev_type;第四步:AndroidL/android/external/sepolicy/目录下很多.te文件都是以进程名来结尾的,比如有针对surfaceflinger进程的surfaceflinger,有针对vold进程的vold.te,刚刚从第一步得到,这个节点是由system_server进程来访问,所以,找到system_server.te打开,加入允许这个进程对/dev/wf_bt的读写权限,#Read/Writeto/proc/net/xt_qtaguid/ctrlandand/dev/xt_qtaguid.allowsystem_serverqtaguid_proc:filerw_file_perms;allowsystem_serverqtaguid_device:chr_filerw_file_perms;#chr_file表示字符设备文件,如果是普通文件用file,目录请用dir#rw_file_perms代表读写权限allowsystem_serverwf_bt_device:chr_filerw_file_perms;这句话的意思是:允许system_server进程拥有对wf_bt_device的这个字符设备的读写权限。改了这些之后,就可以makeinstallclean;make-j16编译image来验证权限是否获取成功。fd=open("/dev/wf_bt",O_RDONLY|O_NOCTTY);
4. 怎么用android image kitchen解包,并且修改sepolicy文件,方便在MIUI中安装root。
如果你要获取root权限。那何必这么麻烦呀。直接刷miui开发版就可以获取自带root权限了。而且比第三方外root百分之百好。
5. android selinux怎么修改
如果要恢复运行SELinux则可以运行
# setenforce
1
这条命令会把SELinux设定成Enforcing模式
2.把SELinux永久设定为Permissive模式
这里需要讲一下Permissive和Enforcing模式的区别。
SELinux有三种模式:Enforcing, Permissive and Disable.
Enforcing模式就是应用SELinux所设定的Policy,
所有违反Policy的规则(Rules)都会被SELinux拒绝
Permissive和Enforcing的区别就在于它还是会遵循SELinux的Policy,但是对于违反规则的操作只会予以记录而并不会拒绝操作
Disable 顾名思义就是完全禁用SELinux
如果要永久设定为Permissive模式,我们就要修改SELinux的配置文件
/etc/sysconfig/selinux (在RHEL5下这是一个symbolic link to /etc/selinux/conf)
# This file controls the state of SELinux on the
system.
# SELINUX= can take one of these three
values:
# enforcing - SELinux security policy is
enforced.
# permissive - SELinux prints warnings instead of
enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
#
SELINUXTYPE= type of policy in use. Possible values are:
# targeted -
Only targeted network daemons are protected.
# strict -
Full SELinux protection.
SELINUXTYPE=targeted
修改SELINUX=permissive,然后重新启动就可以了
6. 安卓代码能不能实现关闭SElinux权限
不可以
1.3 方法1:adb在线修改
关闭 seLinux:
打开seLinux:
Enforcing:seLinux已经打开;
Permissive:seLinux已经关闭;
1.4 方法2: 从kernel中彻底关闭 (用于开机初始化时的seLinux权限问题,要重编bootimage)
修改LINUX/android/kernel/arch/arm64/configs/XXXdefconfig文件(找相应config文件)
去掉CONFIG_SECURITY_SELINUX=y 的配置项
2. 在sepolicy中添加相应权限
2.1 修改依据:
log 信息:
avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0 tcontext=u:r:目标类型:s0 tclass=访问类别 permissive=0
2.2 修改步骤:
找相应的“源类型.te ”文件
有两个位置可能存在相应的te文件:
位置一:LINUX/android/external/sepolicy
位置二:LINUX/android/device/qcom/sepolicy/common
2.3 按如下格式在该文件中添加:
allow 源类型 目标类型:访问类别 {权限};
2.4 举例
Kernel Log:
avc: denied { execheap } for pid=7201 comm="com..input" scontext=u:r:untrusted_app:s0tcontext=u:r:untrusted_app:s0tclass=processpermissive=0
修改:
在LINUX/android/external/sepolicy/untrusted_app.te 中添加:
[java] view plain
<span style="font-size:24px;color:#009900;">allow untrusted_app untrusted_app:process { execheap };</span>
备注:
在这个例子中,由于源类型和目标类型都是untreated_app, 所以也可以写成:
[java] view plain
<span style="font-size:24px;color:#009900;">allow untrusted_app self:process { execheap };</span>
3. 添加权限后的neverallowed冲突
3.1 编译报错:
libsepol.check_assertion_helper: neverallow on line xxx ofexternal/sepolicy/domain.te ……
3.2 原因:
新添加的sepolicy项目违反了domain.te 中规定的的总策略原则。所以该条权限策略不能添加,如果强行添加的话有CTS测试失败的风险。
3.3 解决方法:
1.从运行log中找到要访问的目标名称,一般是name字段后的名称
avc: denied { read write } for pid=303 comm="mediaserver"name="tfa9890"dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0tcontext=u:object_r:device:s0tclass=chr_file permissive=0
2.找到相应的*_contexts文件。
一般有file_contexts, genfs_contexts, property_contexts, service_contexts 等文件
3.在contexts文件中指定要访问的目标为一个“源类型 ”有权限访问的“目标类型”
如:在file_contexts中添加: /dev/tfa9890 u:object_r:audio_device:s0
3.4 举例
添加权限:
在mediaserver.te中添加allow mediaserver device:chr_file { read write open};
编译报错:
libsepol.check_assertion_helper: neverallow on line 258 ofexternal/sepolicy/domain.te (or line 5252 of policy.conf) violated byallow mediaserver device:chr_file { read write open};
违反了domain.te 258的:
neverallow {domain –unconfineddomain –ueventd } device:chr_file { open read write}
运行Log:
avc: denied { read write } for pid=303 comm="mediaserver"name="tfa9890" dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0tclass=chr_file permissive=0
修改步骤:
1.目标名称是: tfa9890, 其在系统中的路径是: /dev/tfa9890, 是audio相关的设备文件
2.源类型是mediaserver, 在mediaserver.te 文件中发现其具有 audio_device 目标类型的权限
3.所以在file_contexts 中添加 “/dev/tfa9890 u:object_r:audio_device:s0” 可以解决问题
7. 我想修改frameworks中的android.policy.jar文件,用apktool和smali反编译出来的都是*.smali文件
apktool d -d xxx.apk
用-d选项,同时使用1.3.2版本的apktool
8. 如何用ModelSim se完全编译Xilinx库文件
Modlesim 仿真库的建立:
将Modelsim根目录下的modelsim.ini的属性由只读改为可写。
新建一个文件夹,比如library(为叙述方便,把它放在modelsim的根目录下)。D:/modelsim/library.
启动Modelsim,选择[File]/[chang Directory],选择D:/modelsim/library.
选择[File]/[New]/[library]命令,弹出[Creat a New library],在[lihrary Name]中输入“simprims_ver”,同时下一栏也自动输入“simprims_ver”,单击OK。
在主窗口中选择[compile]/[Compile]命令,弹出[compile Source Files],在[Library]的下拉列表中选择“simprims_ver”在[查找范围]中选中[Xilinx/veriog/src/simprims]目录下的全部文件,单击complie进行编译。(这时可能会花你一些时间,耐心等待编译完毕)用同样的方法将unisims和Xilinxcorelib三个仿真库进行编译。
这时在D:/modelsim/library 下就有以上三个仿真库。
7.总结步骤为a:建立库的放置路径b:对库进行编译c:对库进行映射。最后重新启动Modelsim可以在列表中看到建立的三个库。
那么这个办法明显是比较麻烦的。其实我们可以这样做;
首先将modelsim.ini文件只读模式去掉,存档前面打对勾。
在您安装ise的目录下,进入到bin
t目录下,例如e:ise6in
t,确认有compxlib这个程序
在cmd中运行compxlib -s mti_se -f all -l all -o e:modeltech_6.0xilinx_libs就可以了,e:modeltech_6.0是我安装modelsim的目录,您可以作相应的更改。参数也可以按照您的要求作相应的更改。
这样就可以了。
需要注意的是,千万记住ise和modelsim的安装目录都不要出现空格,最好是直接安装在根目录下
modelsim下编译xilinx库的方法
这几天,建库的问题比较多,写一个建库的方法。
所用软件:ISE7.1i+ModelsimSE6.0
语言:VHDL
首先安装软件。注意:ISE,Modelsim的安装路径不能含有空格。
另外,Modelsim的安装路径可设为“$:/modelsim”,其中$为盘符,不要使用默认的安装路径。
将Modelsim根目录下的modelsim.ini文件的只读属性去掉。
在modelsim的命令窗口中输入命令“compxlib -s mti_se -arch all -l vhdl -w -lib all”,按回车键即可。
编译完成后,将Modelsim根目录下的modelsim.ini文件的属性设置为只读。
关于“compxlib”命令各项参数的含义,请在modelsim的命令窗口中输入“compxlib -help”查询
把库建好后,接下来的事情就是使它成为modelsim的标准库。这只要修改modelsim安装目录下的modelsim.ini文件就可以了。修改后的内容如下:
[Library]
std = $MODEL_TECH/../std
ieee = $MODEL_TECH/../ieee
verilog = $MODEL_TECH/../verilog
vital2000 = $MODEL_TECH/../vital2000
std_developerskit = $MODEL_TECH/../std_developerskit
synopsys = $MODEL_TECH/../synopsys
modelsim_lib = $MODEL_TECH/../modelsim_lib
simprim_ver = G:/EDA/Xilinx/simprim_ver(库的路径,以下同)
unisim_ver = G:/EDA/Xilinx/unisim_ver
xilinxcorelib_ver = G:/EDA/Xilinx/xilinxcorelib_ver
注意的是,这个文件是只读属性。修改之前要把这个属性去掉。
第六步:关掉工程,重启modelsim。查看这3个库是否在library框里面。
二、 在ISE环境下,调用synplify,生成后仿真所需要的文件。
之所以要在ISE环境下调用synplify,主要是因为方便!我也尝试过在synplify环境下综合设计文件,然后在ISE里编译synplify生成的edif文件。但是不成功。ISE在第三方工具支持方面做的是比较好的,感觉跟用ISE直接综合一样。不过有一个缺点是看不了RTL原理图。你可以在synplify中打开ISE生成的synplify工程文件,解决在ISE中不方便查看synplify综合结果的问题。现在,就要开始第二个大步骤了!
第一步:创建ISE工程文件。选择好器件。注意Design Flow中一定要选择Synplify Pro Verilog。
第二步:综合设计文件,也就是verilog文件。
ISE就会自动调用synplify。(如果没有的话,那可能是你的系统环境变量没有设置好)。此时会弹出一个对话框,要你选择synplify的liscense。(这步本来不用说的。如果没有对话框弹出来的话,也不要紧)随便选择一个,就等结果了。
第三步:生成后仿真需要的文件。
我们可以看到在Implement Design中有三个大分支,这对应着三种仿真。按你的需要按下相应的图标,生成modelsim后仿真所需要的文件,下面对生成的文件和生成这些文件的图标进行说明。
第三步:在弹出的对话框里,选择SDF项。把ISE生成的SDF文件添加进出。如下图:
记住Apply to Region这一项要写好。它对应的是你的tb文件(就是测试文件)调用的顶层模块名。(不是顶层模块名!!)比如你的测试文件是text,例化顶层模块top为i_top,那你应该这样填:text/i_top或者/text/i_top。如果是第一种仿真,此步可以省略。
第四步:添加library。
我们创建的那三个库终于派上用场了!我们要添加的就是这3个。选择library项,添加这3个库。你的库建在哪里,就去哪里找!这个也不用说了吧
第五步:选择要仿真的模块。
你先不要急,看清楚再选。(有些朋友性子急,驾轻就熟就选了)
我们要选的仿真模块可不止一个,如下图,用CTRL键实现!!选了之后点0k!!
9. 安卓关闭selinux好处
你好朋友
1. 禁止selinux
1.1 在内核中关闭selinux编译选项CONFIG_SECURITY_SELINUX
1.2 还可以在system.prop中定义ro.boot.selinux=disable
这两种方法都可以禁用selinux,也可以设置成ro.boot.selinux=permissive
宽容模式
1.3 可以通过setenforce1开启enforce模式,setenforce 0为permissive模式
getenforce获取当前模式
2. 所有安全策略最终编译成sepolicy文件放在root目录下,init进程启动后会读取/sepolicy策略文件,并通过/sys/fs/selinux/load节点
把策略文件内容写入内核
3 安全上下文存放root目录
/etc/security/mac_permissions.xml
/file_contexts //系统中所有file_contexts安全上下文
/seapp_contexts //app安全上下文
/property_contexts //属性的安全上下文
/service_contexts //service文件安全上下文
genfs_contexts //虚拟文件系统安全上下文
4. app在/data/data/文件的安全上下文设置过程
1. 根据uid,pkgname,seinfo在seapp_contexts中匹配.
2. 根据匹配到的contexts,重新设置给相对应文件
5. 系统中所有的object class 定义在external/sepolicy/security_classes中.
object class使用在allow语句中,object class所具有的操作定义在external/sepolicy/access_vectors
文件中
6 allow语句
allow语句用来权限设置
rule_name source_type target_type : class perm_set
rule_name : 有allow,neverallow
source_type : 权限主体,表示source_type对target_type有perm_set描述的权限
如:
allow zygote init:process sigchld
允许zygote域里面的进程可对init域的进程发送sigchld信号
typeattribute表示把属性和type关联起来
7 role定义
Android系统中的role定义在external/sepolicy/roles中,
目前只定义了r
8 socket使用
以/data/misc/wifi/sockets/wlan0 socket来说明使用方法
1. 定义socket type
type wpa_socket ,file_type
2. 指定安全上下文
/data/misc/wifi/sockets(/.*)? u:object_r:wpa_socket:s0
给/data/misc/wifi/sockets目录下所有的文件统一指定安全上下文为wpa_socket
3.声明socket使用权限
在进程te中使用unix_socket_send(clientdomain, wpa, serverdomain)即可建立socket连接
9binder使用
在使用binder进程的te中根据情况使用如下宏:
binder_use(domain)//允许domain域中的进程使用binder通信
binder_call(clientdomain, serverdomain)//允许clientdomain和serverdomain域中的进程通信
binder_service(domain)//标志domain为service端
10 文件的使用
以/dev/wmtWifi来说明:
1.定义type
type wmtWifi_device dev_type //dev_type用来标志/dev/下的文件
2.给/dev/wmtWifi指定完全上下文
/dev/wmtWifi(/.*)? u:object_r:wmtWifi_device:s0
3.进程权限设置
在进程te文件中allow权限
allow netd wmtWifi_device:chr_file { write open };
11 property 属性设置
以蓝牙的各种属性来说明
1.定义type
type bluetooth_prop, property_type;
2设置安全上下文
bluetooth. u:object_r:bluetooth_prop:s0
3进程权限设置
allow bluetooth bluetooth_prop:property_service set;
5 专业词汇
MLS :Multi-Level Security
RBAC :Role Based Access Control
DAC :Discretionary Access Control
MAC :Mandatory Access Control
TEAC :Type Enforcement Accesc Control
望采纳祝你好运