2012-06-19 41 views
23

Chúng tôi gặp sự cố khi cập nhật công cụ trợ giúp với SMJobBless đã khiến chúng tôi khó hiểu trong nhiều ngày nay.Không thể truy cập mục keychain sau khi cập nhật SMJobBless

Chúng tôi đang phát triển một ứng dụng mà tại một số thời điểm chúng tôi cần thực hiện các tác vụ quản trị (tải/dỡ một kext). Chúng tôi cũng đang sử dụng keychain để lưu trữ thông tin tài khoản cho ứng dụng của chúng tôi.

Đối với các tác vụ quản trị, chúng tôi sử dụng công cụ trợ giúp được cài đặt bằng cách sử dụng SMJobBless mà chúng tôi liên lạc bằng cách sử dụng DO qua cổng Mach (với NSConnection).

Trong công cụ trợ giúp:

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

Trong ứng dụng:

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

id proxyServerObject = [conn rootProxy]; 

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

Chúng tôi ký cả ứng dụng và công cụ trợ giúp sử dụng chứng chỉ codesign từ Thawte. Cho đến nay, mọi thứ hoạt động như một sự quyến rũ. Công cụ trợ giúp được cài đặt và chúng ta có thể giao tiếp với nó bằng DO; kext của chúng tôi được tải và tải xuống thành công.

Sự cố bắt đầu khi chúng tôi cố gắng cập nhật công cụ trợ giúp của chúng tôi. Chúng tôi sử dụng từ điển thông tin của công cụ đã cài đặt và công cụ đi kèm trong gói ứng dụng của chúng tôi để kiểm tra xem có cần cập nhật công cụ hay không và gọi lại cho SMJobBless để thực hiện cập nhật.

Sau khi cuộc gọi SMJobBless, những dòng sau xuất hiện trong Console:

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 

Sau này, ứng dụng không thể đọc được mật khẩu ứng dụng từ mục keychain của chúng tôi, hàm SecKeychainItemCopyContent lợi nhuận errSecAuthFailed (-25293). Tuy nhiên, không có lỗi nào được báo cáo nếu chúng tôi xác minh bằng tay mã chữ ký của công cụ trợ giúp được cài đặt của chúng tôi hoặc gói ứng dụng bằng cách sử dụng codesign -vvvv PATH_TO_TOOL_OR_BUNDLE. Công cụ và ứng dụng được ký bên ngoài môi trường Xcode và nội dung không bị thay đổi sau quá trình ký.

Chúng tôi đã tìm thấy one other post mô tả tình huống tương tự, nhưng câu hỏi đó vẫn chưa được trả lời. Sự cố có liên quan có thể là SMJobBless returning error 4098.

Chúng tôi đang thử nghiệm trên OSX 10.7.4.

Bất kỳ ai gặp phải sự cố tương tự hoặc có điều gì rõ ràng rằng chúng tôi đang làm sai?

Trả lời

3

Điều này là do lỗi liên quan đến cách SMJobBless thay thế công cụ trợ giúp trên đĩa. Đặc biệt, nó sửa đổi nhị phân tại chỗ thay vì dùng cách tiếp cận chung của ghi vào một tệp tạm thời và sau đó đổi tên nó trên đầu trang đích. Hiệu ứng của điều này là nếu nhị phân có trong bộ nhớ, các sửa đổi đối với tệp sẽ thay đổi các trang bộ nhớ sao lưu tệp, làm mất hiệu lực chữ ký mã của chúng. Tôi đã viết một báo cáo lỗi về vấn đề này dưới dạng rdar: // problem/13514523. Tôi muốn khuyến khích bạn tự nộp hồ sơ nếu bạn chưa làm như vậy.

Có thể có cách giải quyết để ứng dụng của bạn yêu cầu công cụ trợ giúp tự xóa khỏi đĩa trước khi sử dụng SMJobBless để nâng cấp. Điều này sẽ dẫn đến việc sao chép SMJobBless vào một tệp mới trên đĩa, bỏ qua vấn đề này.

+0

Tôi hiện đang chạy vào lỗi này khi cố nâng cấp công cụ trợ giúp trên Yosemite (10.10).Dường như làm việc tốt trong El Capitan (10.11). Có lẽ Apple đã sửa lỗi này? –

Các vấn đề liên quan