23

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 でテストしています。

誰かが同様の問題に直面したか、それとも私たちが間違っていることは明らかですか?

4

1 に答える 1

4

SMJobBlessこれは、ディスク上のヘルパー ツールを置き換える方法に関連するバグによるものです。具体的には、一時ファイルに書き込んで宛先の名前を変更するという一般的な方法ではなく、その場でバイナリを変更します。この結果、バイナリがメモリ内にある場合、ファイルを変更すると、ファイルをサポートするメモリ ページが変更され、コード署名が無効になります。これに関するバグ レポートを rdar://problem/13514523 に書きました。まだファイルを作成していない場合は、独自のファイルを作成することをお勧めします。

SMJobBless考えられる回避策は、ヘルパー ツールを使用してアップグレードする前に、ヘルパー ツールに自分自身をディスクから削除するようにアプリケーションに要求させることです。これにより、SMJobBlessディスク上の新しいファイルにコピーされ、問題が回避されます。

于 2013-03-27T11:12:23.737 に答える