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检查。

[置顶] Android的IPC访问控制设计与实现的更多相关文章

  1. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  2. [置顶] Android系统访问控制之Smack安全策略设计与实现

    1. 制定smack规则 “Zygote”进程由init进程创建,它负责创建系统服务进程“systemserver”.“radio”进程和APP进程.其中“radio”进程的uid是1001,它能够实 ...

  3. [置顶] Android访问控制系统测试与评估

    5.1实验方案 通过以上章节,本文阐述了目前Android平台上的恶意软件以“隐私窃取”和“恶意扣费”类为主,本研究课题访问控制的目标也正是阻止恶意软件“隐私窃取”和“恶意扣费”的行为,因此,本实验方 ...

  4. [置顶] android关机闹钟设计思路

    1: 首先需要硬件支持,支持alarm中断触发开机,目前高通平台几乎都支持: 2:关机前需要在rtc-xxx.c中做到enable_irq_wake,和不disable alarm功能(默认开机后al ...

  5. [置顶] Android安全机制分析

    Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...

  6. [置顶] Android 适配真要命?

    原始尺寸场景 相信大家对上面也有所有耳闻另外就是如何计算屏幕的密度一般都是按照勾股定理例如中等屏幕密度 480^2+800^2开根号 然后除以当前屏幕尺寸3.5-4.2之间尺寸. 对于刚出来的那些An ...

  7. [置顶] Android 2016新技术

    版权声明:分享技术,传播快乐.如果本博客对你有帮助,请在我的博客首页为我打赏吧! 2016你需要了解Android有以下新兴的技术与框架,有些也许还不成熟,但是你应该去了解下,也许就是未来的方向. K ...

  8. [置顶] Android Provision (Setup Wizard)

    Android中很多框架性的设计都已经存在了,但在市场上的发布版本里却因为没有很好的理解Android的设计意图而进行自己的定制,或者自己又做一 个冗余的实现.Android中的Provision其实 ...

  9. [置顶] Android AlarmManager实现不间断轮询服务

    在消息的获取上是选择轮询还是推送得根据实际的业务需要来技术选型,例如对消息实时性比较高的需求,比如微博新通知或新闻等那就最好是用推送了.但如果只是一般的消息检测比如更新检查,可能是半个小时或一个小时一 ...

随机推荐

  1. (转)用eclipse创建一个j2ee的web工程后,左面projects窗口中的项目如何没有显示webRoot文件夹,除了src的文件夹,其他都不显示

    左边目录窗口的右上方,有个向下的箭头,点里面的filters,把所有的勾都去掉看看

  2. 第一个androidAPP项目总结—ListView的上拉和下拉

    1.下拉刷新 需继承implements SwipeRefreshLayout.OnRefreshListener @Overridepublic void onRefresh() { new Wea ...

  3. ASP.NET 页面间数据传递的方法

    在做WEB开发时,很多地方会涉及到页面间的数据传递.这几天在完善教务基础系统,遇到了这个问题,上网查了一些资料,现总结如下: 说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是 ...

  4. Caused by: java.lang.NullPointerException, java.lang.reflect.InvocationTargetExc

    java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native M ...

  5. Qt5如何设置静态编译,解决生成的可执行文件打开出错问题

    将https://yunpan.cn/cqGGURjmG2fEY  访问密码 8de5  中的压缩包Qt5-MSVC-Static-master.zip 解压到你的qt安装目录,一般就是C:\Qt下, ...

  6. jquery mobile 复选框和单选框

    checkbox 和radio <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...

  7. wdcp/wdlinux一键包的php5.3版本添加Zend.so 和Soap.so

    Wdcp 安装soap扩展 1.首先进入 soap模块的安装文件,wdcp安装包解压对应的php中有,如:/root/miloxi/lanmp/php-5.5.10/ext/soap 2.执行: (1 ...

  8. 生产环境下Centos 6.5优化配置 (装载)

    本文 centos 6.5 优化 的项有18处: 1.centos6.5最小化安装后启动网卡 2.ifconfig查询IP进行SSH链接 3.更新系统源并且升级系统 4.系统时间更新和设定定时任 5. ...

  9. PHP 中变量的间接引用

    请看以下代码: <?php $name="Yshy"; $$name="Yanshiying"; echo $Yshy; ?> 在浏览器端将会输出: ...

  10. FMX手机app,如何下载网站图片而不卡界面

    你用的版本? 你应该关注下delphi 更新说明第一方法: 可以用线程.第二方法: TNetHTTPClient 已经支持异步 TThread.CreateAnonymousThread( proce ...