8

https://android-developers.googleblog.com/2017/07/seccomp-filter-in-android-o.html

正如本文的“seccomp 过滤器”部分所说,

Android O 的 seccomp 过滤器会阻止某些系统调用,例如涉及某些安全攻击的 swapon/swapoff,以及对应用程序无用的密钥控制系统调用。总的来说,过滤器阻止了 arm64 中 271 个系统调用中的 17 个和 arm 中 364 个系统调用中的 70 个。

现在,一些系统调用被阻塞并抛出错误signal 31 (SIGSYS), code 1 (SYS_SECCOMP), fault addr -------- Cause: seccomp prevented call to disallowed system call 55

但是我找不到上面列出的 arm64 中的 17 个系统调用和 arm 中的 70 个系统调用的列表。哪些系统调用受到限制?如何找到导致崩溃的系统调用?

编辑:

似乎此错误消息是在此处生成的。

https://github.com/aosp-mirror/platform_system_core/blob/master/debuggerd/libdebuggerd/tombstone.cpp#L96

  } else if (si->si_signo == SIGSYS && si->si_code == SYS_SECCOMP) {
    cause = StringPrintf("seccomp prevented call to disallowed %s system call %d", ABI_STRING,
                         si->si_syscall);
  }
4

1 回答 1

8

Android 8.0 Oreo 限制了哪些系统调用?

系统调用过滤器源文件是自动生成的,但从中生成过滤器的文本文件位于下一个目录 up中。在这里,我们找到了所有感兴趣的系统调用的列表,以及一些白名单和黑名单。想必应用黑名单就是你要找的;我总结如下。

编辑:系统调用过滤背景

过滤本身是 Linux 内核提供的标准功能,称为seccomp。AOSP 所做的只是利用此功能过滤上面链接的应用黑名单中列出的系统调用。一个脚本将黑名单处理成特定于平台的自动生成过滤器,然后将其馈送到 seccomp 用于启动所有 Android 应用程序的进程(即Zygote)。一旦此过滤处于活动状态,从过滤的进程(即任何应用程序)进行匹配的系统调用将导致传递SIGKILL 信号。看这里有关 Linux 信号的一些一般信息。您链接的 AOSP 源打印的错误消息只是系统在注意到您的进程已被终止时试图为您提供一些有用的信息 - 请注意方法名称是dump_probable_cause.

阻止修改 ID 的系统调用

+-------------------------------------------------- -+--------------+
| 功能 | 被封锁 |
+-------------------------------------------------- -+--------------+
| int setgid:setgid32(gid_t) | 手臂,x86 |
| int setgid:setgid(gid_t) | arm64,mips,mips64,x86_64 |
| int setuid:setuid32(uid_t) | 手臂,x86 |
| int setuid:setuid(uid_t) | arm64,mips,mips64,x86_64 |
| int setreuid:setreuid32(uid_t, uid_t) | 手臂,x86 |
| int setreuid:setreuid(uid_t, uid_t) | arm64,mips,mips64,x86_64 |
| int setresuid:setresuid32(uid_t, uid_t, uid_t) | 手臂,x86 |
| int setresuid:setresuid(uid_t, uid_t, uid_t) | arm64,mips,mips64,x86_64 |
| int setresgid:setresgid32(gid_t, gid_t, gid_t) | 手臂,x86 |
| int setresgid:setresgid(gid_t, gid_t, gid_t) | arm64,mips,mips64,x86_64 |
| int setfsgid(gid_t) | 全部 |
| int setfsuid(uid_t) | 全部 |
| int setgroups:setgroups32(int, const gid_t*) | 手臂,x86 |
| int setgroups:setgroups(int, const gid_t*) | arm64,mips,mips64,x86_64 |
+-------------------------------------------------- -+--------------+

阻止修改时间的系统调用

+-------------------------------------------------- -------------------+------------+
| 功能 | 被封锁 |
+-------------------------------------------------- -------------------+------------+
| int adjtimex(struct timex*) | 全部 |
| int clock_adjtime(clockid_t, struct timex*) | 全部 |
| int clock_settime(clockid_t, const struct timespec*) | 全部 |
| int settimeofday(const struct timeval*, const struct timezone*) | 全部 |
| int acct(const char* 文件路径) | 全部 |
| int klogctl:syslog(int, char*, int) | 全部 |
| int capset(cap_user_header_t 标头,常量 cap_user_data_t 数据)| 全部 |
| int chroot(const char*) | 全部 |
+-------------------------------------------------- -------------------+------------+

阻止系统调用以更改各种机器配置

+-------------------------------------------------- -------------------------------+------------+
| 功能 | 被封锁 |
+-------------------------------------------------- -------------------------------+------------+
| int init_module(void*, unsigned long, const char*) | 全部 |
| int delete_module(const char*, unsigned int) | 全部 |
| int mount(const char*, const char*, const char*, unsigned long, const void*) | 全部 |
| int umount2(const char*, int) | 全部 |
| int swapon(const char*, int) | 全部 |
| int swapoff(const char*) | 全部 |
| int setdomainname(const char*, size_t) | 全部 |
| int sethostname(const char*, size_t) | 全部 |
| int __reboot:reboot(int, int, int, void*) | 全部 |
+-------------------------------------------------- -------------------------------+------------+
于 2018-02-15T11:21:42.353 回答