Swift开发iOS应用:如何检测可信运行环境?
iOS应用扫描提示「应用未检查确保运行环境可信」的解析
问题核心含义
这个扫描告警对应OWASP移动Top10 2016的逆向工程风险(M9)以及CWE-284访问控制不当问题,本质是指应用未对自身运行环境的安全性做校验,常见缺失的校验场景包括:
- 未检测设备是否越狱
- 未验证应用二进制文件是否被篡改(比如重签名、注入恶意代码)
- 未检查是否有调试器附加到应用进程
- 未校验运行环境是否存在恶意框架(比如Substrate)
为什么部分应用未被标记?
- 部分应用已实现环境校验逻辑,但扫描工具未检测到(比如校验代码做了混淆、或使用第三方安全SDK的隐蔽校验方案)
- 扫描工具针对不同品类应用设置了不同规则阈值,低风险品类(如纯资讯类)可能不触发该告警
- 部分扫描工具存在误判,或仅识别特定系统API的调用,对自定义校验逻辑不做判定
Swift下的基础校验实现示例
1. 简易越狱检测
func isJailbroken() -> Bool { let suspiciousPaths = ["/Applications/Cydia.app", "/private/var/stash", "/private/var/mobile/Library/SBSettings/Themes"] for path in suspiciousPaths { if FileManager.default.fileExists(atPath: path) { return true } } // 额外检测是否能访问系统私有目录 let canWriteToPrivate = FileManager.default.createFile(atPath: "/private/jailbreaktest.txt", contents: "test".data(using: .utf8), attributes: nil) if canWriteToPrivate { try? FileManager.default.removeItem(atPath: "/private/jailbreaktest.txt") return true } return false }
2. 调试器附加检测
import Foundation import MachO func isDebuggerAttached() -> Bool { var info = kinfo_proc() var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] var size = MemoryLayout<kinfo_proc>.stride let sysctlResult = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) guard sysctlResult == 0 else { return false } return (info.kp_proc.p_flag & P_TRACED) != 0 }
生产环境注意事项
- 基础校验逻辑易被逆向绕过,建议结合专业安全SDK或对校验代码做混淆处理
- 过度校验可能影响正常用户体验(如部分越狱用户仅安装合规插件),需平衡安全需求与用户体验
内容的提问来源于stack exchange,提问作者Vizulefllry
相关产品推荐
相关产品推荐

