Android O的Seccomp过滤器
原标题:Seccomp filter in Android O
链接:https://android-developers.googleblog.com/2017/07/seccomp-filter-in-android-o.html
作者:Paul Lawrence (Android安全工程师)
翻译:arjinmc
对于Android系统的设备中,内核执行Android安全模式非常重要。由于安全团队已经努力加强Android的用户空间并隔离和剥夺进程,内核已成为更多安全攻击的焦点。系统调用是攻击者定位内核的常用方式。
所有Android软件使用系统调用或简单的系统调用与Linux内核通信。内核提供许多设备和SOC特定的系统调用,允许用户空间进程(包括应用程序)直接与内核交互。所有应用程序依赖此机制来访问由唯一系统调用所索引的行为集合,例如打开文件或发送Binder消息。然而,许多这些系统调用没有被Android使用或正式支持。
Android O利用称为seccomp的Linux功能,使得未使用的系统调用无法应用于应用软件。由于这些系统调用不能被应用程序访问,因此无法被潜在的有害应用程序利用。
seccomp过滤器
Android O包含一个安装在zygote中的单个seccomp过滤器,从该应用程序的派生过程。由于过滤器已被安装到合适的应用程序中,因此安装了所有应用程序,Android安全小组特别小心不破坏现有的应用程序。seccomp过滤器允许:
- 所有通过仿生体系显示的系统调用(Android的C运行时)。这些在bionic / libc / SYSCALLS.TXT中定义。
- 系统调用允许Android引导
- 系统调用由流行的Android应用程序使用,由运行Google的完整应用程序兼容性套件确定
Android O的seccomp过滤器阻止某些系统调用(例如swapon / swapoff),这些系统调用已经涉及一些安全攻击,以及按键控制系统调用,这对应用程序无用。总的来说,arm64中的271个系统调用的过滤器块17和臂中的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
受影响的开发者应该重新调整他们的应用程序,不要调用非法的系统调用。
在测试期间切换seccomp过滤器
除了记录错误之外,seccomp安装程序在运行userdebug和eng构建的设备上遵守setenforce,这允许你测试seccomp是否对问题负责。如果输入:
adb shell setenforce 0 && adb stop && adb start
那么没有安全策略将被安装到合并。因为无法从正在运行的进程中删除一个seccomp策略,所以必须重新启动shell才能使此选项生效。
设备制造商
由于Android O包含相关的seccomp过滤器,在//bionic/libc/seccomp,因此设备制造商无需执行任何其他操作。但是,有一个CTS测试检查seccomp在//cts/tests/tests/security/jni/android_security_cts_SeccompTest.cpp。测试检查add_key和keyctl系统调用被阻止并被openat允许,以及必须存在的一些应用程序特定的系统调用以兼容。