ios - 防止 NSString 的堆检查

标签 ios objective-c security

我正在努力提高我们的代码安全性。我们使用名为 CheckMarx 的静态代码分析工具。该工具在公司是新的,特别是我们是唯一一个使用 Objective-C 在 iOS 上工作的团队。

我有一个连接服务器的参数类,它包含服务器地址、端口、几个参数、登录名和密码 密码不应由用户录音,而应由用户录音。每次需要时,它都会作为 token 从另一个强身份验证服务中检索。它不应该保存为持久值(因为它每次都会改变),所以钥匙串(keychain)看起来不能满足我的需要。 对于演示项目,用户将在文本字段中点击它。该演示项目正在接受安全验证。

运行分析时,我遇到了“堆检查”漏洞: https://cwe.mitre.org/data/definitions/244.html关于密码。理论上我理解我应该清除存储密码的内存空间的问题,但我不知道在 Objective-C 中实现这一点。

密码是一个 NSString,它是不可变的,所以如果我试图覆盖 NSString,我将只创建一个新字符串并将旧字符串放在堆中的某个位置。 (如果我在 dealloc 方法中覆盖它,我会收到另一个警告,说硬编码字符串是密码的坏习惯)。 将变量重命名为另一个虚拟变量名称,如 MyDummyPropThatContainsData

1) ARC 将清除指针,但我认为它不会清理堆。所以我相信这不是误报。我错了吗?

2) 我已经尝试使用分配了 MAX_SIZE_PASSWORD 的 NSMutableString。我使用 setString 方法设置变量(在同一个地方)。我通过使用恰好 MAX_SIZE_PASSWORD 的虚拟值调用 setString 方法,在 dealloc 方法中将其删除。它删除了警告,这是一个好习惯吗? 我很确定这应该是另一个警告,说硬编码字符串是密码的不良做法,但未检测到。我想坏习惯仍然存在......

3) 我想过使用 char* 这样我以后就可以对其进行内存设置,但这对我来说听起来很糟糕。恐怕这可能是可靠性和维护问题。这可以解决我的问题吗?是否建议 ARC 在我需要管理密码的任何地方管理我自己的 char * 分配?

我在 Objective-C 中没有发现任何可以防止堆检查漏洞的东西。在 Objective-C 中是否有一些通用的方法来防止这种情况发生? 您知道从哪里开始的一些好处吗?

感谢任何帮助!

最佳答案

一个评论也是一个食谱。在支持无交换或加密交换的系统中,对数据进行零处理几乎没有实际意义。发现密码的主要剩余攻击是直接附加到正在运行的应用程序。我使用钥匙串(keychain)模式来防御这种攻击。

目标是删除堆上的 secret 。

当我将密码保存在我的钥匙串(keychain)中时,它们将作为 NSData BLOB 返回。这是关键。然后,您可以使用 BLOB 的字节初始化 NSString 并禁止字符串拥有它们 (freeWhenDone: NO)。虽然我不能保证 NSString 不会复制数据,但情况似乎是这样。 (确保您没有指定导致 NSString 必须重新转换数据的编码。UTF-8 通常可以正常工作。)

当你完成密码 NSString 后,释放它。 (使用 ARC,将其设置为 nil。)

现在清理堆的关键是使用NSData例程枚举它的每个字节数组,通常只有一个,然后将字节设置为NULL。如果您愿意,可以插入随机字节。您现在可以释放 NSData BLOB。

是的,这打破了所有的可变性保存规则。这就是不安全指针操作的目的。他们不安全。但您也有充分理由在特定地点做某事。

由于这是一个相当微妙的操作,我不愿分享实现上述算法的代码。 IMO,您需要对自己的安全卫生负责。

如果以上内容不清楚,我很乐意进一步完善答案。

关于ios - 防止 NSString 的堆检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617865/

相关文章:

ios - 在 iphone 上同时进行调试和发布构建

ios - 如何随机给 UILabel 上色

ios - 将文本框值发送到 UILabels

objective-c - 使用 RestKit 将 bool 属性从 JSON 映射到 NSManagedObject

ios - 旋转 UIView(再次)

java - 使用 Java 存储 SHA2 密码

asp.net - 保护 Web 服务

ios - 如何在 URLSession 数据任务中设置变量?

windows - 绕过 ACL 以外的 WindowsApps 文件夹保护

ios - 取消按钮在 UIImagePickerView 中不起作用