|
一、问题概述 aTrust 客户端(版本 2.5.10.32)在 macOS 27.0 (Tahoe) 系统上无法正常获取 Wi-Fi 网卡的真实 MAC 地址,导致设备识别失败、终端绑定功能不可用。该问题为 macOS 系统级变更引起,需要深信服侧进行适配。 二、环境信息项目 | 详情 | aTrust 版本 | 2.5.10.32 | macOS 版本 | 27.0 (Tahoe) | Build 号 | 26A428 | 硬件架构 | arm64 (Apple Silicon) | 设备型号 | MacBook Pro | 问题组件 | libaTrustEnvChecker.dylib |
三、问题现象1. aTrust 客户端无法正确采集设备 MAC 地址,日志中 mac_mark 字段为空数组 []。 2. 服务端收到的 MAC 地址为 02:00:00:00:00:00(系统掩码值),设备指纹异常。 3. 终端绑定功能提示"如需绑定此终端,请填写申请理由",无法正常完成注册。 四、根因分析4.1 macOS 27 内核级 MAC 地址掩码机制macOS 27 (Tahoe) 引入了内核级别的 MAC 地址隐私保护机制。所有通过 sysctl(NET_RT_IFLIST) 获取的网络接口链路层地址均被替换为掩码值 02:00:00:00:00:00。该掩码对所有用户态进程生效,不受进程权限影响。 验证方式: 通过 C 程序调用 sysctl(NET_RT_IFLIST) 遍历所有网络接口,确认所有接口的 MAC 地址均返回 02:00:00:00:00:00。 4.2 aTrust 的 MAC 地址读取路径经逆向分析 libaTrustEnvChecker.dylib,aTrust 的环境检查模块 (NetworkCardInfoProvider::getNetworkCardMacAddress())通过以下路径获取 MAC 地址: 1. 调用 sysctl(NET_RT_IFLIST) 枚举网络接口及其链路层地址; 2. 通过 filterMacAddr() 函数过滤虚拟网卡(检查 MAC 地址的 U/L 位,bit 1 = 1 判定为本地管理地址/虚拟地址); 3. 由于 02:00:00:00:00:00 的 U/L 位为 1(本地管理地址),被 filterMacAddr 判定为虚拟网卡并过滤; 4. 最终 netcard 数组为空,mac_mark 为空。 关键日志证据: // aTrustAgent_plugins_aTrustCore_h_e.3.log filterMacAddr: will report virtual netcard netcard array is empty Get netcard failed! Reason: network card info list empty // aTrustTray.20260915.log 服务端响应: "macAddress":"\n02:00:00:00:00:00\n" 4.3 CoreWLAN.framework 不受影响经验证,macOS 27 的 MAC 地址掩码仅影响 sysctl 系统调用路径。通过 CoreWLAN.framework 的 CWWiFiClient → CWInterface → hardwareAddress API 仍可正常读取 Wi-Fi 接口的真实 MAC 地址。 读取方式 | 返回值 | 是否可用 | sysctl(NET_RT_IFLIST) | 02:00:00:00:00:00 | 不可用(掩码值) | SCNetworkInterfaceGetHardwareAddressString() | 02:00:00:00:00:00 | 不可用(掩码值) | CoreWLAN: CWInterface.hardwareAddress | 10:9f:41:b8:88:e5 | 可用(真实 MAC) |
4.4 DYLD_INSERT_LIBRARIES 注入方案不可行macOS 27 对 dyld shared cache 中的系统函数实施了严格保护,DYLD_INSERT_LIBRARIES 环境变量无法拦截 sysctl、getifaddrs、SCNetworkInterfaceGetHardwareAddressString 等系统函数的调用。即使 aTrustAgent 具有 allow-dyld-environment-variables 和 disable-library-validation 权限,注入的动态库中的 hook 函数也不会被调用。因此无法通过用户侧注入方式修复此问题。 五、修复建议方案一(推荐):在 aTrustEnvChecker 中增加 CoreWLAN 读取路径在 libaTrustEnvChecker.dylib 的 MAC 地址采集逻辑中,增加对 CoreWLAN.framework 的调用作为备选方案。当 sysctl 返回的 MAC 为掩码值时,回退到 CoreWLAN 获取真实 MAC: #import <CoreWLAN/CoreWLAN.h> // 当 sysctl 返回的 MAC 为掩码值时,回退到 CoreWLAN 获取真实 MAC CWWiFiClient *wifiClient = [CWWiFiClient sharedWiFiClient]; CWInterface *wifiInterface = [wifiClient interface]; NSString *hardwareAddress = [wifiInterface hardwareAddress]; // hardwareAddress 即为真实 Wi-Fi MAC 地址 建议在 filterMacAddr 判定所有网卡均为虚拟网卡时,自动回退到 CoreWLAN 路径获取 Wi-Fi MAC。 方案二(临时):服务端放宽 MAC 地址校验在 aTrust 服务端策略中,针对 macOS 27 客户端临时放宽 MAC 地址绑定校验,允许使用其他设备指纹(如磁盘序列号、硬件 UUID 等)进行设备识别,待客户端版本修复后再恢复完整校验。 方案三(临时):建议用户降级 macOS建议受影响用户暂时保持 macOS 26 (Sequoia) 或更低版本,直到 aTrust 发布适配 macOS 27 的新版本。 六、补充说明1. 该问题仅影响 macOS 27 (Tahoe) 及以上版本,macOS 26 及更早版本不受影响。 2. SCNetworkInterfaceGetHardwareAddressString() 同样受掩码机制影响,返回值为掩码地址,不可作为替代方案。 3. aTrustAgent 为 x86_64 架构,在 Apple Silicon 上通过 Rosetta 2 翻译运行,建议后续提供原生 arm64 版本以获得更好的系统兼容性。 4. 日志中还发现路径创建失败的错误:create database directory failed: /usr/local/Cellar/.aTrust; Reason: error: 2, msg: No such file or directory,建议一并排查。 |