Android Seccomp深度解析:沙箱防护全流程

本篇文章剖析 Android 系统中 Seccomp(Secure Computing Mode) 策略的完整实现方案。
Android 自 8.0 (Oreo) 开始全面引入 Seccomp-BPF 机制,核心目的是为了最小化内核攻击面。即便应用层(App)或系统服务遭到了远程代码执行(RCE)攻击,由于 Seccomp 限制了其可以调用的系统调用(Syscalls),攻击者也无法利用未授权的内核漏洞完成提权。
Android 的 Seccomp 实现横跨了 编译期策略生成Zygote 进程动态注入原生守护进程的沙箱化 以及 内核层级过滤 4 个核心阶段。

一、 Android Seccomp 整体架构流向

我们可以通过以下流程了解 Seccomp 是如何从普通的文本配置,变成内核中的过滤网的。

二、 核心实现步骤详解

1. 编译期:策略文件的定义与 BPF 字节码生成

Android 并不会在运行时去解析可读的文本策略,而是在系统编译阶段(Build time)将策略直接编译为 BPF(Berkeley Packet Filter)字节码,以确保运行时的绝对高效。
  • 策略源文件位置:位于 bionic/libc/ 目录下。
    • SYSCALLS.TXT:定义了 Bionic C 库支持的所有系统调用。
    • SECCOMP_BLACKLIST_APP.TXT:应用进程的系统调用黑名单(如阻止 swaponswapoffchroot 等高危调用)。
    • SECCOMP_WHITELIST.TXT:系统允许的白名单。
  • 编译转换脚本:AOSP 提供了 Python 脚本(如 genseccomp.py),其核心逻辑为:
最终白名单=
SYSCALLS.TXT - SECCOMP_BLACKLIST_APP.TXT + SECCOMP_WHITELIST.TXT
  • 生成产物:脚本会为不同的 CPU 架构(ARM, ARM64, x86, x86_64)生成对应的 C++ 字节码数组文件(例如 arm64_app_policy.cpp),内部包含密密麻麻的 sock_filter 结构体数组。例如:C++
// 伪代码示例:生成后的 BPF 过滤规则 
static const struct sock_filter arm64_app_filter[] = { 
    BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 
    offsetof(struct seccomp_data, nr)), // 加载系统调用号 
    BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, __NR_swapon, 0, 1), // 如果是 swapon 
    BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_TRAP), // 触发异常拦截 ... 
    BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), // 默认允许 
};

2. 运行时:Zygote 进程分支时的动态应用(App 沙箱化)

Android 所有的应用程序进程都是由 Zygote 进程 fork 出来的。由于 Seccomp 策略一旦设定就只能增加不能减少(单向不可逆),因此 Zygote 自身不能过早启用严格的 App 策略,必须在 fork 之后、执行应用代码之前进行精确注入。
这一核心逻辑位于 frameworks/base/core/jni/com_android_internal_os_Zygote.cpp 中。
核心代码追踪:
在 Zygote fork 应用进程的必经之路 ForkAndSpecializeCommon 函数中,有如下调用:C++
// 位于 com_android_internal_os_Zygote.cpp
static void SetUpSeccompFilter(uid_t uid, bool is_child_zygote) {
    // 1. 检查当前是否开启了安全强制模式(如 userdebug 模式下执行了 setenforce 0 可能会关闭)
    if (!gIsSecurityEnforced) {
        ALOGI("seccomp disabled by setenforce 0");
        return;
    }

    // 2. 根据 UID 的不同,应用不同的 Seccomp 策略
    if (uid >= AID_APP_START) {
        if (is_child_zygote) {
            // 如果是 WebViewZygote 或 AppZygote 衍生出的子 Zygote
            set_app_zygote_seccomp_filter(); 
        } else {
            // 普通的 Android 应用程序进程
            set_app_seccomp_filter(); 
        }
    } else {
        // 系统核心服务进程(如 system_server)
        set_system_seccomp_filter(); 
    }
}
关键设计考量
这一步调用的时机极其严格。它必须在 fork() 产生子进程之后执行,且必须在子进程放弃 CAP_SYS_ADMIN 特权(Dropping capabilities)之前或设置 PR_SET_NO_NEW_PRIVS 之后执行。
在 Android 中,由于设置 PR_SET_NO_NEW_PRIVS 会破坏 SELinux 的域转换(Domain Transition),因此 Android 选择在 Zygote 还拥有特权时直接调用 prctl 加载策略,紧接着再放弃特权。

3. 底层调用:Bionic 库与内核的交互

上面提到的 set_app_seccomp_filter() 会向下调用到 Bionic 库中的 bionic/libc/seccomp/seccomp_policy.cpp
在该文件中,Android 通过调用 Linux 内核提供的 prctl 系统调用,将编译好的 BPF 数组传递给内核:C++
#include <linux/filter.h>
#include <sys/prctl.h>

// Bionic 内部加载 BPF 策略的实现
static bool install_filter(const struct sock_filter* filter, size_t filter_size) {
    struct sock_fprog prog = {
        .len = static_cast<unsigned short>(filter_size),
        .filter = const_cast<sock_filter*>(filter),
    };

    // 调用 Linux 内核机制,注入 BPF 过滤器
    // SECCOMP_MODE_FILTER 表示使用用户自定义的 BPF 规则过滤
    if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) < 0) {
        PLOG(FATAL) << "Could not set seccomp filter";
        return false;
    }
    return true;
}

4. 原生守护进程(Native Daemons)的 Seccomp 实现

除了应用进程,Android 的媒体服务(如 mediacodecmediaextractor)也是黑客攻击的重灾区。针对这类原生 C/C++ 进程,Android 采用了另外两种方式实现 Seccomp 隔离:
方案 A:通过 init.rc 配置文件(Android 10+ 推荐)
在服务的初始化配置文件(.rc 文件)中,直接通过 seccomp 关键字指定策略文件:代码段
service mediaextractor /system/bin/mediaextractor
    class main
    user mediaex
    group drmrpc mediadrm net_bt_admin
    # 指定该服务启动时加载的 seccomp 策略文件
    seccomp /system/etc/seccomp_policy/mediaextractor.policy

init 进程在解析到该行时,会在 fork 出服务进程后,主动读取该 .policy 文本文件,并利用 libseccomp 动态编译成 BPF 注入该服务。
方案 B:使用 Minijail 开源工具
在较老的版本或特定厂商实现中,系统服务常通过 Google 的 libminijail 库来动态加载:C++
// 守护进程内部代码示例
mini_jail* jail = minijail_new();
minijail_parse_seccomp_filters(jail, "/vendor/etc/seccomp_policy/mediacodec.policy");
minijail_enter(jail); // 此后该进程便进入了 Seccomp 沙箱

三、 攻击缓解效果

当黑客通过利用如漏洞(比如内存越界)控制了某个 App 进程或 mediacodec 进程,并企图执行 Shellcode 提权时:
  1. 触发拦截:当 Shellcode 尝试调用诸如 sys_reboot()swapon() 或高危的 ptrace()(在旧内核中可能导致逃逸)时。
  2. 内核处置:Linux 内核在执行该系统调用前,会先跑一遍该进程附带的 BPF 过滤代码,匹配到禁止调用。
  3. 发送信号:内核会直接向该进程发送 SIGSYS 信号(部分配置下为 SIGKILL)。
  4. 进程崩溃:进程瞬间被强行终止,并在 Logcat 中留下类似 Bad system call 的崩溃日志。
通过这种纵深防御的体系,Android 成功将“单点内核漏洞直接沦陷整机”的风险,降低为了“仅导致当前服务崩溃/闪退”,极大地提升了内核的安全性。

四、MediaTek (MTK) 的策略

如果你是因为遇到了 SIGSYS 崩溃(Seccomp 拒绝了某个系统调用),或者需要为 MTK 的自定义 HAL 进程(如音频、相机、编解码)添加系统调用白名单,MTK 平台有一套独立的、基于纯文本的配置方案,根本不需要通过 Python 脚本去生成目标代码。
MTK 自身的硬件服务和厂商定制进程的 Seccomp 策略,使用的是纯文本的 .policy 文件。你可以去以下几个地方排查:

1.源码中的策略文件路径(针对修改编译)

在你的 MTK 源码树中,检查以下目录(不同 OEM 可能会有微调):
vendor/mediatek/proprietary/hardware/seccomp/
device/mediatek/mt8766/seccomp/(或者类似的平台设备目录)
这些目录下会有类似 mediacodec-seccomp.policy 或者是针对特定厂商进程(如 android.hardware.media.c2@...-mediatek-seccomp-policy)的文本文件。

2.编译出厂后的生成路径(针对快速验证)

这些文本策略最终会被打包复制到设备的 /vendor 分区。如果你手里有编译好的镜像或者处于 Root 状态的板子,可以直接去这里查看:
/vendor/etc/seccomp_policy/
在这个目录下,你会看到一大堆以 .policy 结尾的文件,里面直接用纯文本列出了允许该进程调用的系统调用列表(例如 ioctl: 1、prctl: 1)。如果发生了 SIGSYS 闪退,直接在对应的 .policy 文件末尾追加缺失的系统调用,然后重新编译 vendor 分区即可。

五、 Seccomp 安全策略核心文件

这一组 .TXT 文件是 Android 用来构建进程沙箱的基石。编译系统会读取它们,并最终合并生成内核的 BPF 过滤规则。
  • SYSCALLS.TXT
    • 作用系统调用总表。它记录了当前 Android 版本(如 Android 14)所支持的、各架构(ARM64, x86等)最原始的系统调用映射关系。Bionic 库会根据它来生成 C 语言函数(如 open())对应的汇编底层实现。
  • SECCOMP_ALLOWLIST_APP.TXT
    • 作用普通应用程序(App)的系统调用白名单。所有从 Google Play 或第三方安装的普通 App,被 Fork 出来后都会应用这个文件里的规则。只有在这个列表里的系统调用,App 才有权调用。
  • SECCOMP_ALLOWLIST_SYSTEM.TXT
    • 作用核心系统服务的系统调用白名单。像 system_server、高级守护进程等,它们需要的权限比普通 App 大得多(例如需要特定的网络或进程控制权限),所以它们的白名单范围会比 APP 的更宽。
  • SECCOMP_ALLOWLIST_COMMON.TXT
    • 作用公共白名单。App 和系统服务都需要用到的最基础的系统调用(如 read, write, futex, mmap 等),为了避免重复编写,全部抽离在这个公共文件里。
  • SECCOMP_BLOCKLIST_APP.TXT / COMMON.TXT
    • 作用显式黑名单。明确禁止应用或所有进程调用的高危系统调用(例如 swapon/swapoff 交换分区控制、reboot 重启系统等)。即使底层 C 库里有这些函数,一旦调用,内核也会直接用 Seccomp 杀掉进程。
  • SECCOMP_PRIORITY.TXT
    • 作用性能优化优先级表(核心安全细节)。
    • 原理:内核在执行 Seccomp 过滤时,需要像执行代码一样逐行匹配 BPF 指令。如果把高频使用的系统调用放前面,性能就会极高。这个文件指定了哪些系统调用(如 read, write, epoll_wait)是“高频”的,编译工具会根据它把这些调用排在 BPF 判断树的顶端,以防沙箱机制拖慢整机性能。
软件概述 UG(Unigraphics NX)是一款由西门子(Siemens PLM Software)开发的交互式CAD/CAM/CAE系统。作为全球领先的产品工程解决方案,它集成了产品设计、工程仿真与制造加工于一体。其功能强大且应用广泛,能够轻松实现各种复杂实体和造型的构造,为模具、汽车、航空航天及通用机械等行业提供了高性能的机械设计与制图灵活性。 软件基础信息 • 支持系统: 64位 Windows 10、Windows 11 核心功能模块 一、创新设计:高效、灵活、无缝协同 全链路产品设计 涵盖从2D布局、3D建模、装配设计到图纸文档记录的各个环节,大幅提升设计吞吐量,缩短交付周期超35%。 强大的同步建模技术 打破数据壁垒,可无缝导入并直接修改来自其他CAD系统的几何模型,是跨平台协同设计的理想选择。 复杂装配管理 专为大型复杂产品打造,即使面对成千上万的零件也能从容应对,快速识别并解决数字样机中的干涉等问题。 集成设计验证 内置自动验证功能,实时监控设计是否符合公司及行业标准;结合PLM数据可视化合成,辅助工程师做出更明智的决策。 二、综合仿真(Simcenter 3D):精准预测,降低试错成本 极速前后处理 依托先进的几何引擎,将强大的分析命令与几何编辑紧密集成,相比传统有限元工具,可缩短高达70%的仿真建模时间。 全方位结构分析 在同一环境中集成线性静力学、动态、疲劳及非线性分析,底层由业界顶尖的NX Nastran解算器提供支持,确保计算的高精度与可靠性。 声学与热管理分析 提供内外声学仿真以优化音质、降低噪音;具备一流的热传导仿真能力,帮助电子产品和工业机械实现最佳热管理方案。 多物理场耦合 简化了结构动力学、热传导、流体流动等复杂物理现象的模拟过程,消除外部数据传输错误,真实还原产品运行工况。 三、智能制造(CAM):打通从计划到车间的数字主线 全面的制造解决方案 提供从工装设计、CAM编程到机床控制器(如Sinumerik)的一体化支持,助力制定更科学的生产决策。 深度集成的PLM环境 借助Teamcenter实现数据和流程的统一管理,避免多数据库冲突,支持重用验证过的加工工艺与刀具库。 车间级互联 通过DNC系统与车间无缝对接,直接将加工数据和刀具清单下发至CNC机床,实现计划与生产的紧密结合。 提质增效 优化NC编程与刀具路径,提升表面精加工水平与零件精度;减少人为错误,显著提高新机床部署成功率及制造资源利用率。 总结 UG NX 2023作为一款集成化的产品工程解决方案,通过其强大的设计、仿真和制造功能,为现代制造业提供了完整的数字化产品开发平台。无论是复杂产品的设计验证,还是精密制造的流程优化,UG NX 2023都能为工程师团队提供高效、可靠的解决方案,助力企业提升产品创新能力和市场竞争力。 适用领域 模具设计、汽车制造、航空航天、通用机械、消费电子等
软件概述 UG(Unigraphics NX)是一款由西门子(Siemens PLM Software)开发的交互式CAD/CAM/CAE系统。作为全球领先的产品工程解决方案,它集成了产品设计、工程仿真与制造加工于一体。其功能强大且应用广泛,能够轻松实现各种复杂实体和造型的构造,为模具、汽车、航空航天及通用机械等行业提供了高性能的机械设计与制图灵活性。 软件基础信息 • 支持系统: 64位 Windows 10、Windows 11 核心功能模块 一、创新设计:高效、灵活、无缝协同 全链路产品设计 涵盖从2D布局、3D建模、装配设计到图纸文档记录的各个环节,大幅提升设计吞吐量,缩短交付周期超35%。 强大的同步建模技术 打破数据壁垒,可无缝导入并直接修改来自其他CAD系统的几何模型,是跨平台协同设计的理想选择。 复杂装配管理 专为大型复杂产品打造,即使面对成千上万的零件也能从容应对,快速识别并解决数字样机中的干涉等问题。 集成设计验证 内置自动验证功能,实时监控设计是否符合公司及行业标准;结合PLM数据可视化合成,辅助工程师做出更明智的决策。 二、综合仿真(Simcenter 3D):精准预测,降低试错成本 极速前后处理 依托先进的几何引擎,将强大的分析命令与几何编辑紧密集成,相比传统有限元工具,可缩短高达70%的仿真建模时间。 全方位结构分析 在同一环境中集成线性静力学、动态、疲劳及非线性分析,底层由业界顶尖的NX Nastran解算器提供支持,确保计算的高精度与可靠性。 声学与热管理分析 提供内外声学仿真以优化音质、降低噪音;具备一流的热传导仿真能力,帮助电子产品和工业机械实现最佳热管理方案。 多物理场耦合 简化了结构动力学、热传导、流体流动等复杂物理现象的模拟过程,消除外部数据传输错误,真实还原产品运行工况。 三、智能制造(CAM):打通从计划到车间的数字主线 全面的制造解决方案 提供从工装设计、CAM编程到机床控制器(如Sinumerik)的一体化支持,助力制定更科学的生产决策。 深度集成的PLM环境 借助Teamcenter实现数据和流程的统一管理,避免多数据库冲突,支持重用验证过的加工工艺与刀具库。 车间级互联 通过DNC系统与车间无缝对接,直接将加工数据和刀具清单下发至CNC机床,实现计划与生产的紧密结合。 提质增效 优化NC编程与刀具路径,提升表面精加工水平与零件精度;减少人为错误,显著提高新机床部署成功率及制造资源利用率。 总结 UG NX 2023作为一款集成化的产品工程解决方案,通过其强大的设计、仿真和制造功能,为现代制造业提供了完整的数字化产品开发平台。无论是复杂产品的设计验证,还是精密制造的流程优化,UG NX 2023都能为工程师团队提供高效、可靠的解决方案,助力企业提升产品创新能力和市场竞争力。 适用领域 模具设计、汽车制造、航空航天、通用机械、消费电子等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值