跳过内容

MASTG-TEST-0086: 内存损坏漏洞

此测试即将更新

此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。

请提交 PR 来帮助我们解决以下问题:MASTG v1->v2 MASTG-TEST-0086:内存损坏漏洞 (ios)

发送反馈

概述

静态分析

是否有原生代码部分?如果有:检查通用内存损坏部分中给出的问题。编译后的原生代码有点难以发现。如果您有源代码,那么您可以看到 C 文件使用 .c 源文件和 .h 头文件,C++ 使用 .cpp 文件和 .h 文件。这与 Swift 和 Objective-C 的 .swift 和 .m 源文件略有不同。这些文件可以是源代码的一部分,也可以是第三方库的一部分,注册为框架并通过各种工具(例如 Carthage、Swift Package Manager 或 Cocoapods)导入。

对于项目中的任何托管代码(Objective-C / Swift),请检查以下项目

  • doubleFree 问题:对于给定的区域,free 被调用了两次而不是一次。
  • 保留周期:通过组件之间彼此的强引用来查找循环依赖关系,这些强引用会将材料保留在内存中。
  • 错误地管理 UnsafePointer 的实例会导致各种内存损坏问题。
  • 尝试手动管理对象上的 Unmanaged 引用计数,从而导致错误的计数器数字和过晚/过早的释放。

Realm academy 对此主题进行了精彩的演讲,并且 Ray Wenderlich 提供了一个不错的教程,可以了解实际发生的情况

请注意,对于 Swift 5,您只能释放完整的块,这意味着 playground 已经发生了一些变化。

动态分析

Xcode 提供了各种工具来帮助识别 Xcode 中的内存错误,例如 Xcode 8 中引入的 Debug Memory 图以及 Xcode 中的 Allocations and Leaks 工具。

接下来,您可以通过在测试应用程序时在 Xcode 中启用 NSAutoreleaseFreedObjectCheckEnabledNSZombieEnabledNSDebugEnabled 来检查内存是否释放过快或过慢。

有各种写得很好的解释可以帮助您处理内存管理。 这些可以在本章的参考列表中找到。