簡體   English   中英

SMJobBless更新后無法訪問鑰匙串項目

[英]Cannot access keychain item after SMJobBless update

我們在使用SMJobBless更新幫助工具時遇到了問題,這個工具一直困擾着我們好幾天。

我們正在開發一個應用程序,在某些時候我們需要執行管理任務(加載/卸載kext)。 我們還使用鑰匙串存儲我們應用程序的帳戶信息。

對於管理任務,我們使用一個使用SMJobBless安裝的輔助工具,我們使用DO over Mach端口(使用NSConnection)與之交流。

在幫助工具中:

// 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的代碼簽名證書簽署了應用程序和幫助工具。 到目前為止,一切都像一個魅力。 幫助工具已安裝,我們可以使用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

此后,應用程序無法從我們的鑰匙串項讀取應用程序密碼, SecKeychainItemCopyContent函數返回errSecAuthFailed (-25293) 但是,如果我們使用codesign -vvvv PATH_TO_TOOL_OR_BUNDLE手動驗證已安裝的幫助程序工具或應用程序包的代碼簽名,則不會報告錯誤。 該工具和應用程序在Xcode環境之外簽名,簽名過程后內容不會更改。

我們發現了另一篇描述類似情況的帖子 ,但這個問題仍然沒有答案。 相關問題可能是SMJobBless返回錯誤4098

我們正在測試OSX 10.7.4。

任何人都面臨類似的問題,或者有什么明顯我們做錯了嗎?

這是由於與SMJobBless如何替換磁盤上的幫助工具有關的錯誤。 特別是,它修改了二進制文件,而不是采用寫入臨時文件的常用方法,然后在目標頂部重命名。 這樣做的結果是,如果二進制文件在內存中,則對文件的修改會更改支持文件的內存頁,從而使其代碼簽名無效。 我已經寫了一個關於這個的錯誤報告,如rdar:// problem / 13514523。 如果你還沒有這樣做,我建議你自己提交。

可能的解決方法可能是讓您的應用程序要求幫助工具在使用SMJobBless進行升級之前將其自身從磁盤中刪除。 這應該導致SMJobBless復制到磁盤上的新文件,繞過該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM