菜鸟教程小白 发表于 2022-12-13 13:40:53

ios - 防止 NSString 的堆检查


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

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

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

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

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

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

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

<p>我在 Objective-C中没有发现任何可以防止堆检查漏洞的东西。在 Objective-C中是否有一些常见的方法来防止这种情况?
你知道从哪里开始的一些好点吗?</p>

<p>任何帮助表示赞赏!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>一个评论和一个食谱。在支持无交换或加密交换的系统中,消除数据几乎没有实际意义。发现密码的主要剩余攻击是直接附加到正在运行的应用程序。我使用钥匙串(keychain)模式来防御这种攻击。</p>

<p>目标是清除堆上的 secret 。</p>

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

<p>当你用完密码<code>NSString</code>后,释放它。 (使用 ARC,将其设置为 nil。)</p>

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

<p>是的,这违反了可变性保存的所有规则。这就是不安全指针操作的用途。他们是不安全的。但你也在一个特定的地方做某事是有充分理由的。</p>

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

<p>如果以上内容不清楚,我很乐意进一步完善答案。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 防止 NSString 的堆检查,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37617865/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37617865/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 防止 NSString 的堆检查