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

  • 相关阅读:
    自动化测试最新面试题和答案
    没有接口设计文档怎么做测试?
    测试岗/测试开发岗面经合集
    安卓测试常用的 ADB 命令
    面试问题集合
    springboot测试邮件发送
    swagger
    shiro 登录拦截和用户认证、资源授权
    SpringSecurity(安全框架)
    SpringBoot整合Mybatis框架
  • 原文地址:https://www.cnblogs.com/pangblog/p/3265254.html
Copyright © 2011-2022 走看看