2012-06-19 11 views
23

Tenemos un problema con la actualización de una herramienta de ayuda con SMJobBless que nos ha estado confundiendo durante días.No se puede acceder al elemento de llavero después de actualizar SMJobBless

Estamos desarrollando una aplicación para la cual en algún momento tenemos que realizar tareas administrativas (carga/descarga de un kext). También estamos utilizando el llavero para almacenar información de la cuenta para nuestra aplicación.

Para las tareas administrativas, utilizamos una herramienta de ayuda que se instala utilizando SMJobBless con el que nos comunicamos utilizando puertos DO sobre Mach (con NSConnection).

En la herramienta de ayuda:

// 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];   

En la aplicación:

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

id proxyServerObject = [conn rootProxy]; 

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

FIRMAMOS tanto la aplicación como la herramienta de ayuda mediante un certificado codesign de Thawte. Hasta ahora, todo funciona como un encanto. La herramienta de ayuda está instalada y podemos comunicarnos con ella utilizando DO; nuestro kext se carga y descarga con éxito.

El problema comienza cuando tratamos de actualizar nuestra herramienta de ayuda. Usamos el diccionario de información de la herramienta instalada y la herramienta incluida en nuestro paquete de aplicaciones para verificar si se requiere una actualización de la herramienta y llamar a SMJobBless nuevamente para realizar la actualización.

Después de la llamada SMJobBless, las siguientes líneas aparecen en la consola:

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 

Después de esto, la aplicación no puede leer la contraseña de la aplicación de nuestro artículo llavero, la función vuelve SecKeychainItemCopyContenterrSecAuthFailed (-25293). Sin embargo, no se informa ningún error si verificamos manualmente la firma del código de nuestra herramienta de ayuda instalada o paquete de aplicaciones usando codesign -vvvv PATH_TO_TOOL_OR_BUNDLE. La herramienta y la aplicación están firmadas fuera del entorno de Xcode y los contenidos no se modifican después del proceso de firma.

Hemos encontrado one other post que describe una situación similar, pero esa pregunta aún no ha sido respondida. Un problema relacionado podría ser SMJobBless returning error 4098.

Estamos probando en OSX 10.7.4.

¿Alguien se enfrentó a problemas similares o hay algo obvio de que estamos haciendo mal?

Respuesta

3

Esto se debe a un error relacionado con cómo SMJobBless reemplaza a la herramienta de ayuda en el disco. En particular, modifica el binario en lugar de tomar el enfoque común de escribir en un archivo temporal y luego cambiarle el nombre a la parte superior del destino. El efecto de esto es que si el binario está en la memoria, las modificaciones del archivo cambian las páginas de memoria que respaldan el archivo, lo que invalida la firma del código. He escrito un informe de error sobre esto como rdar: // problem/13514523. Lo animo a que presente el suyo si aún no lo ha hecho.

Una posible solución puede ser que su aplicación solicite a la herramienta de ayuda que se elimine del disco antes de usar SMJobBless para actualizarla. Esto debería dar como resultado SMJobBless copiar a un nuevo archivo en el disco, evitando el problema.

+0

Actualmente me encuentro con este error al intentar actualizar la herramienta de ayuda en Yosemite (10.10).Parece que funciona bien en El Capitán (10.11). ¿Tal vez Apple solucionó el error? –

Cuestiones relacionadas