1. 制定smack规则

“Zygote”进程由init进程创建,它负责创建系统服务进程“systemserver”、“radio”进程和APP进程。其中“radio”进程的uid是1001,它能够实现打电话和发短信的功能,“systemserver”进程uid是1000,它负责创建系统服务组件,通讯录进程uid是10000,它能够访问通讯录数据库,uid大于等于10000的进程都属于Android应用程序进程。

为了实现对“radio”和通讯录进程的访问控制,本课题使用“libsmack”库中“setsmack”函数将“radio”进程的安全标签设置为“1001”。将通讯录进程的安全标签设置为“10000”。需要强调的是,上面两个uid是被Android系统硬编码,不随Android版本改变而改变。假设某个进程的uid是XXX,当“Zygote”进程“fork”此进程时,该进程首先是一个特权进程,因此它可以使用“setsmack”函数将自身安全标签设置为“XXX”,并装载Smack安全策略。本研究课题在经过大量实验基础上总结得出下面规则:

(1)确保一个进程正常运行:“XXX  _  rwxa”&& “_ XXX  rwxa”

由于Smack被编译到Android系统中,因此,在默认情况下,Android系统所有文件和进程的安全标签都是“_”,一个被重新设置过安全标签的进程要想正常运行,必然要和安全标签是“_”进程进行通信或者读写某些安全标签是“_”的文件。

(2)禁止一个进程正常运行:“XXX  _  ----”

(3)禁止一个进程发生短信:“XXX  1001  ----”

任何一个进程要想发送短信必须在“Binder Driver”中与“radio”进程通信,因此,只要该进程不能发送消息给“radio”进程,那么该进程就不能完成发送短信的功能。

(4)容许一个进程发生短信:“XXX  1001  rwxa”&& “1001 XXX  rwxa”

(5)容许通讯录进程正常访问通讯录:“10000 contact  rwxa”

“/data/data/com.android.providers.contacts/database/contact2.db”存放通讯录里的信息,为此,在“dalvik_system_Zygote.cpp”中使用“libsmack”库中的函数“setxattr”将这个数据库文件的安全标签设置为“contact”。为了使通讯录进程能够正常访问通讯录,必须保证通讯录进程对此数据库文件有读、写、执行和“盲写”的权限。

(6)容许一个进程正常访问通讯录:

“XXX  10000 rwxa” && “10000  XXX rwxa”

在具备规则5的前提下,一个进程要想访问通讯录,它必须与通讯录进程在“Binder Driver”中通信,为此必须容许这两个进程能够互相发送消息给对方。

(7)禁止一个进程访问通讯录和通话记录:“XXX 10000  ----”

(8)容许一个进程访问短信记录:“XXX  sms  rwxa”

“/data/data/com.android.providers.telephony/database/mmssms.db”是短信和彩信的信息数据库文件,同样也是使用函数“setxattr”将这个数据库文件设置安全标签“sms”,任何一个进程要想查看短信,必须能够访问此数据库文件。

(9)禁止一个进程访问短信记录:“XXX  sms  ----”

(10)容许一个进程访问SD卡文件:“XXX sdcard  rwxa”

Smack是利用虚拟文件系统VFS的“inode”和“super_block”为文件系统设置安全标签,因此不管SD卡采用什么样的文件系统,SD卡上的文件均可以被设置安全标签“sdcard”。

(11) 禁止一个进程访问SD卡文件:“XXX  sdcard ----”

(12) 禁止Android系统打电话和发短信:“1001  _  ----”

这里的“_”代表了radio守护进程,它是由“init”进程创建的,它的可执行文件是“/system/bin/radio”,Android系统打电话和发短信功能最终是要靠它来驱动硬件实现。“1001”进程就是在“Binder Driver”中与radio守护进程进行通信,从而完成了打电话和发送短信的功能。如果想要禁止Android系统中所有进程打电话和发短信,只要“1001”进程不能发消息给radio守护进程即可。

(13) 容许Android系统正常打电话和发短信:

“1001  _  rwxa”&& “_  1001 rwxa”

2. 装载smack策略

由于Zygote每“fork”子进程,该子进程首先是一个特权进程,如下所示:

dvmDumpLoaderStats("zygote");

pid = fork();

if (pid == 0) {

int err;

... ...

}

因此,可以在定义变量err之后加入控制代码。这里,本课题设计了如下四个函数:

#ifdef HAVE_SMACK

/*

* set process self smack label and smack rules

* return -1 if the database can not be opencorrectly

* return 2 if the uerId can not be found inthe smack rules table

* else return 1 if the smack label and rulecan be set correctly

* else return 0 if the smack label can not beset correctly

* */

static int setsmacklabelrules(intuserId);

setsmacklabelrules是根据uerId值到安全策略数据库中,查找相关的smack规则。

/*

* set sdcard label to the files on sdcard interms of encryptedfiles table

* return -1 if the database can not be opencorrectly

* return 1 if files xattr can be set correctlyon the sdcard

* else return 0

* */

#ifdef HAVE_SMACK

static intsetlabelTosdcardfiles();

setlabelTosfcardfiles是从sdcard文件列表中查找文件的绝对路径,并调用setxattr为文件设置安全标签,在此,设置短信数据库和通讯录数据库安全标签的代码也放入其中,如下所示:

if(setxattr("/data/data/com.android.providers.telephony/databases/mmssms.db",SMACKATTR, "sms", strlen("sms") + 1, 0) < 0) {

xattr = false;

}

if(setxattr("/data/data/com.android.providers.contacts/databases/contacts2.db",SMACKATTR, "contact", strlen("contact") + 1, 0) < 0) {

xattr = false;

}

为了能够进一步控制打电话和发短信行为,本课题设计了InitializeOutgoingcallwhitelist函数将白名单数据表内容导入白名单配置文件中,如下所示:

#ifdef HAVE_SMACK

/*

* to initialize outgoingcallwhitelist

* return 1 if the outgoingcallwhitelist fileis initialized correctly

* else return 0

* */

static int InitializeOutgoingcallwhitelist();

又因为radio所属的组是user,所以它不能读取Zygote创建的白名单配置文件,所以必须使用chmod修改白名单配置文件的访问模式。

[置顶] Android系统访问控制之Smack安全策略设计与实现的更多相关文章

  1. [置顶] Android系统五大布局详解Layout

    我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前,视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit等 ...

  2. [置顶] android系统如何在静音模式下关闭camera拍照声音(2)

    之前写过一篇“android系统如何在静音模式下关闭camera拍照声音”的博客,今天来写他的续篇,继续探讨这个问题. 公司新需求,要求在camera应用中添加一个开关,可以进行拍照声音的关闭和开启. ...

  3. [置顶] Android系统移植与调试之------->build.prop文件详细赏析

    小知识:什么是build.prop?   /system/build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件.这个文件是如 ...

  4. [置顶] Android系统移植与调试之------->Amlogic方案编译步骤

    1. 拷贝Amlogic的SourceCode 切换目录到  /home/roco/work/amlogic/SourceCode/mx0831-0525下将mx0831-0525.tgz拷贝到  / ...

  5. [置顶] Android系统移植与调试之------->如何修改Android设备状态条上音量加减键在横竖屏的时候的切换与显示

    这两天由于一个客户的要求,将MID竖屏时候的状态条上的音量键去掉.所以尝试修改了一下,成功了,分享一下经验. 先看一下修改后的效果图,如下所示 . 横屏的时候:有音量加减键 竖屏的时候:音量加减键被去 ...

  6. [置顶] Android系统移植与调试之------->如何修改Android设备添加3G上网功能

    1.首先先来看一下修改前后的效果对比图 step1.插上3G设备前 step2.插上3G设备后,获取信号中.... step3.插上3G设备后,获取到信号 step4.使用3G信号浏览网页 2.下面讲 ...

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

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

  8. [置顶] Android Sensor系统剖析(4.0)(下)

    Author:Harish_hu@qq.com 由于现在电脑上只有4.0的代码,考虑到代码差别也不大,所以下部分,就基于4.0来分析.  3:SensorManager 上一部分说过,开机后,syst ...

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

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

随机推荐

  1. css布局之负margin妙用及其他实现

    相信大家在项目的开发中都遇到过这样的需求,一行放X(X>1)个块且相邻块之间的间距相同. 大概就是上面这个样子,下面介绍几种实现的方式. 1.负margin大法 设置好元素的宽度和留白占满父级的 ...

  2. mockServer学习

    mockServer学习 很喜欢mockserver官方主页的背景颜色和格式 官方主页如下: http://www.mock-server.com/

  3. (转)C#静态构造函数

    静态构造函数是C#的一个新特性,在编程过程中用处并不广,它的主要目的是用于初始化一些静态的变量. 因为这个构造函数是属于类的,而不属于任何一个实例,所以这个构造函数只会被执行一次,而且是在创建此类的第 ...

  4. linux下查看所有用户及所有用户组

    groups 查看当前登录用户的组内成员groups gliethttp 查看gliethttp用户所在的组,以及组内成员whoami 查看当前登录用户名 /etc/group文件包含所有组/etc/ ...

  5. RecycleView 滑动到底部,加载更多

    android.support.v7 包提供了一个新的组件:RecycleView,用以提供一个灵活的列表试图.显示大型数据集,它支持局部刷新.显示动画等功能,可以用来取代ListView与GridV ...

  6. sql server 导出

    http://ssat.codeplex.com/SourceControl/latest 用于连接sql server

  7. jQuery Easy UI (适应屏幕分辨率大小)布局(Layout)

    一.jQuery Easy UI (适应屏幕分辨率大小)布局(Layout) 1.首先应用的是jquery-easyui-1.4 版本(版本不同,兼容性不同) 2.实现整个页面的布局( layout: ...

  8. colorful-记录好看的颜色

    p { float: left; width: 100px; height: 100px; border: 1px solid black; margin: 5px; text-align: cent ...

  9. A Bug's Life(hdu1829种类并查集)

    题意:有一群虫子,现在给你一些关系,判断这些关心有没有错 思路:向量种类并查集,下面讲一下向量的种类并查集 本题的各个集合的关心有两种0同性,1异性,怎么判断有错, 1.先判断他们是否在一个集合,即父 ...

  10. htmlspecialchars()函数

    htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体. 预定义的字符是: & (和号) 成为 & " (双引号) 成为 " ' (单引 ...