gpt4 book ai didi

objective-c - SMJobBless 更新后无法访问钥匙串(keychain)项目

转载 作者:太空狗 更新时间:2023-10-30 03:12:03 26 4
gpt4 key购买 nike

我们在使用 SMJobBless 更新帮助工具时遇到了问题,这几天一直困扰着我们。

我们正在开发一个应用程序,在某些时候我们需要执行管理任务(加载/卸载 kext)。我们还使用钥匙串(keychain)来存储我们应用程序的帐户信息。

对于管理任务,我们使用使用 SMJobBless 安装的帮助工具我们通过 Mach 端口(使用 NSConnection)使用 DO 与之通信。

在辅助工具中:

// use our bundle id as our service name
NSString* name = [[NSBundle mainBundle] bundleIdentifier];

launch_data_t checkinRequest = launch_data_new_string(LAUNCH_KEY_CHECKIN);
launch_data_t checkinResponse = launch_msg(checkinRequest);
launch_data_t machServicesDict = launch_data_dict_lookup(checkinResponse, LAUNCH_JOBKEY_MACHSERVICES);
launch_data_t machPort = launch_data_dict_lookup(machServicesDict, [name UTF8String]);

mach_port_t mp = launch_data_get_machport(machPort);

launch_data_free(checkinResponse);
launch_data_free(checkinRequest);

NSMachPort *receivePort = [[NSMachPort alloc] initWithMachPort:mp];
NSConnection *server = [NSConnection connectionWithReceivePort:receivePort sendPort:nil];

在应用中:

NSConnection *conn = [NSConnection connectionWithRegisteredName:HELPER_BUNDLE_IDENTIFIER host:nil];

id proxyServerObject = [conn rootProxy];

if(conn && proxyServerObject) {
return [proxyServerObject someMethod];
}
return NO;

我们使用 Thawte 的协同签名证书对应用程序和辅助工具进行签名。到目前为止,一切都像一个魅力。 helper工具安装完成,我们可以使用DO与之通信;我们的 kext 加载和卸载成功。

当我们尝试更新我们的帮助工具时,问题就开始了。我们使用已安装工具的信息字典和应用程序包中的捆绑工具来检查是否需要更新工具,并再次调用 SMJobBless 来执行更新。

调用 SMJobBless 后,控制台中会出现以下几行:

6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x104e17000): p=74362[OURAPP] clearing CS_VALID
6/19/12 10:31:24.000 AM kernel: CODE SIGNING: cs_invalid_page(0x10d0de000): p=74364[OURAPPHELPER] clearing CS_VALID

在此之后,应用程序无法从我们的钥匙串(keychain)项中读取应用程序密码,函数 SecKeychainItemCopyContent 返回 errSecAuthFailed (-25293)。但是,如果我们使用 code>codesign -vvvv PATH_TO_TOOL_OR_BUNDLE 手动验证已安装的帮助工具或应用程序包的代码签名,则不会报告错误。该工具和应用程序在 Xcode 环境之外进行签名,并且在签名过程后内容不会更改。

我们找到了one other post描述了类似的情况,但该问题仍未得到解答。一个相关的问题可能是 SMJobBless returning error 4098 .

我们正在 OSX 10.7.4 上进行测试。

有没有人遇到过类似的问题,或者有什么明显的地方我们做错了吗?

最佳答案

这是由于与 SMJobBless 如何替换磁盘上的帮助工具相关的错误。特别是,它会就地修改二进制文件,而不是采用写入临时文件然后在目标之上重命名的常见方法。这样做的效果是,如果二进制文件在内存中,则对文件的修改会更改支持文件的内存页面,从而使其代码签名无效。我写了一个关于这个的错误报告 rdar://problem/13514523。如果您还没有这样做,我鼓励您自己提交。

一个可能的解决方法是让您的应用程序要求帮助工具在您使用 SMJobBless 升级它之前将其自身从磁盘中删除。这应该会导致 SMJobBless 复制到磁盘上的一个新文件,绕过这个问题。

关于objective-c - SMJobBless 更新后无法访问钥匙串(keychain)项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11098402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com