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,以及是否存在某些特定于应用的系统调用在兼容的前提下是否存在。

相关源码

SYSCALLS.TXT

SECCOMP_BLACKLIST.TXT

SECCOMP_WHITELIST.TXT

原文发布于微信公众号 - Android群英传(android_heroes)

原文发表时间:2017-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小巫技术博客

Bugly使用篇之Java错误堆栈还原

16530

扩展CakePHP的CacheHelper以使用缓存引擎

CakePHP是一个MVC设计模式下的PHP框架,它使得您的生活更加简单并且让您的开发工作更上一层楼。尽管它被认为是一个相对缓慢的框架,(因为)它带有的大量缓存...

23890
来自专栏SpringBoot 核心技术

第五十章:SpringBoot2.0新特性 - 岂止至今最简单redis缓存集成

22430
来自专栏Java3y

移动商城项目总结

移动商城项目总结 移动商城项目是我第二个做得比较大的项目,该项目系统来源于传智Java168期,十天的视频课程(想要视频的同学关注我的公众号就可以直接获取了) ...

55780
来自专栏cloudskyme

企业级集成和ESB

ESB是什么? ESB是一个主要依赖XML消息交换的企业级消息系统,这种消息继而被智能的通过一种非集中式的架构路由和转换。 开源的ESB? Mule,Servi...

57570
来自专栏刘望舒

这一次彻底弄明白Gradle相关配置

1K20
来自专栏zhisheng

日志工具现状调研

  针对这类问题,对当前java比较流行的一些日志工具进行了调研,以期能够在未来的开发使用中做到全组代码风格统一,日志写得好对于我们开发调试,线上问题追踪等都有...

19420
来自专栏云计算教程系列

如何在CentOS 7上设置Jenkins以进行持续开发集成

合并代码、协调发布、确定构建状态、维护更新。如果你足够了解这些过程的挫败感,这些话本身就会让人头疼,你可能想看看Jenkins CI。

27210
来自专栏java一日一条

SSH框架总结

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于...

20340
来自专栏wblearn

Prose:Github所见即所得站点编辑器

最近才发现一个基于Github Pages的Jekyll内容编辑器Prose,感觉内容编辑更快、发布什么的更方便,所以想推荐给使用github的友友们,以前都是...

12410

扫码关注云+社区

领取腾讯云代金券