Подтвердить что ты не робот

Не удается получить доступ к элементу связки ключей после обновления SMJobBless

У нас есть проблема с обновлением вспомогательного инструмента с помощью 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

После этого приложение не может прочитать пароль приложения из нашего элемента keychain, функция SecKeychainItemCopyContent возвращает errSecAuthFailed (-25293). Однако об ошибке не сообщается, если мы вручную проверим подпись кода нашего установленного вспомогательного инструмента или пакета приложений с помощью codesign -vvvv PATH_TO_TOOL_OR_BUNDLE. Инструмент и приложение подписываются вне среды Xcode, и содержимое не изменяется после процесса подписания.

Мы обнаружили еще одно сообщение, которое описывает аналогичную ситуацию, но этот вопрос по-прежнему остается без ответа. Связанная с этим проблема может быть SMJobBless, возвращающая ошибку 4098.

Мы тестируем OSX 10.7.4.

Кто-нибудь сталкивался с подобными проблемами или есть что-то очевидное, что мы делаем неправильно?

4b9b3361

Ответ 1

Это связано с ошибкой, связанной с тем, как SMJobBless заменяет вспомогательный инструмент на диске. В частности, он изменяет двоичный код вместо того, чтобы использовать общий подход к записи во временный файл и затем переименовывать его поверх места назначения. Эффект от этого заключается в том, что если двоичный файл находится в памяти, изменения в файле изменяют страницы памяти, поддерживающие файл, что делает их недействительными. Я написал отчет об ошибке в качестве rdar://problem/13514523. Я бы посоветовал вам подать свои собственные, если вы еще этого не сделали.

Возможное обходное решение может заключаться в том, чтобы ваше приложение попросило вспомогательный инструмент удалить себя с диска, прежде чем использовать SMJobBless для его обновления. Это приведет к копированию SMJobBless в новый файл на диске, минуя проблему.