Android O 中的 seccomp 过滤器

简介: 在 Android 的设备中,强制执行 Android 安全模式的重任交由内核承担。由于安全团队已努力加强 Android 的用户空间,并隔离和削弱进程的权限。

在 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。

相关文章
|
XML 存储 前端开发
Android:Intent 和 Intent 过滤器
在前 4 篇文章中,我们介绍了 Android 四大组件的基础知识,四大组件是构成我们 App 的基础,也是 Android 系统设计的最佳体现。各个组件之间完全是解耦的,如果想访问其他组件或者启动其他组件可以使用 Intent 来操作。在四种组件类型中,有三种(Activity、Service 和 Broadcast)均可以通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。所以我们可以把 Intent 当作是各个组件之间的信使(无论该组件是自己 App 的还是其他 App)。
152 0
Android:Intent 和 Intent 过滤器
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
1月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
29 1
|
24天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
48 19
|
1月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
24天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
51 14
|
27天前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
25天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
在数字时代,掌握安卓应用开发技能是进入IT行业的关键。本文将引导读者从零基础开始,逐步深入安卓开发的世界,通过实际案例和代码示例,展示如何构建自己的第一个安卓应用。我们将探讨基本概念、开发工具设置、用户界面设计、数据处理以及发布应用的全过程。无论你是编程新手还是有一定基础的开发者,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上迈出坚实的步伐。
32 5