[置顶] Android的IPC访问控制设计与实现

3.3.1 IPC钩子函数设计与实现

IPC Binder是Android最重要的进程间通信机制,因此,必须在此实施强制访问控制。

1. 修改secuirty.h

打开终端shell,输入指令“cd /android4.0/kernel/goldfish/include/linux/vim security.h”,找到结构security_operations,加入函数指针变量,如下所示:

/*

* This is the main security structure.

*/

struct security_operations {

   charname[SECURITY_NAME_MAX + 1];

#ifdef HAVE_SMACK

   /*

    * to add a binder hook

    * */

   int(*binder_transaction) (struct task_struct *from, struct task_struct *to);

#endif

随后在security_operations定义结尾后,加入函数声明,如下:

#ifdef HAVE_SMACK

int security_binder_transaction(structtask_struct *from, struct task_struct *to);

#endif

在LSM钩子函数实现处加入security_binder_transaction的定义,如下:

#ifdef HAVE_SMACK

static inline intsecurity_binder_transaction(struct task_struct *from, struct task_struct *to) {

   return 0;

}

#endif

2. 修改security.c

打开终端shell,输入指令“cd /android4.0/kernel/goldfish/security/vim security.c”,加入函数,如下所示:

#ifdefHAVE_SMACK

intsecurity_binder_transaction(struct task_struct *from, struct task_struct *to) {

    returnsecurity_ops->binder_transaction(from, to);

}

#endif

3. 修改smack_lsm.c

打开终端shell,输入指令“cd /android4.0/kernel/goldfish/security/smack/vim smack_lsm.c”,加入函数“smack_binder_transaction”,如下所示:

#ifdefHAVE_SMACK

/*

 * smack_binder_transaction - to check bindertransaction between two tasks

 * */

static intsmack_binder_transaction(struct task_struct *from, struct task_struct *to) {

    int rc1, rc2;

    /*

     * ask the two task must have writepermission to each other

     * */

    rc1 = smk_access(task_security(from),task_security(to), MAY_WRITE);

    rc2 = smk_access(task_security(to),task_security(from), MAY_WRITE);

 

    return rc1 == 0 && rc2 == 0 ? 0:1;

}

#endif

此钩子函数用来判断源进程from和目标进程to之间有没有互相写权限。最后在结构体security_operations smack_ops新增成员变量如下:

structsecurity_operations smack_ops = {

   .name =                      "smack",

#ifdefHAVE_SMACK

   .binder_transaction = smack_binder_transaction,

#endif

4. 重新编译模拟器内核

编译Android内核方法已经在第二章有所阐述,这里不再叙述。

3.3.2  

每个进程分为用户空间和内核空间两部分,不同进程的用户空间是无法共享的,进程内核空间通过Android Binder来实现IPC。Binder驱动代码位于“/android4.0/kernel/goldfish/driver/staging/android/bind.c”文件中,其中binder_transaction函数使用binder_transaction_data结构体的数据来执行Binder寻址、复制Binder IPC数据、生成及检索Binder节点等操作。打开终端shell,输入指令“cd /host/android4.0/kernel/goldfish/drivers/staging/android/vim binder.c”,找到该函数的定义,如下

static voidbinder_transaction(struct binder_proc *proc, struct binder_thread *thread, struct binder_transaction_data *tr, int reply);

在源进程和目标进程确定后,加入代码,如下:

       if(security_binder_transaction(proc->tsk,target_proc->tsk)) {

           return_error = BR_FAILED_REPLY;

           goto err_invalid_target_handle;

       }

其中,target_proc->tsk指向目标进程的task_struct,proc->tsk指向源进程的task_struct,加入security_task_movememory用来判断当前进程对源进程有没有写权限,security_binder_transaction用来判断源进程对目标进程有没有写权限,这两个函数均为LSM钩子函数,由于内核已经装载了smack模块,因此它们是指向了smack内核的smack_task_movememory和smack_binder_transaction。加入上述代码的目的是为了防止进程不经授权滥用IPC Binder进行通信,正如下图所示:


 

如上图所示,服务客户端通过Binder调用Service Server的foo函数,服务客户端将Binder IPC数据通过BinderDriver传递给Service Server,Binder Driver是源进程和目标进程通信的媒介,IPC检查机制就是在Binder Driver中检查源进程和目标进程之间有没有互相“写”的权限。在进程的安全标签不是“_”的前提下,使用Smack可以实现对进程的控制。例如上层应用如果要想实现发短信的功能,与上层应用所对应的Linux进程是在BinderDriver中与radio进程进行互相通信,如果smack规则否定了上层应用对radio“写”权限,那么上层应用不能实现发短信的功能。再如,上层应用要想实现访问通讯录的目的,上层应用也是在Binder Driver中与通讯录进程进行通信,如果smack规则容许上层应用对通讯录进程有“写”的权限,那么上层应用才可以访问通讯录。恶意软件可能绕过Android框架层的权限检查机制,但它们绕不过内核的IPC检查。


转载于:https://www.cnblogs.com/pangblog/p/3265265.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow在Anaconda环境下创建

一、我使用的是Anaconda自带的Jupyter编译器,详细的安装教程可以参考博文 二、之后打开Jupyter 三、进行测试 我的tensorflow使用的是2.0版本 import tensorflow.compat.v1 as tf tf.disable_v2_behavior()a tf.constant([1.0,2.0],name"a") b tf.co…

leetcode 654. 构造最大二叉树 思考分析

题目 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树&am…

Pycharm更换anaconda环境空间

一、File—>Settings 或者直接快捷键 CtrlAltS 二、找到自己的项目—>Project Interpreter—>找到需要使用的anaconda环境空间 三、Add Local 四、G:\Anaconda3\envs\mask_rcnn\python.exe一般anaconda的envs文件夹下,找到你的环境空间名称,…

android 应用demo截图

ksoap2实现天气预报 Frame 动画 baidu map 转载于:https://www.cnblogs.com/java20130726/archive/2011/11/28/3218328.html

leetcode 617. 合并二叉树 思考分析

题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点…

如何关掉Microsoft Office Click-to-Run服务

很烦,一开电脑就出现 一、打开任务管理器(CtrlShiftEsc) 服务—>打开服务 二、找到Microsoft Office Click-to-Run Service 右击,选择属性 三、禁用即可

友盟—安卓巴士【Android开发原创教程大赛】

Android开发原创教程大赛正式拉开序幕了,由国内最专业的移动开发者服务及统计平台-友盟提供丰厚的话费奖品哦,为所有爱写教程的开发者提供的一份奖励。 活动时间:2011年11月29日——2011年12月21日 征集期:2011年…

leetcode 700. 二叉搜索树中的搜索 思考分析

目录题目1、不考虑BST性质,直接递归遍历2、回顾BST性质3、利用BST性质进行遍历4、简单的迭代方法题目 给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在&#xf…

一、环境准备

一、前提已安装好anaconda 二、打开cmd命令窗口 conda activate激活base环境 conda create -n pytorch python3.6创建一个名称为pytorch的环境空间,其中使用的python版本为3.6 conda env list查看当前都有哪些环境 conda activate pytorch 激活刚安装的环境 pip l…

LeetCode 98. 验证二叉搜索树 思考分析

题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 1、利用BST性质:中序…

二、VC++环境的安装

一、打开PyCharm 在Terminal中激活pytorch环境,conda activate pytorch 安装pycocotools工具,pip install pycocotools 二、报错需安装VC 进入官网 安装完成之后重启电脑 三、再次安装pycocotools 打开Pycharm,安装pycocotools工具&am…

LeetCode 530. 二叉搜索树的最小绝对差 思考分析

目录题目思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值思路2:不用数组,进行优化思路3、回顾迭代法求解题目 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差…

一、线性回归

一、在有监督学习中主要包括两大类问题 分类问题:你去银行贷款借钱,人家银行会不会借给你?当然只有两种答案:会、不会 回归问题:人家银行能借给你多少钱?是一个具体的值 举个例子:假如你去银行…

8-18-Exercise

8-18-小练 A.HDU 1172 猜数字 采用枚举~【赤果果的暴力~】 代码&#xff1a; 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 using namespace std;5 6 int x[111],y[111],s,ss,vis[4],dis[4];7 char a[111][5];8 9 void find(int b,int …

leetcode 501. 二叉搜索树中的众数 思考分析

目录题目1、不考虑BTS性质&#xff0c;直接寻找众数集合&#xff08;利用map&#xff09;2、考虑BTS的中序遍历结果性质题目 给定一个有相同值的二叉搜索树&#xff08;BST&#xff09;&#xff0c;找出 BST 中的所有众数&#xff08;出现频率最高的元素&#xff09;。 假定 BS…

二、模型评估方法

IDE为Jupyter Notebook scikit-learn官网 scikit-learn是一个专门用于机器学习的工具包 运用到啥函数不知道咋使用&#xff1f;戳它–>scikit-learn工具包的API文档 不知道用啥模板&#xff1f;戳它–>scikit-learn样例模型 功能翻译Classification分类Regression回归Cl…

三、线性回归实验分析

所有代码块都是在Jupyter Notebook下进行调试运行&#xff0c;前后之间都相互关联。 文中所有代码块所涉及到的函数里面的详细参数均可通过scikit-learn官网API文档进行查阅&#xff0c;这里我只写下每行代码所实现的功能&#xff0c;参数的调整读者可以多进行试验调试。多动手…

leetcode 236. 二叉树的最近公共祖先 思考分析

目录题目思考分析改进本文章代码思路来源于公众号【代码随想录】题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、…

leetcode 235. 二叉搜索树的最近公共祖先 思考分析

目录题目思考迭代法题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff0…

四、逻辑回归

逻辑回归logistic_regression(LR)其实是分类算法&#xff0c;而不是回归算法。 回归算法得到的是一个数&#xff0c;分类算法得到的是几个不同的类别。 逻辑回归就是通过函数将值转换为0-1之间&#xff0c;形成概率问题&#xff0c;从而实现了不同类别的分类。 Sigmoid 函数 …