在一台运行 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 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 以及是否存在某些特定于应用的系统调用(为实现兼容性,必须有这些系统调用)。