попытка запустить kextutil в файле kext возвращает ошибку разрешений

#xcode #macos #iokit #kernel-extension

#xcode #macos #iokit #ядро-расширение

Вопрос:

Привет сообществу Stackoverflow.

Пытаюсь выполнить следующее руководство — чтобы я мог узнать, как закодировать утилиту драйвера.
http://www.robertopasini.com/index.php/2-uncategorised/625-osx-creating-a-device-driver

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

 admins-Mac-mini:Debug admin$ kextutil -n -t /tmp/ssvac.kext
Skipping staging and system policy checks because not running as root, expect staging errors.
Kext rejected due to improper filesystem permissions: <OSKext 0x7f91d402f140 [0x7fff898b2cc0]> { URL = "file:///private/tmp/ssvac.kext/", ID = "myappleid.ssvac" }
Code Signing Failure: code signature is invalid
Authentication Failures: 
    File owner/permissions are incorrect (must be root:wheel, nonwritable by group/other): 
        /private/tmp/ssvac.kext
        Contents
        _CodeSignature
        CodeResources
        MacOS
        ssvac
        Info.plist

Diagnostics for /private/tmp/ssvac.kext:
Authentication Failures: 
    File owner/permissions are incorrect (must be root:wheel, nonwritable by group/other): 
        /private/tmp/ssvac.kext
        Contents
        _CodeSignature
        CodeResources
        MacOS
        ssvac
        Info.plist

admins-Mac-mini:Debug admin$ 
  

Я попытался изменить разрешения / владельца следующим образом:

 admins-Mac-mini:Debug admin$ chown root:wheel /tmp/ssvac.kext/

admins-Mac-mini:Debug admin$ ls -lah /tmp/ssvac.kext/
total 0
drwxrwxrwx  3 root   wheel    96B 16 Oct 16:37 .
drwxrwxrwt  7 root   wheel   224B 19 Oct 08:08 ..
drwxr-xr-x  5 admin  wheel   160B 16 Oct 16:37 Contents
admins-Mac-mini:Debug admin$ kextutil -n -t /tmp/ssvac.kext
  

Не уверен, как именно ее устранить.
Если у вас есть какие-либо советы, я был бы признателен.

Спасибо!

РЕДАКТИРОВАТЬ 1

 My mistake was when I copied from the debug folder to /tmp/, I didn't use the -r switch.  Now that I have, this is the error I'm getting: 

admins-Mac-mini:Debug admin$ cp -r ssvac.kext/ /tmp/
admins-Mac-mini:Debug admin$ sudo kextutil /tmp/
Contents/                     com.apple.launchd.GufwRL5Sf0/ com.google.Keystone/          powerlog/                     ssvac.kext/
admins-Mac-mini:Debug admin$ sudo kextutil /tmp/ssvac.kext/
Password:
Untrusted kexts are not allowed
Kext with invalid signature (-67050) denied: /private/var/db/KernelExtensionManagement/Staging/tmp.RLlmC1/59AFE9EA-12E3-42C0-B3FC-E98EF987D9B2.kext
Bundle (/private/tmp/ssvac.kext) failed to validate, deleting: /private/var/db/KernelExtensionManagement/Staging/tmp.RLlmC1/59AFE9EA-12E3-42C0-B3FC-E98EF987D9B2.kext
Unable to stage kext (/private/tmp/ssvac.kext) to secure location.
admins-Mac-mini:Debug admin$ 
  

Ответ №1:

Как вы можете видеть из ls выходных данных, kexts — это действительно каталоги, содержащие как минимум файл Info.plist и информацию о подписи кода в предопределенном макете каталога. (начиная с Contents подкаталога) Обычно он также содержит двоичный исполняемый файл. Все файлы и подкаталоги в kext должны иметь соответствующие разрешения, чтобы kext рассматривался для загрузки. Это означает, что разрешения должны применяться рекурсивно с -R флагом при использовании chown .

Вместо использования chown я обычно рекомендую просто скопировать kext во временное местоположение в качестве пользователя root, поскольку тогда у вас не возникнет проблем при попытке заменить его обновленной версией в качестве непривилегированного пользователя во время цикла code / compile / load / debug:

 # Copies kext to /tmp, owned by root
sudo cp -r "path/to/built.kext" "/tmp/"
# Attempts to load kext
sudo kextutil "/tmp/built.kext"
  

(Обязательный отказ от ответственности, указывающий на то, что многие типы kext теперь устарели, и вы захотите убедиться, что написание kext действительно, действительно, действительно является правильным путем для вашего проекта.)

Комментарии:

1. Я думаю, что моя ошибка заключалась не в копировании всей папки в /tmp. Я скопировал только один файл. Но теперь, когда я выполнил рекурсивную операцию, я получаю другую ошибку. Пожалуйста, смотрите Редактирование 1

2. @dot После вашего редактирования ваш вопрос теперь, по сути, состоит из 2 вопросов, что плохо по разным причинам . Я дам вам быстрый ответ на второй вопрос, но если этого недостаточно, пожалуйста, задайте его как новый вопрос. Kext with invalid signature (-67050) denied означает именно то, что там сказано: вам нужно подписать свой kext действительным сертификатом подписи kext и заверить kext у нотариуса, или вам нужно отключить проверку подписи kext, отключив эту часть SIP (защита целостности системы) или весь SIP.

3. да, это имеет смысл!