You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:11:18