zoukankan      html  css  js  c++  java
  • [置顶] Android系统访问控制之Smack安全策略设计与实现

    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修改白名单配置文件的访问模式。

  • 相关阅读:
    linux sysfs (2)
    微软——助您启动云的力量网络虚拟盛会
    Windows Azure入门教学系列 全面更新啦!
    与Advanced Telemetry创始人兼 CTO, Tom Naylor的访谈
    Windows Azure AppFabric概述
    Windows Azure Extra Small Instances Public Beta版本发布
    DataMarket 一月内容更新
    和Steve, Wade 一起学习如何使用Windows Azure Startup Tasks
    现实世界的Windows Azure:与eCraft的 Nicklas Andersson(CTO),Peter Löfgren(项目经理)以及Jörgen Westerling(CCO)的访谈
    正确使用Windows Azure 中的VM Role
  • 原文地址:https://www.cnblogs.com/pangblog/p/3265254.html
Copyright © 2011-2022 走看看