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. Debugging Failed Because Integrated Windows Authentication Is Not Enabled

    To enable integrated Windows authentication Log onto the Web server using an administrator account. ...

  2. mysql数据库编码

    MySQL数据库默认的编码是: character set :latin1 collation : latin1_swedish_ci 查看MySQL支持的编码: mysql> show cha ...

  3. java虚拟机涉及内存溢出

    Java语言写的代码是.java文件,它会被特定程序编译(javac.exe,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行 ...

  4. Linux升级C基本运行库CLIBC

    在你准备升级GLIBC库之前,你要好好思考一下, 你真的要升级GLIBC么? 你知道你自己在做什么么? glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎 ...

  5. Jenkins学习之——(3)将项目发送到tomcat

    本章节将讲解如何将项目发送到tomcat,实现自动部署. 我只将一个测试的maven项目托管到github上的,不了解git获github的朋友自己百度一下,我也写了一些关于git的文章,希望大家可以 ...

  6. Swift和OC混编时, 关于@objc的作用

    Objective-C 和 Swift 在底层使用的是两套完全不同的机制,Cocoa 中的 Objective-C 对象是基于运行时的,它从骨子里遵循了 KVC (Key-Value Coding,通 ...

  7. VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载

    VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程     转载 #include <stdio.h>#include &l ...

  8. 【转】C++箴言:理解typename的两个含义

    [转载]http://dev.yesky.com/13/2221013.shtml 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不 ...

  9. 《Effective C++》 阅读小结 (笔记)

    A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做 ...

  10. Ubuntu最小化桌面快捷键Super+D不生效解决

    之前用的Debian,最近研发老大让统一使用Ubuntu来开发,安装了Ubuntu 15.10之后,设置了最小化桌面的快捷键为Super+D(在Systm Settings/系统设置—>Keyb ...