文章

IOS 端安全点及案例梳理

Keychain 与安全存储机制

概述

Keychain 是苹果为 iOS/macOS 提供的一个系统级安全存储服务,用于保存敏感数据,比如账号密码、私钥、证书等。它由苹果的安全框架实现,确保数据在本地或 iCloud 环境下均有强加密保护,只有被授权的应用才能访问。


架构与原理

  • 存储位置:数据加密后保存在设备本地(iOS设备SSD),必要时同步至iCloud Keychain。

  • 加密方式:使用设备硬件支持的 AES-256 加密,密钥与设备硬件绑定(Secure Enclave)。只有解锁的主用户方可解密访问。

  • 沙盒机制:每个 App 默认只能访问自己在 Keychain 里存储的数据(通过 Access Group 可以设置多个App共享)。

  • Keychain Items:每条数据称为一个Item,Item包含属性(比如service、account、access group等)和加密后的敏感数据(Data)。


主要用途

  • 自动填充账号密码(如Safari、应用登录)

  • 存储API令牌、证书、公私钥等

  • 双因素认证凭据、用户票据

  • 实现SSO(单点登录)


安全机制

  • 加密算法:硬件加速加密,密钥仅存于Secure Enclave处理器,防止物理窃取。

  • 访问控制:可指定访问策略,如需生物识别、设备解锁、PIN码等二次验证。

  • 数据保护等级:支持多种保护方式(kSecAttrAccessible),如:

  • WhenUnlocked:设备解锁时可访问(常用)

  • AfterFirstUnlock:首次解锁后一直可访问

  • Always:始终可访问

  • WhenPasscodeSetThisDeviceOnly:仅设备加密且有密码时可用

  • iCloud Keychain:云同步时加密和端对端保护

  • 群组访问:可通过Access Group设置App间Keychain共享,常见于公司自家应用间账户打通。

Secure Enclave 的硬件保护

概述

Secure Enclave(安全隔区) 是苹果 SoC(如iPhone、iPad、Mac的A、M系列芯片)内置的独立协处理器,它专为管理敏感信息(如加密密钥、指纹/FaceID数据等)设计,与主处理器(CPU)隔离,从而构建更高级别的安全保障。


架构与原理

  • 硬件隔离:Secure Enclave 是芯片上的一个独立处理区块,拥有自带的CPU、内存空间,并运行自己专有的微型操作系统(SEPOS)。它只通过非常受限的通道与主SoC通信。

  • 数据隔离:主操作系统、应用、甚至内核都无法直接读取/修改/获取Secure Enclave内部的数据。

  • 启动流程:每次设备冷启动时,Secure Enclave会独立启动,并通过硬件级链式信任机制(Boot ROM、固件签名)保证自身不能被篡改。

  • 专属随机数引擎:内含高质量随机数发生器,用于生成不可预测的密钥。


主要用途

  • 生物认证保护:处理并加密 Touch ID、Face ID 的原始数据。外部永远只能拿到“是否通过”的二进制判断,没有生物特征数据本身。

  • 加密密钥管理:所有关键性的用户私钥(比如 iOS Keychain 的主密钥、Apple Pay、iCloud钥匙串主密钥等)都只存于 Secure Enclave 内。

  • 加密与解密:实际应用加密解密时,用户数据经主处理器,委托 Secure Enclave 以密钥加密/解密,但密钥本体绝不会暴露给外部。

  • 安全计时与认证(nonce/counter):防止物理攻击中的重放攻击、timing攻击等,支持设备级的安全验证(如 Encrypted Keybag 解锁等)。


安全机制

  • 密钥永不出户:重要密钥仅在Secure Enclave内部使用,绝不会导出。

  • 暴力破解防护:具备硬件防暴力破解计数功能,如解锁PIN输入错误达到次数阈值自动延迟甚至擦除数据。

  • 端到端加密:多设备间同步如iCloud Keychain是端到端加密,密钥仅在本地加解密。

  • 固件安全性:固件必须由苹果签名,无法随意更新或植入恶意固件。

  • 抗物理攻击:针对冷启动、存储残留、侧信道等物理渗透有专门防护。

证书锁定与 App Transport Security (ATS)

为了进一步提高传输安全性,开发者应:

  • 强制启用 ATS:苹果推荐并要求所有 iOS 应用启用 App Transport Security,通过强制 HTTPS 连接作为安全基线。

  • 实施证书锁定:证书锁定(Certificate Pinning)技术能够确保应用仅信任特定的服务器证书和公钥,即使攻击者获取了其他有效证书,也无法绕过安全防护。

采用 ATS 和证书锁定策略能够显著降低中间人攻击风险。例如,实现 ATS 后,应用只允许与经过严格认证的服务器进行通信,从而有效防止伪造证书和不安全传输(Guide to iOS App Security Best Practices)。

表 1:通信加密技术与安全措施比较

安全措施

主要功能

风险缓解效果

主要风险源

HTTPS/TLS

数据传输加密、保证数据完整性

中间人攻击

明文数据传输

ATS

强制安全连接,统一协议要求

非法通信、降级攻击

不符合安全要求的网络环境

证书锁定

限定可信服务器证书,防伪造

中间人攻击、伪造证书风险

证书管理不当

表 1:不同通信加密技术及其安全效果对比说明,每项措施均可显著降低相应风险。

数字签名及权限控制

在区块链应用中,数字签名不仅用于验证交易信息的完整性和来源,同时也是权限控制的重要手段。数字签名技术与权限管理机制共同构成了 DApp 安全认证的重要基础。

原理及验证流程

数字签名类似于传统意义上的手写签名,但其安全性远高于传统方式。其基本流程如下:

  1. 消息拼接与哈希运算:将需要签名的消息经过特定的哈希算法(例如 SHA-256)生成消息摘要。

  2. 私钥签名:使用用户的私钥对消息摘要进行加密,生成数字签名。在此过程中,私钥始终存储于安全区域(例如 Secure Enclave)中,确保其不被暴露.

  3. 签名验证:接收者收到原始消息和数字签名后,先重新计算消息摘要,再利用签名中包含的公钥(或通过 ecrecover 方法恢复签名者地址)对比消息摘要,从而验证签名的合法性5

数字签名验证流程图
下图展示了一个典型的数字签名验证流程,帮助理解签名如何确保数据的完整性与发送者身份的真实性:

权限控制与最小权限原则

在 DApp 应用中,权限控制方案必须遵循“最小权限原则”,即每个用户或模块仅获取其完成任务所必需的最低权限:

  • 权限划分:对用户权限进行合理分级,如管理员权限、普通用户权限、访客权限等,确保每个用户只能操作其拥有权限的资源。

  • 密钥与令牌管理:对 API 密钥、私钥和其他敏感令牌采取分级存储,并进行动态更新与检测,避免长期有效的密钥被滥用。

  • 安全审计与监控:结合日志记录和实时监控,对异常权限变更或异常访问行为及时报警,迅速响应潜在威胁。

在实际案例中,CertiK 安全工程师曾指出,攻击者通过窃取或复制未受严格权限控制的密钥(如 API 密钥或私钥),得以操纵合约状态和资产流向,造成重大的资金损失。

常见漏洞

逆向工程风险与代码保护

由于 iOS 应用通常以二进制形式分发,恶意攻击者可以利用逆向工程技术获取应用内部逻辑和敏感信息:

  • 代码混淆:采取代码混淆、加固和防调试等措施,可以大幅度增加逆向工程的难度,从而保护应用逻辑和密钥不被滥用。

  • 反调试机制:实现内置的反调试检测,防止攻击者在调试环境中获取应用运行时数据。

开发者应采用行业领先的代码保护工具,定期更新和检查应用二进制文件,防止静态分析导致敏感数据泄露或漏洞被利用。

输入验证不足及注入风险

输入验证一直是移动安全的一个薄弱环节,未经过滤或不严格验证的用户输入可能会导致注入风险或跨站脚本攻击:

  • 严格数据校验:所有从用户端提交的内容必须进行严格的数据格式验证,防止 SQL 注入、代码注入及脚本攻击5.

  • 白名单机制:对所有输入实施白名单策略,只允许符合预期格式的数据流入后端逻辑或智能合约中。

在实际案例中,有报告指出部分 DApp 因为输入验证不足导致 XSS 攻击,从而使恶意代码在用户客户端执行,进而窃取用户敏感数据或操作权限.

设计规则漏洞导致的风险

除了纯技术漏洞之外,设计规则上的缺陷也可能被攻击者利用,从而突破安全防护:

  • 逻辑漏洞:例如奖励机制设计不合理、重复调用接口未加限制等规则漏洞,均可能使系统在高负载或特定攻击下直接崩溃,甚至导致资金全部损失.

  • 测试与模拟:开发阶段应进行充分的逻辑测试,包括漏洞模拟和压力测试,以提前发现并修复潜在规则设计问题。

一个典型案例中,由于 DApp 项目在首次推荐奖励机制的规则设计上未考虑多次调用可能带来的累积风险,最终被黑客利用大量子合约反复调用,导致项目资金迅速耗尽.

不安全的 WebView 使用

许多 dApp 会内嵌 WebView 来展示活动页面、帮助文档或第三方 dApp。WebView 的安全配置至关重要。

  • 错误做法:

  • 未限制 JavaScript 的执行权限 (setJavaScriptEnabled(true)),且未对加载的 URL 进行严格白名单校验。

  • 通过 JavaScript Interface 向 WebView 注入了过多本地原生对象,导致敏感功能(如获取私钥、发起交易)暴露给 Web 页面。

  • 安全建议:

  • 严格校验 URL: 只加载白名单内的 URL,避免加载不受信任的第三方网页。

  • 最小权限原则: 限制 JavaScript 权限,谨慎使用 addJavascriptInterface。交互应通过安全的、定义明确的协议(如 URL Scheme 拦截并解析)进行,且必须对每一次敏感操作请求进行用户授权。

  • 举例说明:

一个 dApp 的“发现”页面使用 WebView 加载了一个第三方 dApp 聚合平台。该 WebView 暴露了一个可以发起转账的原生接口给 JavaScript 调用。攻击者在该聚合平台上发布一个看似无害的 dApp 页面,页面内的恶意 JavaScript 脚本在用户不知情的情况下,调用了暴露的原生接口,构造并请求用户签名一笔将资产转移到攻击者地址的交易。

与 DApp 或后台交互过程中的漏洞

iOS 端 DApp 并非孤立存在,其安全性不仅取决于客户端自身,还与后端 API、智能合约及 Web2 组件有直接关系。不同层次之间的交互可能引入新的漏洞。

客户端与后端 API 交互安全

  • 安全通信:所有与后端服务器的数据交互必须使用 HTTPS 协议,并加装证书锁定措施,防止攻击者通过中间人手段拦截数据。

  • 请求验证:在服务器端对所有请求进行严格验证,并通过 API 令牌、签名等方式确保请求的合法性。

  • 数据完整性:在传输过程中对敏感数据进行加密处理,防止数据在传输过程中被篡改或拦截.

如同本文前述,在 Web3 应用中,即便智能合约经过审计,若后端 API 存在安全漏洞,同样会导致资金资产被不法分子控制。例如,某些 Web2 后端组件曾因配置错误而导致 DApp 用户数据泄露,进而引起攻击者利用接口进行非法操作.

跨站脚本 (XSS) 与子域劫持

  • 防范 XSS:前端页面必须对所有动态加载的脚本内容进行严格过滤,防止恶意脚本注入。使用现代前端框架时,应利用其内置的 XSS 防护机制。

  • 子域安全:对于多个子域的统一管理,要确保所有子域都经过统一的安全配置,防止因某个子域未被保护而引起子域劫持问题4.

在 DEF CON 32 的相关演讲中,安全专家详细讨论了子域接管和 DNS 劫持的案例,强调了正确配置前后端和子域的重要性,以避免因信任链条中的薄弱环节而导致整个系统安全性受损.

供应链攻击与第三方组件风险

在开发过程中,使用第三方库和依赖组件可以大幅提高开发效率,但同时也带来了供应链攻击的风险:

  • 定期审计:对所有第三方依赖和外部组件进行持续的安全审计,确保没有引入已知漏洞。

  • 动态更新:利用自动化工具(如 SonarCloud、Dependabot 等)扫描依赖库的安全性,并及时修补被发现的漏洞17.

  • 多层防护:即使第三方组件存在潜在安全风险,可以通过额外的输入验证和出错处理来防止风险扩大化。

事实上,在某些 DApp 安全审计案例中,第三方组件中的漏洞成为攻击者发起供应链攻击的重要入口,对整个应用构成严重威胁。因此,供应链安全监控与管理已成为开发与安全审计过程中不能忽视的重要环节.

汇总

最佳实践

细节

使用 iOS Keychain 存储敏感数据

存储私钥等,使用硬件级加密,确保设备锁定时数据不可访问。

强制执行 ATS 和 SSL Pinning

确保 HTTPS 通信,防止中间人攻击,绑定服务器公钥。

移除调试代码

生产环境移除日志,防止暴露敏感信息。

验证第三方库

定期更新,审计库的安全性,避免已知漏洞。

动态和静态分析

使用工具检测运行时和代码层漏洞。

安全会话管理

设置超时,安全存储令牌,防止会话劫持。

输入验证

验证所有输入,防止注入攻击,如地址格式检查。

通知安全

私有化通知,掩盖锁屏敏感信息。

防止调试器附着

实现反调试技术,保护代码免受逆向工程。

许可协议:  CC BY 4.0