Android 安全攻防(二):SEAndroid bionic
最近研究SEAndroid,会陆续对各个模块做对比分析,学习移植SELinux至Android,学习程序管控策略。
bionic 作为第一个分析的模块,在此之前,先简单叙述一下SEAndroid,便于后续理解。
SEAndroid 与 Android 的区别
一句话概括:SEAndroid = SElinux + Android , 通过MAC的方式管控应用程序,从而提升原生Android系统的安全性。
SEAndroid 如何管控程序
一句话概括:程序向SEAndroid(确切的说是SELinux)发送请求,SEAndroid根据策略数据库进行策略分析,比对安全上下文,控制应用程序的资源存取。
SEAndroid bionic
SEAndroid在架构和机制上与SELinux完全一样,考虑到移动设备的特点,所以移植到SEAndroid的只是SELinux的一个子集。
1.增加系统调用
对比Android,SEAndroid bionic下增加了12个 system call :
[cpp] view plain copy print ?
- int fsetxattr(int,const char *,const void *,size_t, int)
- ssize_t fgetxattr(int, constchar *, void *,size_t)
- ssize_t flistxattr(int,char *, size_t)
- int fremovexattr(int,const char *)
- int setxattr(constchar *, constchar *, constvoid *, size_t,int)
- int lsetxattr(constchar *, constchar *, constvoid *, size_t,int)
- ssize_t getxattr(const char *, constchar *, void *,size_t)
- ssize_t lgetxattr(const char *,const char *,void *, size_t)
- ssize_t listxattr(const char *, char *,size_t)
- ssize_t llistxattr(const char *,char *, size_t)
- int removexattr(constchar *, constchar *)
- int lremovexattr(constchar *, constchar *)
int fsetxattr(int, const char *, const void *, size_t, int)
ssize_t fgetxattr(int, const char *, void *, size_t)
ssize_t flistxattr(int, char *, size_t)
int fremovexattr(int, const char *)
int setxattr(const char *, const char *, const void *, size_t, int)
int lsetxattr(const char *, const char *, const void *, size_t, int)
ssize_t getxattr(const char *, const char *, void *, size_t)
ssize_t lgetxattr(const char *, const char *, void *, size_t)
ssize_t listxattr(const char *, char *, size_t)
ssize_t llistxattr(const char *, char *, size_t)
int removexattr(const char *, const char *)
int lremovexattr(const char *, const char *)
2.linker增加AT_SECURE
SELinux为加载的应用程序设置AT_SECURE auxv 标志,具体在bionic/linker/linker.c:
[cpp] view plain copy print ?
-
- vecs = linker_env_init(vecs);
-
-
-
- for (v = vecs; v[0]; v += 2) {
- if (v[0] == AT_SECURE) {
-
- program_is_setuid = v[1];
- goto sanitize;
- }
- }
-
-
- program_is_setuid = (getuid() != geteuid()) || (getgid() != getegid());
/* Initialize environment functions, and get to the ELF aux vectors table */
vecs = linker_env_init(vecs);
/* Check auxv for AT_SECURE first to see if program is setuid, setgid,
has file caps, or caused a SELinux/AppArmor domain transition. */
for (v = vecs; v[0]; v += 2) {
if (v[0] == AT_SECURE) {
/* kernel told us whether to enable secure mode */
program_is_setuid = v[1];
goto sanitize;
}
}
/* Kernel did not provide AT_SECURE - fall back on legacy test. */
program_is_setuid = (getuid() != geteuid()) || (getgid() != getegid());
综上所述,bionic差异并不大,主要是AT_SECURE的加入, SELinux水很深,推荐鸟哥的文章一读:
鳥哥的 Linux 私房菜-第十七章、程序管理與 SELinux 初探