macOS Kext с действительной подписью отклонен после 2-й установки (high sierra)

на машине, где мой продукт был установлен раньше, вторая установка завершается неудачей из-за отклонения подписи kext.

Я видел в некоторых местах ту же ошибку, например здесь:https://support.eset.com/kb6570, однако даже после очистки таблицы kext_policy в режиме восстановления и утверждения kext вручную в настройках --> безопасность при следующей загрузке kext по-прежнему кажется неутвержденным.

например, запуск kextutil обеспечивает следующий:

Kalyan:~ KalyanPentakota$ sudo kextutil /Library/Extensions/mycompanyAT.kext/
Password:
Kext rejected due to insecure location: <OSKext 0x7f8e9ff02e20 [0x7fffa11c8af0]> { URL = "file:///Library/StagedExtensions/Library/Extensions/mycompanyAT.kext/", ID = "com.mycompany.at" }
Kext rejected due to insecure location: <OSKext 0x7f8e9ff02e20 [0x7fffa11c8af0]> { URL = "file:///Library/StagedExtensions/Library/Extensions/mycompanyAT.kext/", ID = "com.mycompany.at" }
Diagnostics for /Library/Extensions/mycompanyAT.kext:

статус утверждения kext в базе данных:

sqlite> select * from kext_policy;
XE2XNRRXZ5|jp.co.canon.bj.print.BJUSBLoad|1|Canon Inc.|8
KBVSJ83SS9|com.citrix.kext.gusb|1|Citrix Systems, Inc.|8
MK9BR98H51|com.mycompany.at|1|My Company Ltd|1

проверка сертификата Kext:

Kalyan:~ KalyanPentakota$ codesign -dvv /Library/Extensions/mycompanyAT.kext/
Executable=/Library/Extensions/mycompanyAT.kext/Contents/MacOS/mycompanyAT
Identifier=com.mycompany.at
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=8179 flags=0x0(none) hashes=250+3 location=embedded
Signature size=4651
Authority=Developer ID Application: My Company Ltd (MK9BR98H51)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Signed Time=Jun 5, 2018 at 6:05:21 AM
Info.plist entries=22
TeamIdentifier=MK9BR98H51
Sealed Resources version=2 rules=13 files=1
Internal requirements count=1 size=212

Я также попытался удаление / Библиотека / StagedExtensions / Библиотека/, но это ничего не изменило.

3 ответов


у меня была та же проблема.

флаг /Library/StagedExtensions должен быть "ограничен":

ls -laO /Library/StagedExtensions/

drwxr-xr-x@ 4 корневое колесо ограничено 128 Ноя 15 2017 StagedExtensions

Если нет, попробуйте ниже cmd из режима восстановления:

chflags -R restricted /V*/*/Library/StagedExtensions

перезагрузитесь и попробуйте установить kext.


Kext rejected due to insecure location нет отказа подписи IMHO. Где говорится о подписи? Когда подпись-это проблема, это говорит литература. Для меня это сообщение говорит, что место небезопасно.

вы проверили права доступа /Library/Extensions? Если разрешения слишком открыты, система откажется загружать расширения ядра с помощью kextload или kextutil. Папка /Library/Extension должна принадлежать root:wheel и никто, кроме root надо уметь писать папка.

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

если вы посмотрите на исходный код macOS (да, macOS широко открыт, люди склонны забывать об этом), вы увидите, что эта ошибка возникает только в одном месте:

if (authOptions->requireSecureLocation) {
    if (!kextIsInSecureLocation(theKext)) {
        OSKextLogCFString(NULL,
                          kOSKextLogErrorLevel | kOSKextLogValidationFlag,
                          CFSTR("Kext rejected due to insecure location: %@"),
                          theKext);
        result = false;
        goto finish;
    }
}

теперь kextIsInSecureLocation() очень просто:

Boolean
kextIsInSecureLocation(OSKextRef theKext)
{
    NSURL *url = (__bridge NSURL *)OSKextGetURL(theKext);
    if (!url) {
        return false;
    }
    return pathIsSecure(url.path);
}

и так pathIsSecure():

Boolean
pathIsSecure(NSString *path) {
    Boolean is_secure = false;
    BOOL is_protected_volume = rootless_protected_volume(path.UTF8String) ? YES : NO;
    BOOL is_trusted_path = rootless_check_trusted_class(path.UTF8String, "KernelExtensionManagement") == 0 ? YES : NO;

    if (isSIPDisabled()) {
        // SIP is disabled so everything is considered secure.
        is_secure = true;
    } else if (!is_protected_volume) {
        // SIP is enabled and the volume is not protected, so it's insecure.
        is_secure = false;
    } else {
        // SIP is enabled and it is a protected volume, so it's only secure if it's trusted.
        is_secure = is_trusted_path;
    }
    return is_secure;
}

таким образом, с отключенным SIP любой путь безопасен, с включенным SIP, Тома без поддержки SIP никогда не безопасны, иначе, кажется, есть список надежных путей, и я точно знаю, что /Library/Extensions является таким надежным путем, но только если его разрешение установлено правильно.

чтобы проверить, поддерживает ли ваш том SIP, откройте Disk Utility app, выберите загрузочный том и нажмите CMD+I. Откроется окно со списком всех вид свойств и среди них должно быть одно высказывание:

System Integrity Protection supported : Yes

если он говорит "Нет", у вас определенно будет проблема, но я понятия не имею, какой из них не известен как способ en-/disable SIP для отдельных томов, я только предполагаю, что некоторые файловые системы или Тома, смонтированные по сети, могут не поддерживать SIP.

обновление (2018-07-31)

связавшись с Apple об этом, они дали мне следующий совет:

кроме того, в бывает полезно,sudo kextcache --clear-staging позволяет пользователю очистить /Library/StagedExtensions папка без загрузки в восстановление.

не уверен, что это решает проблему в подобных случаях, просто поделиться этой информацией с вами здесь.


этот обходной путь в настоящее время разрешил все случаи, с которыми мы столкнулись в производстве:

вы должны загрузить в режиме восстановления, отключить sip, перезапустить, аннулировать кэш kext, перезапустить в восстановлении снова, а затем повторно включить sip.

подробное описание шагов:

  1. в меню Apple выберите "перезагрузка".
  2. после перезагрузки компьютера Mac нажмите и удерживайте клавишу Command (⌘) + R сразу после запуска. Держите ключи, пока логотип Apple, как представляется, получить компьютер в режиме восстановления.
  3. компьютер теперь находится в режиме восстановления. В меню Apple выберите утилиты - > терминал
  4. выполнить команду: csrutil отключить
  5. в меню Apple выберите "перезагрузка".
  6. после загрузки macOS откройте терминал и введите: sudo kextcache-аннулировать/
  7. если ваш kext находится в нестандартном месте, добавьте пользовательский kext путь, например:
    sudo kextcache-invalidate /Library/MyApp/MyApp.kext
  8. в меню Apple выберите "перезагрузка".
  9. после перезагрузки компьютера Mac нажмите и удерживайте клавиши Command (⌘) + R услышав сигнал загрузки. Держите ключи до тех пор пока Появляется логотип Apple, чтобы получить компьютер в режиме восстановления.
  10. компьютер теперь находится в режиме восстановления. В меню Apple выберите Утилиты -> Терминал
  11. выполнить команда:csrutil включить
  12. в меню Apple выберите "перезагрузка".
  13. теперь ваш kext должен работать..