用于解除分配密码的iPhone内存管理(生产中的Malloc Scribble?,填充零释放内存?)

时间:2015-05-29 21:10:56

标签: ios objective-c iphone c security

我正在研究iPhone如何管理堆和堆栈,但很难找到有关此问题的良好信息来源。我试图追踪密码在内存中的保存方式,即使在NSString被解除分配后也是如此。

据我所知,一旦ARC中的释放计数降至0,iPhone就不会清除内存内容(写入零或垃圾)。因此带有密码的字符串将存在内存中,直到该内存位置为重写的。

在Xcode中有一个调试选项Malloc Scribble,用于调试内存问题,通过启用/禁用此选项(以及禁用Zombies)来填充已释放的内存0x55,以及模拟器的内存转储(使用gcore)我可以检查内容是否已在内存中替换0x55

我想知道这是否可以通过Apple Store构建完成,用垃圾数据填充解除分配的内存,如果我假设iPhone默认不这样做是正确与否,或者是否有任何问题处理内存中敏感数据的其他更好的选择,以及在使用它之后应该如何清除它(可变数据可能?写入该内存位置?)

2 个答案:

答案 0 :(得分:0)

我不认为可以在构建设置级别完成某些操作。但是,您可以通过将内存归零来应用某种内存清理(使用带有指向字符串的指针使用memset)。

答案 1 :(得分:0)

正如@Artal所说,memset可用于写入记忆位置。我发现这个框架"iMAS Secure Memory"可以用来处理这个问题:

  

" iMAS安全记忆"框架提供了一组工具   保护,清除和验证内存区域和个人   变量。它允许对象覆盖它的数据部分   在内存中加密版本或空字节

他们有一个清除记忆位置应该有用的方法:

// Return NO if wipe failed
extern inline BOOL wipe(NSObject* obj) {
    NSLog(@"Object pointer: %p", obj);
    if(handleType(obj, @"", &wipeWrapper) == YES) {
        if (getSize(obj) > 0){
            NSLog(@"WIPE OBJ");
            memset(getStart(obj), 0, getSize(obj));
        }
        else
            NSLog(@"WIPE: Unsupported Object.");
    }
    return YES;
}