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

为何macOS 14下Apple M1与M3的Arm PAC密钥管理存在差异?

macOS 14 Sonoma中M1与M3设备Arm PAC密钥管理差异的原因解析

在macOS 14.4.1(版本23E224)中,Apple M1(T8103)与M3(T8122)设备的Arm指针认证(PAC)密钥管理机制存在明显差异:M1设备上所有4个PAC主密钥会随新进程生成全新随机值,而M3设备仅IB、DB密钥随进程变化,IA、DA密钥在不同进程间保持一致。

PAC背景回顾

  • PAC包含4个主密钥:IA(指令类A)、IB(指令类B)、DA(数据类A)、DB(数据类B),其中"I"对应指令指针签名,"D"对应数据指针签名,A/B为两类不同用途的密钥组。
  • 在Arm64架构的macOS和Linux系统中,安全设计上要求每个新进程获取一套全新的随机PAC密钥,以此防止跨进程重用签名指针,M1设备完全符合这一标准行为。

测试环境与差异

两台设备均运行相同版本的macOS,但内核存在SoC针对性分支差异:

  • MacBook M1内核信息:
Darwin macm1 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:12:41 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T8103 arm64
  • iMac M3内核信息:
Darwin macm3 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:11:08 PDT 2024; root:xnu-10063.101.17~1/RELEASE_ARM64_T8122 arm64

测试程序与编译

用于验证PAC密钥进程独立性的测试代码:

#include <stdio.h>
#include <inttypes.h>

int main(int argc, char* argv[])
{
    uint64_t modifier = 2;
    uint64_t data_ia = 0x12345678;
    uint64_t data_ib = 0x12345678;
    uint64_t data_da = 0x12345678;
    uint64_t data_db = 0x12345678;

    printf("PACIA             PACIB             PACDA             PACDB\n");
    printf("%016" PRIX64 "  %016" PRIX64 "  %016" PRIX64 "  %016" PRIX64 "\n", data_ia, data_ib, data_da, data_db);

    asm volatile("pacia %[reg], %[mod]" : [reg] "+r" (data_ia) : [mod] "r" (modifier) : );
    asm volatile("pacib %[reg], %[mod]" : [reg] "+r" (data_ib) : [mod] "r" (modifier) : );
    asm volatile("pacda %[reg], %[mod]" : [reg] "+r" (data_da) : [mod] "r" (modifier) : );
    asm volatile("pacdb %[reg], %[mod]" : [reg] "+r" (data_db) : [mod] "r" (modifier) : );

    printf("%016" PRIX64 "  %016" PRIX64 "  %016" PRIX64 "  %016" PRIX64 "\n", data_ia, data_ib, data_da, data_db);

    asm volatile("autia %[reg], %[mod]" : [reg] "+r" (data_ia) : [mod] "r" (modifier) : );
    asm volatile("autib %[reg], %[mod]" : [reg] "+r" (data_ib) : [mod] "r" (modifier) : );
    asm volatile("autda %[reg], %[mod]" : [reg] "+r" (data_da) : [mod] "r" (modifier) : );
    asm volatile("autdb %[reg], %[mod]" : [reg] "+r" (data_db) : [mod] "r" (modifier) : );

    printf("%016" PRIX64 "  %016" PRIX64 "  %016" PRIX64 "  %016" PRIX64 "\n", data_ia, data_ib, data_da, data_db);
}

编译命令:

$ cc -arch arm64e pac.c -o pac

测试结果

  • MacBook M1:每次启动新进程,4个PAC密钥对应的签名结果均不同,证明所有密钥随进程重新生成。
  • iMac M3:仅IB、DB密钥对应的签名结果随进程变化,IA、DA密钥的签名结果在不同进程中完全一致,说明这两个密钥未随进程重新生成。

差异原因解析

这一差异是Apple针对M3系列(基于Armv9架构)的硬件特性,结合macOS内核的性能与安全平衡优化:

  1. 硬件架构升级:M3采用的Armv9架构相比M1的Armv8架构,对PAC密钥的安全隔离支持更完善。在保证安全边界的前提下,Apple可以复用A类密钥以降低进程创建时的密钥生成开销。
  2. 安全模型细分:A类密钥(IA、DA)主要用于用户空间常规指针签名,而B类密钥(IB、DB)多用于敏感场景(如内核交互、特殊权限代码)。M3上复用A类密钥并未破坏安全:
    • 进程地址空间隔离依然完整,即使A类密钥相同,不同进程的指针地址空间不重叠,跨进程重用签名指针无法通过认证。
    • B类密钥保持进程独有,确保敏感操作的安全性不受影响。
  3. 内核针对性适配:从内核分支差异(RELEASE_ARM64_T8103 vs RELEASE_ARM64_T8122)可以看出,Apple为不同SoC型号的内核做了定制调整,M3对应的内核分支优化了A类密钥的分配策略,减少进程初始化开销,提升系统整体性能。

内容的提问来源于stack exchange,提问作者Thierry Lelegard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:23:21