奥利奥:如何在源代码中找到所有受限制的系统调用?

时间:2018-02-15 07:53:35

标签: android system-calls android-8.0-oreo android-8.1-oreo

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

As" seccomp filter"本文的一节说,

  

Android O的seccomp过滤器阻止某些系统调用,例如swapon / swapoff,这些系统调用已经涉及某些安全攻击,以及关键控制系统调用,这对应用程序无用。总共271个过滤器块中的27个系统调用arm64和70个364个手臂。

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

但我找不到上面列出的arm64中的17个系统调用和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);
  }

1 个答案:

答案 0 :(得分:5)

Android 8.0 Oreo中哪些Syscalls受限制?

系统调用过滤器source files是自动生成的,但生成过滤器的文本文件位于the next directory up。在这里,我们找到了list of all syscalls of interest,以及一些白名单和黑名单。据推测,app blacklist正是您所寻找的;我在下面总结了它。

编辑:Syscall过滤背景

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

阻止Syscalls修改ID

+--------------------------------------------------+--------------------------+
|                     Function                     |        Blocked On        |
+--------------------------------------------------+--------------------------+
| int   setgid:setgid32(gid_t)                     | arm,x86                  |
| int   setgid:setgid(gid_t)                       | arm64,mips,mips64,x86_64 |
| int   setuid:setuid32(uid_t)                     | arm,x86                  |
| int   setuid:setuid(uid_t)                       | arm64,mips,mips64,x86_64 |
| int   setreuid:setreuid32(uid_t, uid_t)          | arm,x86                  |
| int   setreuid:setreuid(uid_t, uid_t)            | arm64,mips,mips64,x86_64 |
| int   setresuid:setresuid32(uid_t, uid_t, uid_t) | arm,x86                  |
| int   setresuid:setresuid(uid_t, uid_t, uid_t)   | arm64,mips,mips64,x86_64 |
| int   setresgid:setresgid32(gid_t, gid_t, gid_t) | arm,x86                  |
| int   setresgid:setresgid(gid_t, gid_t, gid_t)   | arm64,mips,mips64,x86_64 |
| int   setfsgid(gid_t)                            | all                      |
| int   setfsuid(uid_t)                            | all                      |
| int   setgroups:setgroups32(int, const gid_t*)   | arm,x86                  |
| int   setgroups:setgroups(int, const gid_t*)     | arm64,mips,mips64,x86_64 |
+--------------------------------------------------+--------------------------+

阻止系统调用以修改时间

+--------------------------------------------------------------------+------------+
|                              Function                              | Blocked On |
+--------------------------------------------------------------------+------------+
| int   adjtimex(struct timex*)                                      | all        |
| int   clock_adjtime(clockid_t, struct timex*)                      | all        |
| int   clock_settime(clockid_t, const struct timespec*)             | all        |
| int   settimeofday(const struct timeval*, const struct timezone*)  | all        |
| int   acct(const char*  filepath)                                  | all        |
| int   klogctl:syslog(int, char*, int)                              | all        |
| int   capset(cap_user_header_t header, const cap_user_data_t data) | all        |
| int   chroot(const char*)                                          | all        |
+--------------------------------------------------------------------+------------+

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

+--------------------------------------------------------------------------------+------------+
|                                    Function                                    | Blocked On |
+--------------------------------------------------------------------------------+------------+
| int   init_module(void*, unsigned long, const char*)                           | all        |
| int   delete_module(const char*, unsigned int)                                 | all        |
| int   mount(const char*, const char*, const char*, unsigned long, const void*) | all        |
| int   umount2(const char*, int)                                                | all        |
| int   swapon(const char*, int)                                                 | all        |
| int   swapoff(const char*)                                                     | all        |
| int   setdomainname(const char*, size_t)                                       | all        |
| int   sethostname(const char*, size_t)                                         | all        |
| int   __reboot:reboot(int, int, int, void*)                                    | all        |
+--------------------------------------------------------------------------------+------------+