Android O 中的 seccomp 过滤器
在 Android 的设备中,强制执行 Android 安全模式的重任交由内核承担。由于安全团队已努力加强 Android 的用户空间,并隔离和削弱进程的权限。因此内核已成为更多安全攻击的焦点。系统调用是攻击者攻击内核的常用方式。
所有 Android 软件都使用系统调用(简写为 syscall)与 Linux 内核通信。内核提供许多基于设备和 SOC 的系统调用,让用户空间的进程(包括应用程序)直接与内核交互。所有应用都依赖此机制,通过唯一的系统调用来检索访问对应的行为,例如打开文件或发送一条 binder 消息。但是许多系统调用没有被 Android 使用或官方支持。
Android O 利用被称为 seccomp 的 Linux 功能,使得未使用的系统调用无法被应用程序访问。由于应用无法访问这些系统调用,因此无法被潜在的有害应用程序利用。
seccomp 过滤器
Android O 包含一个已被安装到 zygote (所有 Android 应用均派生自该进程) 中的 seccomp 过滤器。由于过滤器已安装到 zygote,对所有应用程序生效,Android 安全团队采取了额外的措施,以防止破坏现有应用程序。seccomp 过滤器允许:
所有定义在 bionic (Android 的 C 运行时)内的系统调用。它们定义在 bionic/libc/SYSCALLS.TXT 内。
支持 Android 启动的系统调用。
常用的 Android 应用程序所使用的系统调用,由运行 Google 完整应用兼容性套件决定。
Android O 的 seccomp 过滤器会阻止某些系统调用(如 swapon/swapoff 已被用来进行一些安全攻击)以及关键控制系统调用(对应用无用)。此过滤器在 arm64 中共阻止了 271 个系统调用中的 17 个,在 arm 中共阻止了 364 个系统调用中的 70 个。
开发者
在运行了 Android O 的设备上测试您的应用是否使用了非法的系统调用。
检测非法的系统调用
在 Android O 中,系统将使调用非法系统调用的应用崩溃。日志打印显示非法的系统调用,例如:
03-09 16:39:32.122 15107 15107 I crash_dump32: performing dump of process 14942 (target tid = 14971) 03-09 16:39:32.127 15107 15107 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 03-09 16:39:32.127 15107 15107 F DEBUG : Build fingerprint: 'google/sailfish/sailfish:O/OPP1.170223.013/3795621:userdebug/dev-keys' 03-09 16:39:32.127 15107 15107 F DEBUG : Revision: '0' 03-09 16:39:32.127 15107 15107 F DEBUG : ABI: 'arm' 03-09 16:39:32.127 15107 15107 F DEBUG : pid: 14942, tid: 14971, name: WorkHandler >>> com.redacted <<< 03-09 16:39:32.127 15107 15107 F DEBUG : signal 31 (SIGSYS), code 1 (SYS_SECCOMP), fault addr -------- 03-09 16:39:32.127 15107 15107 F DEBUG : Cause: seccomp prevented call to disallowed system call 55 03-09 16:39:32.127 15107 15107 F DEBUG : r0 00000091 r1 00000007 r2 ccd8c008 r3 00000001 03-09 16:39:32.127 15107 15107 F DEBUG : r4 00000000 r5 00000000 r6 00000000 r7 00000037 Affected
开发者应该重新调整他们的应用程序,不要调用非法的系统调用。
在测试时切换 seccomp 过滤器
除了记录错误,seccomp 安装程序在运行 userdebug 和 eng builds 的设备上遵从 setenforce,这将允许您测试 seccomp 是否引发了某个问题。如果您输入:
adb shell setenforce 0 && adb stop && adb start
那么不会有任何 seccomp 策略被安装到 zygote。由于您无法从一个正在运行的进程中移除 seccomp 策略,所以您必须重新启动 shell 以使该选项生效。
设备制造商
由于 Android O 在 //bionic/libc/seccomp 包含相关的 seccomp 过滤器,因此设备制造商无需进行任何额外的实现。不过,在 //cts/tests/tests/security/jni/android_security_cts_SeccompTest.cpp 中有一个检查 seccomp 的 CTS 测试。该测试检查是否已阻止 add_key 和 keyctl 系统调用、是否已允许 openat,以及是否存在某些特定于应用的系统调用在兼容的前提下是否存在。
更多Android进阶技术,面试资料系统整理分享,职业生涯规划,产品,思维,行业观察,谈天说地。可以加Android架构师群;701740775。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android开源:EasyGuideLayer
这可能是最简单、灵活、强大的页面蒙层组件了!顾名思义,EasyGuideLayer是用于进行Android页面蒙层引导的组件。 特性 链式调用。调用逻辑清晰直观 支持同时设置多个引导层 支持高亮区域的自定义绘制 支持高亮区域点击监听 支持指定任意View设置蒙层引导 支持进行蒙层展示、隐藏事件监听 支持直接使用drawable创建引导View 示例代码与效果图 1. 对Actiity进行蒙层展示: CODE: <pre style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; word-break: break-word;"> // 创建引导层展示item val item = Guid...
- 下一篇
Android Gradle Plugin 源码解析(上)
一、源码依赖 本文基于: android gradle plugin版本: com.android.tools.build:gradle:2.3.0 gradle 版本:4.1 Gradle源码总共30个G,为简单起见,方便大家看源码,此处通过gradle依赖的形式来查看源码,依赖源码姿势: 创建一个新工程,app 项目目录中删除所有文件,仅留下gradle文件,依赖 apply plugin: 'java' sourceCompatibility = 1.8 dependencies { compile gradleApi() compile 'com.android.tools.build:gradle:2.3.0' } 将跟目录下的gradle文件,删除掉gradle依赖 buildscript { repositories { google() jcenter() } dependencies { // compile 'com.android.tools.build:gradle:2.3.0' } } 然后rebuild一下,就可以在External Libraries中查看...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker安装Oracle12C,快速搭建Oracle学习环境