[置顶] 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…

Memcache的命令以及状态监控

输入telnet 127.0.0.1 11211(memcached默认端口为11211) stats :使用stats命令查看当前memcache服务器的状态 pidmemcache服务器的进程IDuptime服务器已经运行的秒数time服务器当前的unix时间戳versionmemcache版本pointer_size当前操作系统 …

flush python_带有示例的Python File flush()方法

flush python文件flush()方法 (File flush() Method) flush() method is an inbuilt method in Python, it is used to clear/flush the internal buffer, it is best practice while working with fila handling in Python, the internal buffer can be cleared before writin…

c++ 请抛弃匈牙利命名法 - 变量命名代码风格的建议。

我只针对c码农们讲,其他语言不了解不过应该大同小异。曾几何时翻开21天学通c系列等脑残入门书,都以匈牙利命名法示人(DWORD dwXXX, int nXXX, string strXXX)。现在我可以负责任的告诉你,把类型名写在前面屁用都没有,对…

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 的节点…

python 示例_带有示例的Python File write()方法

python 示例文件write()方法 (File write() Method) write() method is an inbuilt method in Python, it is used to write the content in the file. write()方法是Python中的内置方法,用于将内容写入文件中。 Syntax: 句法: file_object.write(text…

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

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

[2013-08-19] nohup的使用

前几天自摆了一个乌龙。 由于项目中用到memcache;在linux机器上安装了该服务后,启动并且通过 & 设置到后台进程; 由于要指定某些服务端口,然后发现经常服务被“莫名其妙”地关闭了。我以为是别人手动关掉了,或者说…

友盟—安卓巴士【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…

Java技能优化集锦

Java技能优化集锦 1 通用篇 “通用篇”讨论的问题适合于大多数Java应用。 1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clon…

java treemap_Java TreeMap size()方法与示例

java treemapTreeMap类的size()方法 (TreeMap Class size() method) size() method is available in java.util package. size()方法在java.util包中可用。 size() method is used to return the size of this TreeMap or in other words, we can say it returns the number of…

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

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

二、VC++环境的安装

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

Android 网络状态的监控

1 http://www.cnblogs.com/qingblog/archive/2012/07/19/2598983.html 2 转载于:https://www.cnblogs.com/bavariama/p/3268450.html

深入浅出jQuery——jQuery历史

Dean Edwards编写的Packer:http://dean.edwards.name/packer/转载于:https://www.cnblogs.com/mingle/archive/2011/12/01/2271155.html