查看: 121|回复: 3

HarmonyOS 6.1.1 Seccomp过滤导致SIGSYS崩溃排查与Native库适配

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在HarmonyOS NEXT 6.1.1(API 24)上,引入了一套重要的内核级安全机制——Seccomp(Secure Computing Mode)。这套机制通过BPF(Berkeley Packet Filter)规则在内核对系统调用进行实时过滤,为应用进程构建了一道“零开销”的轻量级沙盒防线。然而,对于大量引入原生C/C++动态库(基于NDK开发)的鸿蒙应用,如果库中调用了被Seccomp策略拦截的系统调用,就会引发进程因SIGSYS信号而瞬间闪退,且上层ArkTS无任何异常捕获。本文将从实际问题出发,手把手拆解SIGSYS崩溃的定位方法,并给出Native库在多端设备下的适配红线。

一、SIGSYS崩溃的物理判定与faultlog排障三步法
当进程触发了Seccomp拦截的内核系统调用时,内核会立即向进程发送SIGSYS(Bad System Call)信号,导致进程直接死亡。开发者常遇到的场景是:引入FFmpeg、OpenSSL等第三方开源C/C++库后,应用一加载就闪退,且本地log无任何ArkTS错误。此时,应使用以下三步排障法:
1. 拉取faultlog崩溃日志:通过hdc工具连接设备,定位到/data/log/faultlog/faultlogger/目录,寻找以cppcrash-xxxx命名的文件。
2. 审查Reason字段:在日志头部找到Reason:字段,若出现Signal:SIGSYS(UNKNOWN),则90%概率触发了Seccomp拦截。
3. 审查栈顶库符号:观察Fault thread Info中的栈顶调用帧。如果#00 pc指向/system/lib/ld-musl-{架构}.so.1或动态链接器,且上游是应用Native动态库的入口(如libentry.so内的函数),则可100%确诊为Seccomp违规拦截。

示例日志诊断:
  1. Process name: com.wodekouwei.myapplication
  2. Reason: Signal:SIGSYS(UNKNOWN)
  3. Fault thread Info:
  4. Tid: 13893, Name: e.myapplication
  5. #00 pc 000a5d30 /system/lib/ld-musl-arm.so.1(sethostname+16)(584c9d0a0e9000497bb0d66799a9526a)
  6. #01 pc 00002f68 /data/storage/el1/bundle/libs/arm/libentry.so(test()+64)
复制代码
解析:进程com.wodekouwei.myapplication在调用libentry.so中test()函数时,间接调用了系统C库的sethostname系统调用。由于sethostname未在手机/平板等非PC设备的放通白名单中,被Seccomp拦截并投递SIGSYS。

二、关键系统调用限制:clone命名空间与设备独占符号
在6.1.1 (API 24)的Seccomp策略中,有两个关键设计直接影响Native开发者的适配工作:
1. clone系统调用的命名空间标志限制:clone是创建轻量级进程(线程)的核心调用。策略仅允许不包含以下容器/虚拟化级命名空间标志的clone调用:CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWNET、CLONE_NEWCGROUP、CLONE_NEWUTS、CLONE_NEWIPC、CLONE_NEWUSER。若包含此类标志,内核直接返回TRAP并发送SIGSYS。这是为了防止进程创建脱离系统沙盒管控的“幽灵进程”,避免容器逃逸和特权提升。
2. mbind与shmget仅PC设备放通:mbind(内存绑定NUMA节点)和shmget(System V共享内存)在手机、平板、折叠屏等移动端被彻底禁绝,仅在PC及2in1电脑上开放。原因在于移动端SoC通常采用UMA架构,mbind无性能收益且易导致内存碎片化;而shmget在应用冻结机制下难以回收,推荐使用ashmem或跨Ability通信管道替代。

三、Native库适配的三大生存法则
为了确保Native动态库在Seccomp刚性网络中平稳运行,架构师和Native研发团队应严守以下三条红线:
1. 静态扫描三方库隐式高敏调用:在引入开源Native库(尤其是网络、存储、加密类库)时,早期使用objdump或readelf提取系统调用导入表。若发现包含shmget等仅PC放通的符号,且需要在手机端运行,必须重构为ashmem匿名共享内存或标准IPC管道。否则真机直接触发SIGSYS崩溃,且无任何应用层异常栈可循。
2. 多端发布包的运行期硬件环境协商:对于手机/平板/PC跨端通用的Native引擎,在调用mbind前,应先通过sysconf或Syscap机制校验当前设备是否为PC。若处于手机或穿戴设备,应静默绕过NUMA绑定,走系统默认调度通道,避免引发内核TRAP。
3. 优雅捕获SIGSYS构建防闪退熔断机制:在Native引擎的初始化生命周期(如JNI_OnLoad或__attribute__((constructor)))中,通过sigaction显式注册SIGSYS的信号处理回调。在回调中提取siginfo_t中的系统调用编号与寄存器状态,将错误信息加密存盘,并触发应用层核心功能熔断(如优雅弹窗提示功能受限),而非让进程惨烈死亡,从而提升线上稳定性。

四、总结
Seccomp系统调用过滤机制为HarmonyOS NEXT提供了一道坚不可摧的内核级防线。通过隔离高危命名空间克隆、细粒度划分PC与移动设备的管控边界,以及提供faultlog+SIGSYS排障能力,开发者可以快速定位并适配Native库。牢记上述适配红线,您的鸿蒙应用将能在多端设备上安全稳定运行。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1.1 Seccomp过滤导致SIGSYS崩溃排查与Native库适配

感谢分享这么详细的排查方法和适配红线!faultlog三步法非常实用,之前遇到SIGSYS闪退总是一头雾水,现在至少能快速定位了。想请教一下,在“优雅捕获SIGSYS构建防闪退熔断机制”这一块,有没有推荐的信号处理回调代码示例?比如如何在回调中安全地提取系统调用编号并触发应用层弹窗,又不会引起信号处理函数本身的死锁问题?
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1.1 Seccomp过滤导致SIGSYS崩溃排查与Native库适配

非常实用的一篇技术分享!之前排查SIGSYS崩溃时没少走弯路,您提到的faultlog三步法和关键限制点(特别是clone命名空间标志和mbind/shmget的跨端差异)一下点醒了。想请教两个问题: 1. 对于调用栈里出现ld-musl的情况,是否有可能是因为链接器本身在执行某些初始化操作时触发了限制? 2. 优雅捕获SIGSYS时,信号的处理器里能否安全地做一些打印或日志写入?还是说信号处理本身就有栈限制容易再挂? 感谢!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: HarmonyOS 6.1.1 Seccomp过滤导致SIGSYS崩溃排查与Native库适配

感谢楼主的深度分享!之前遇到过类似场景,一直没想明白为什么某些第三方音视频库在麒麟芯片上直接闪退,faultlog里只看到SIGSYS,现在总算知道根因了。尤其是“sethostname”那个示例,正好和我们之前集成的某个直播推流SDK的加载崩溃吻合——看来是底层误用了系统调用。 想请教一下:对于已接入的老项目,如果无法修改原生库源码(比如只拿了so文件),有没有办法在应用层通过hdc或者配置白名单的方式临时规避?还是说必须联系库作者重新编译适配?另外,PC设备放通mbind和shmget的规则,是否有官方文档列出具体的API版本或设备清单?感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-23 10:14 , Processed in 0.033826 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部