跳到正文
npaka · AI与游戏开发技术· 来源·· 3 小时前AI 评分15

iOS应用开发的安全对策:防止网络攻击与信息泄露的注意事项

iOSアプリ開発のセキュリティ対策 - サイバー攻撃と情報漏洩を防ぐための注意点

正文 · AI 翻译

总结了iOS应用开发的安全对策。

目次

  1. 1. 前言
  2. 2. iOS安全基础
  3. 3. 文件存储位置与访问权限
  4. 3-1. 主要存储位置
  5. 3-2. 文件的公开范围
  6. 4. iCloud的备份、同步与共享
  7. 4-1. iCloud的主要机制
  8. 4-2. CloudKit的访问控制
  9. 4-3. iCloud的加密
  10. 5. 机密信息的存储与加密

1. 前言

iOS 具备操作系统级别的安全功能,包括应用沙盒、代码签名和数据加密等。

然而,如果应用的实现存在问题,可能会导致个人信息或认证信息泄露,或者服务器遭受非法访问。此外,还需要注意 iCloud 中的数据共享、外部库以及开发环境的管理。

本次将从数据保存、通信、认证、信息共享和开发环境等角度,介绍为确保 iOS 应用安全开发与运营所采取的安全措施。

2. iOS 安全基础

iOS 提供了多种机制来保护应用和用户数据。

主要安全功能如下。

・沙盒:限制每个应用对文件和系统功能的访问
・代码签名:验证应用的签名,限制执行恶意代码
・数据保护(Data Protection):加密设备中的文件并控制访问条件
・钥匙串(Keychain):安全地保存密码和认证信息
・权限管理:控制对相机、照片、位置信息等资源的访问
・ATS(App Transport Security):要求使用安全的网络通信

通过这些机制,限制了其他应用对数据的非法访问等。

但是,并不能自动防止以下问题。

・解析应用中嵌入的API密钥
・非法访问服务器API
・因实现错误导致个人信息泄露
・通过外部库引发的信息泄露
・设备被入侵或应用被篡改

区分iOS的保护范围与开发者自身需要采取对策的范围非常重要。

3. 文件的保存位置与访问权限

iOS 应用的数据基本保存在每个应用的沙盒内。不过,根据保存位置的不同,其用途和备份处理方式也会有所差异。

3-1. 主要保存位置

・Documents/:由用户管理的文档和图片。通常属于备份对象
・Library/Application Support/:应用内部的数据库和设置。通常属于备份对象
・Library/Caches/:可重新生成的缓存。不属于备份对象
・tmp/:临时文件。不属于备份对象,且操作系统可能会删除
・Keychain:密码和认证令牌等机密信息

由用户管理的文档使用 Documents,应用内部的数据使用 Application Support。

3-2. 文件的公开范围

Documents 中的文件可以根据应用的设置,从“文件”应用等进行操作。

特に次の設定に注意します。

・UIFileSharingEnabled:Finderなどを通じたDocuments内のファイル共有を許可
・LSSupportsOpeningDocumentsInPlace:文書をコピーせず、その場所で開いて編集する機能への対応

機密性の高い内部データは、不用意に外部公開しないようにします。

また、ファイルにはData Protectionによるアクセス制御を設定できます。

try data.write(
    to: fileURL,
    options: [.atomic, .completeFileProtection]
)

.completeFileProtection を指定すると、端末がロックされている間は、原則としてファイルにアクセスできなくなります。

ただし、バックグラウンド処理が必要な場合は、適切な保護レベルを選択する必要があります。

4. iCloud的备份、同步与共享

在iCloud中,您可以备份应用数据,并在多个设备间进行同步和共享。

然而,备份、同步和共享是三种不同的功能。

4-1. iCloud的主要机制

・iCloud备份:将应用内的数据包含在设备的备份中
・iCloud云盘(iCloud Drive):在多个设备间同步用户的文件
・CloudKit:在iCloud中同步和共享应用数据
・iCloud钥匙串(iCloud Keychain):安全地同步相应的认证信息等

例如,即使保存在Documents中的文件被包含在iCloud备份中,这并不意味着它会自动成为iCloud云盘上的共享文件。

对于不需要备份的数据,通过选择存储位置或设置备份排除项来控制。

4-2. CloudKit 的访问控制

CloudKit 中有三种类型的数据库。

・私有数据库(Private Database):用户本人的数据
・公共数据库(Public Database):应用的用户可以共享的数据。原则上所有用户均可读取
・共享数据库(Shared Database):由其他用户共享的数据

特别是在公共数据库中,其他用户会根据设置的权限读取数据,因此请勿随意保存个人信息。

在实现共享功能时,也请确认查看/编辑权限以及取消共享时的行为。

4-3. iCloud 的加密

在 iCloud 中,数据会被加密,但并非所有数据始终采用端到端加密。

CloudKit 允许使用 encryptedValues 在终端上对特定字段进行加密,但在公共数据库中不可用。

此外,启用 iCloud 的“高级数据保护”后,对于 CloudKit 私有数据库和共享数据库中的加密字段,加密密钥的访问权限将仅限于数据所有者及其共享对象。

对于敏感数据,重要的是不要仅依赖 iCloud 的加密功能,还应考虑访问控制以及根据需要在应用层面实施自定义加密。

5. 机密信息的存储与加密

在应用内处理的信息,根据其机密性选择保存方式。

5-1. 通过 Keychain 进行保存

对于密码、访问令牌、私钥等敏感信息的保存,使用 Keychain。

・不要将秘密信息保存到 UserDefaults
・正确设置 Keychain 的访问条件
・如果不需要在设备间继承,可考虑使用 ThisDeviceOnly
・删除不再需要的认证信息

Keychain 的项目中,有可以在备份或设备迁移时继承的内容,也有仅限于特定设备的内容。

需要根据用途进行相应设置。

5-2. CryptoKit与Secure Enclave

iOS中,有用于加密处理的“CryptoKit”以及用于保护加密密钥的“Secure Enclave”。

・CryptoKit:实现加密、哈希、数字签名等功能
・Secure Enclave:在专用硬件区域中保护相应的私钥

Secure Enclave并非用于直接保存任意文件的通用存储。

数据加密使用CryptoKit,密钥管理则结合Keychain或Secure Enclave进行利用。

基本做法是不创建自定义的加密算法,而是使用标准的、安全的方式。

6. 网络通信与API保护

应用与服务器之间的通信需要防止窃听、篡改和凭证泄露。

6-1. HTTPS与ATS

iOS提供了“App Transport Security(ATS)”以要求安全的网络通信。

・API通信需使用HTTPS
・不要随意启用NSAllowsArbitraryLoads
・不要禁用TLS证书验证
・不要忽略证书错误
・即使在自定义网络处理中也应使用适当的TLS配置

然而,HTTPS是一种保护通信通道的机制,并不能直接防止对API的非法访问。

6-2. API密钥的管理

嵌入到应用中的API密钥和秘密信息有可能通过逆向工程被获取。

・不要将用于服务器的秘密API密钥嵌入到应用中
・即使隐藏在.plist文件或源代码中也无法保密
・需要密钥的API应通过后端调用
・对公开前提的API密钥也设置使用限制

应以应用中所包含的机密信息可能被攻击者获取这一前提进行设计。

6-3. 服务器端的对策

在服务器端,还需要采取以下措施。

・每个API的认证与授权
・速率限制与非法访问检测
・对数据库访问权限的限制
・针对SQL注入等输入攻击的对策
・根据需要采用App Attest

App Attest可辅助验证请求是否来自正规应用,但不能替代认证或访问控制。

7. 认证与访问控制

即使具备登录功能,若认证或访问权限验证存在问题,仍可能导致他人信息被获取。

7-1. 安全的认证方式

・考虑使用Passkey或Sign in with Apple
・在OAuth 2.0中为原生应用启用PKCE
・为访问令牌设置合适的有效期
・登出时对必要的令牌执行失效处理
・区分基于Face ID的设备内认证与服务端认证

Face ID 可用于设备端的身份验证,但这并不能保证服务器端的访问权限。

7-2. 服务器端的授权

例如,假设存在以下 API。

GET /api/users/123/profile

如果仅将用户 ID 更改为 124 就能获取他人的信息,则访问控制存在问题。

在 API 中,不仅需要验证认证状态,还需要在服务器端验证是否有权访问操作目标的数据。

仅在界面上隐藏按钮无法防止恶意操作。

8. 应用间信息共享与WebView

在iOS中,沙盒机制限制了应用之间的相互访问,但可以通过共享功能来传递数据。

8-1. 应用间信息共享

主要的共享功能包括以下内容:

・Share Sheet(分享表单):向其他应用共享数据
・AirDrop(隔空投送):向附近的设备传输文件
・App Groups(应用群组):通过共享容器,在同一开发团队的应用或扩展之间共享数据
・Universal Links(通用链接):实现网站与应用之间的联动
・自定义URL Scheme:通过URL启动应用并传递信息

若需将机密信息传递给外部,请确认共享对象及公开范围。

特别是自定义 URL 方案时,需考虑到其他应用可能截获处理或注入恶意输入,因此应避免随意包含认证令牌等敏感信息。

8-2. WebView 的安全性

在使用 WKWebView 显示 Web 内容时也需要注意。

・适当处理不可信的 HTML 和 JavaScript
・验证对外部 URL 的跳转
・限制可通过 JavaScript 调用的原生功能
・妥善管理 Cookie 和会话信息
・防止 Web 内容无条件执行重要的终端功能

特别是在将 JavaScript 与 Swift 进行联动时,需要设计成无法从不可信的网页执行机密操作。

9. 个人信息、日志和通知的处理

机密信息也可能从日志或画面中泄露。

9-1. 个人信息的访问权限

相机、麦克风、照片、通讯录、位置信息等,将在必要范围内访问。

・只请求必要的权限
・明确说明请求权限的理由
・照片尽可能只获取所选项
・位置信息根据需要仅在使用期间获得许可
・不再需要的个人信息不予保留

9-2. 日志中的信息泄露

避免使用如下代码。

print("Token: \(accessToken)")

重要的是,不要将密码、认证令牌、个人信息等输出到日志中。

此外,还要确认崩溃分析和访问分析的SDK是否发送了不应发送的信息。

9-3. 从屏幕和通知中的泄露

・不在锁屏通知中包含机密信息
・不在切换应用时显示的预览画面中残留机密信息
・不随意将秘密信息复制到剪贴板
・考虑通过屏幕共享或截图导致的暴露

在iOS中,由于会在转入后台时生成屏幕快照,因此需要根据情况实现隐藏机密信息的处理。

10. 外部库和开发环境的保护

在iOS应用开发中,外部库、GitHub、CI/CD以及AI开发工具等也可能成为攻击目标。

10-1. 外部库与SDK

・使用来自可信来源的库
・删除不必要的依赖库
・检查已知漏洞
・固定依赖版本并确认更新内容
・了解SDK收集并发送的数据

此外,根据所使用的API和SDK,需配置所需的隐私清单(PrivacyInfo.xcprivacy),并正确申报App Store的隐私信息。

10-2. Git与CI/CD

・不要在源代码中包含API密钥或私钥
・正确设置.gitignore
・为GitHub等账户启用多因素认证
・限制对CI/CD中秘密信息的访问
・妥善管理Apple签名证书和私钥
・审查外部构建脚本的执行内容

如果不慎提交了机密信息,不仅要将其从 Git 历史记录中删除,还要使相应的密钥或令牌失效并重新签发。

10-3. AI开发工具的安全性

使用 Codex 或 Claude Code 等 AI 代理时也需要注意。

・不要轻率地将私钥或认证令牌交给AI
・不要输入包含个人信息的真实数据
・确认源代码的外部发送范围
・限制文件操作和命令执行的权限
・验证AI生成的认证与加密代码

AI 生成的代码未必安全。尤其是在认证、加密、访问控制等关键处理环节,需要由人工进行审查。

11. 数据删除与应用运维

在个人信息保护中,不仅保存方式重要,删除方法也同样重要。

11-1. 数据删除

在注销、退会或卸载应用时,需确认以下数据的处理方式:

・Keychain中的认证信息
・应用内的文件和数据库
・缓存和临时文件
・iCloud上的同步数据
・保存在服务器上的个人信息
・与其他用户共享的数据

特别是,即使卸载了应用,Keychain中的信息仍可能残留,因此还需确认重新安装时的行为。

此外,在退会时,除了服务器和iCloud上的数据外,还需确认备份中数据的保留期限及删除方针。

11-2. 应用的持续运营

应用发布后,仍需应对漏洞。

・确认iOS和外部库的漏洞信息
・提供包含安全修复的更新
・监控非法API访问
・必要时限制旧版应用的使用
・准备事故发生时的应对措施

注意不要在监控日志中过度记录个人信息。

12. 安全测试与发布前检查

可使用OWASP发布的“MASVS”(移动应用安全验证标准)对移动应用进行安全评估。

MASVS是定义移动应用应满足的安全要求的标准,而非检查工具。

12-1. MASVS的8个领域

MASVS由以下8个领域构成:

・STORAGE:数据的安全存储
・CRYPTO:加密与密钥管理
・AUTH:认证与访问控制
・NETWORK:网络通信
・PLATFORM:操作系统与其他应用的集成
・CODE:代码安全性
・RESILIENCE:对分析和篡改的抵抗力
・PRIVACY:隐私保护

具体的验证方法总结在“MASTG”(Mobile Application Security Testing Guide)中。

MASVS定义了“需要确认什么”,MASTG说明了“如何确认”,并通过分析工具和手动测试进行验证,三者之间形成这种关系。

12-2. 基于AI代理的安全审查

委托Codex或Claude Code等AI代理,按照MASVS的安全要求进行审查也是一种有效的方法。

通过AI代理,可以跨领域调查Swift代码、配置文件、依赖库等,从而找出潜在问题。

例如,可以这样请求:

请根据OWASP MASVS的最新要求和MASTG的测试方法,对该iOS应用进行安全审查。

・针对MASVS的8个领域
・检查Swift代码、Info.plist、Entitlements、依赖库和构建设置
・对每个问题标明重要度、相关文件及行号、MASVS的要求ID以及修改建议
・区分实现层面的问题和需要额外测试的项目
・对于无法确认的项目,明确标注为“未验证”
・首先以只读方式进行调查,并将结果整理成Markdown格式的报告

但是,仅靠AI代码审查无法保证符合MASVS。

需要在真机上验证运行、通信内容、服务器端访问控制以及iCloud设置等。

此外,还需提前确认向AI发送源代码或执行工具的安全性。

12-3. 发布前检查清单

・机密信息是否已适当保存在Keychain等位置
・文件保存位置与Data Protection是否已确认
・iCloud的备份与共享范围是否已确认
・API通信是否使用了HTTPS
・是否未在应用中嵌入秘密API密钥
・是否在服务器端验证了认证与权限
・是否对外部输入和深层链接进行了验证
・日志和通知中是否不包含机密信息
・是否已确认外部SDK及依赖库的安全性
・Git或CI/CD中是否未遗留秘密信息
・是否已确认登出或注销时的数据删除
・是否已实施AI审查及必要的真机测试

建议按照AI代理进行初步审查 → 修正指出的问题 → 对真机和API进行安全测试的流程进行确认。

13. 总结

iOS具备强大的安全功能,但如果应用或服务器的实现存在问题,仍可能发生网络攻击和信息泄露。

尤其重要的是机密信息的安全存储、与iCloud或外部应用的共享范围、通信保护以及服务器端的访问控制。

此外,还需涵盖对外部库、AI开发工具及开发环境的管理,从设计到发布后的运营阶段持续确认安全性。

通过遵循MASVS等标准并利用AI代理等手段,将安全措施融入开发生命周期,才能提供安全的iOS应用。

来源:npaka · AI与游戏开发技术 · note.com