Gab*_*lla 25 security objective-c nscoding ios nssecurecoding
我正在学习NSSecureCoding
Apple在iOS 6中引入的协议.
根据我的理解,到目前为止,只要一个类对自身的实例进行编码/解码,就应该使用它,以防止替换攻击.
我想知道在其他情况下使用它是否合适.
具体来说,如果一个类NSCoding
通过编码/解码其实例变量来符合,而不是整个实例,那么它仍然是可行的NSSecureCoding
吗?
假设我有一个实现NSCoding
如下的类
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.aString forKey:@"aMeaningfulString"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
self.aString = [decoder decodeObjectForKey:@"aMeaningfulString"];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
并且还假设没有涉及XPC.此类的实例将存储在磁盘上的plist中.
在安全方面,使用是否有任何好处,-decodeObjectOfClass:forKey:
而不是
-decodeObjectForKey:
?
Cod*_*aFi 19
具体来说,如果一个类通过编码/解码其实例变量来符合NSCoding,而不是整个实例,那么仍然建议实现NSSecureCoding吗?
这取决于您的应用程序的需求.对于任何旧的应用程序,使用普通的NSCoding将事物保存到磁盘是可以的,因为正在编写的信息和应用程序本身(本身不应该)是敏感的.但是,假设您是一家发行申请的银行.您可以选择将某些帐户信息或API密钥保留到磁盘,以便您可以与服务进行通信,验证用户的身份等.您可能不需要整个对象,但这并不重要.NSCoder不关心什么被读取,就可以读取它,并正确地完成其工作.这是个问题.
安全方面,使用-decodeObjectOfClass有什么好处:forKey:而不是-decodeObjectForKey:?
是的,非常如此.您依靠NSCoder序列化/反序列化对象(更不用说正确的对象)这一事实是一个巨大的攻击向量.一旦黑客以NSCoder使用的格式修改了信息(一种类似plist的结构,这是一种人类可读且非常类似的),那么就没有办法保证你得到的是你放入的内容NSCoder并不关心有人决定切换存档中包含的类,因此您正在重新构建恶意类的对象,运行时也不会.实际上,一个聪明的黑客会在应用程序中注入一个补丁,以确保反序列化的对象会引发某种未定义的状态(堆栈溢出),这可能会被用来潜在地利用整个应用程序.
decodeObjectOfClass:forKey:
允许您强制NSCoder更加智能地反序列化,并且它会修补一个非常大的漏洞.这并不是说你永远不应该使用NSCoder NSSecureCoding
,而是你必须聪明地了解你使用它的情况.