Android x64内联汇编触发SIGSYS错误的原因排查咨询
问题分析与解决
1. Seccomp确实会限制系统调用
Android应用运行在应用沙箱中,默认启用Seccomp过滤机制,仅允许调用预定义的合法系统调用列表。而独立可执行文件(如通过adb push到设备后直接运行的程序)不受应用沙箱的Seccomp规则约束,因此可以调用更多系统调用。当应用中调用了不在允许列表内的系统调用(或系统调用编号错误),就会触发SIGSYS错误。
2. 你的代码核心问题:系统调用编号错误
你使用的系统调用编号21是标准Linux x86_64架构下access的编号,但Android的系统调用编号与标准Linux不兼容。
在Android x86_64架构中,access的系统调用编号是33,而非21。错误的编号会被Seccomp判定为非法系统调用,直接触发SIGSYS。
修正后的代码示例
将系统调用编号改为Android x86_64对应的33:
char *filename = "/system/bin/sh"; int f_ok = F_OK; int ret_val; #ifdef __x86_64__ __asm__ volatile( "movq $33, %%rax\n\t" // 替换为Android x86_64的access编号 "movq %1, %%rdi\n\t" "movq %2, %%rsi\n\t" "syscall\n\t" "movq %%rax, %0" : "=m"(ret_val) : "m"(filename), "m"(f_ok) : "%rax", "%rdi", "%rsi", "cc", "memory" ); __android_log_print(ANDROID_LOG_VERBOSE, "inline_assembly", "ret_val %i", ret_val); #endif
3. 如何获取正确的Android系统调用编号
- 查看Android Bionic库的头文件
bionic/libc/include/sys/syscall.h,其中定义了各架构对应的系统调用编号。 - 优先调用libc封装的
access函数,避免手动编写内联汇编——libc会自动适配正确的系统调用编号和调用方式,可靠性更高。
4. 了解Android Seccomp的更多细节
- Android官方安全文档中关于沙箱与Seccomp的章节,会明确说明应用沙箱的系统调用限制规则。
- AOSP源码中的
system/seccomp/目录,包含不同Android版本的Seccomp策略配置文件,可直接查看允许的系统调用列表。 - Bionic库的官方文档,会详细说明Android系统调用与标准Linux的差异点。
内容的提问来源于stack exchange,提问作者localacct
相关产品推荐
相关产品推荐

