在iOS上替换malloc是否可行?

6
我想在iOS应用程序中使用自定义的mallocfree来进行一些分配,包括由NSMutableData这样的类所做的分配。
  • 这是否可行?
  • 如果是,我该如何做?

实际上,我想要做的是在使用某些数据后将其清零,以尽可能地保证前向安全性(以防设备丢失或被盗)。如果有一种不涉及替换malloc的更简单的方法,那就太好了。

我认为我需要替换malloc才能做到这一点,因为敏感数据存储在钥匙链中——而我别无选择,只能使用NSDictionaryNSStringNSData来访问这些数据(甚至不能使用可变版本)。


1
告诉我们为什么可能会有所帮助? - deanWombourne
@deanWombourne 我对数据安全很感兴趣,特别是在加密后从RAM中清除数据以及类似的任务。 - James
1
你正在预测有人监视iOS设备的RAM - 如果是这样,那么在加密期间阻止他们监视RAM并获取数据的是什么?如果他们可以访问RAM,我们可以假设他们控制了处理器,因此可以看到寄存器等 - 如果他们拥有这种控制权,那么你无能为力。 - deanWombourne
@deanWombourne 我预计在加密完成并且消息已经发送给对方之后,设备会落入邪恶的手中。我关心前向安全。 - James
5个回答

5

不要覆盖通用内存管理函数,可以在敏感对象上使用自定义分配器。

钥匙链服务API是用C语言编写的,并使用Core Foundation对象,如CFDictionary、CFData和CFString。虽然这些对象确实与它们的Objective-C对应物之间存在“免费桥接”,并且通常可以互换,但它们具有一些Objective-C所没有的功能。其中一个功能是使用自定义分配器。

例如,CFDictionaryCreate需要一个类型为CFAllocatorRef的参数,而这个参数可以通过CFAllocatorCreate创建。分配器保存了分配和释放等函数的指针。您可以使用自定义函数来覆盖敏感数据。


2
为什么你需要这么低级的操作呢?我会简单地将NSMutableData实例中的数据覆盖为零。如果你真的需要操作malloc,我可能会编写一个NSObject类别并重写内存处理函数。

1
因为我必须在钥匙串服务API中使用NSString、NSDictionary、NSData等。我也愿意尝试更简单的方法:我对Objective-C还比较新,什么是分类,如何使用它来覆盖内存处理? - James

2
免责声明:我没有 iOS 经验,但我了解它使用 GCC。假设这是正确的...
我已经用过在 PlayStation 3 上的 GCC 做过类似的事情。我不知道这有多少可移植性适用于你的情况。我使用了 GCC 的 objcopy 实用程序与--weaken-symbol。(您可能需要使用nm来列出库中的符号。
一旦你“削弱”了库的malloc,你就编写了自己的malloc函数,当链接时,它会被原始函数替换而不是给你一个链接错误。要委托给原始函数,您可能需要以某种方式给它另一个名称(不记得了——可能可以通过其中一个binutils 或者库中有一个malloc和一个_malloc —— 抱歉,已经过了一段时间了。
希望能对你有所帮助。

不幸的是,Apple的gcc不包括binutils,而是使用otool,据我所知它无法更改符号可见性。 - James

1

我建议您使用基于所有权(retain/release)的Objective-C内存管理系统。内存管理编程指南

另一个选择是使用带有C内存管理规则(如malloc)的C结构。


我想替换底层分配器:szone_malloc,或者其他的。对于应用程序相关部分,完全使用c是一个选项。 - James
我建议您在C中实现安全逻辑,只用Objective-C编写UI。您可以在同一项目中使用它们,将“c”文件扩展名用于C代码,“m”文件扩展名用于Objective-C代码。 - Ruben Marin

1

NSMutableData 的方法,如dataWithBytes:length,在内部已经使用了calloc/bzero。这对你来说足够好吗?


更重要的是当对象被释放时会发生什么:大概它不会费力将数据清零吧? - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接