objective-c - development - xcode kits
No se puede acceder al elemento de llavero despuĆ©s de la actualizaciĆ³n de SMJobBless (1)
Tenemos un problema con la actualización de una herramienta de ayuda con SMJobBless que nos ha estado desconcertando durante días.
Estamos desarrollando una aplicación para la cual en algún momento necesitamos realizar tareas administrativas (cargar / descargar un kext). También estamos utilizando el llavero para almacenar información de cuenta para nuestra aplicación.
Para las tareas administrativas, utilizamos una herramienta de ayuda que se instala con SMJobBless con la que nos comunicamos mediante el uso de 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 auxiliar utilizando un certificado de código de Thawte. Hasta ahora, todo funciona a la perfección. La herramienta auxiliar está instalada y podemos comunicarnos con ella utilizando DO; nuestro kext se carga y descarga con éxito.
El problema comienza cuando intentamos actualizar nuestra herramienta de ayuda. Utilizamos 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 nuevamente a SMJobBless para realizar la actualización.
Después de la llamada a SMJobBless, aparecen las siguientes líneas 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 elemento de llavero, la función SecKeychainItemCopyContent
devuelve errSecAuthFailed (-25293)
. Sin embargo, no se informa de ningún error si verificamos manualmente la firma de código de nuestra herramienta auxiliar instalada o paquete de aplicaciones usando codesign -vvvv PATH_TO_TOOL_OR_BUNDLE
. La herramienta y la aplicación se firman fuera del entorno Xcode y los contenidos no se modifican después del proceso de firma.
Hemos encontrado otro post que describe una situación similar, pero esa pregunta aún no ha sido respondida. Un problema relacionado podría ser el error de devolución SMJobBless 4098 .
Estamos probando en OSX 10.7.4.
¿Alguien ha enfrentado problemas similares o hay algo obvio que estamos haciendo mal?
Esto se debe a un error relacionado con cómo SMJobBless
reemplaza la herramienta auxiliar en el disco. En particular, modifica el binario en lugar de adoptar el enfoque común de escribir en un archivo temporal y luego cambiarle el nombre por encima del destino. El efecto de esto es que si el binario está en la memoria, las modificaciones al archivo cambian las páginas de memoria que respaldan el archivo, invalidando su firma de código. He escrito un informe de error sobre esto como rdar: // problema / 13514523. Le animo a que presente su propia cuenta si aún no lo ha hecho.
Una posible solución podría ser que su aplicación solicite a la herramienta auxiliar que se elimine del disco antes de usar SMJobBless
para actualizarlo. Esto debería dar como resultado que SMJobBless
copie a un nuevo archivo en el disco, evitando el problema.