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.
подробное описание шагов:
- в меню Apple выберите "перезагрузка".
- после перезагрузки компьютера Mac нажмите и удерживайте клавишу Command (⌘) + R сразу после запуска. Держите ключи, пока логотип Apple, как представляется, получить компьютер в режиме восстановления.
- компьютер теперь находится в режиме восстановления. В меню Apple выберите утилиты - > терминал
- выполнить команду: csrutil отключить
- в меню Apple выберите "перезагрузка".
- после загрузки macOS откройте терминал и введите: sudo kextcache-аннулировать/
- если ваш kext находится в нестандартном месте, добавьте пользовательский kext путь, например:
sudo kextcache-invalidate /Library/MyApp/MyApp.kext - в меню Apple выберите "перезагрузка".
- после перезагрузки компьютера Mac нажмите и удерживайте клавиши Command (⌘) + R услышав сигнал загрузки. Держите ключи до тех пор пока Появляется логотип Apple, чтобы получить компьютер в режиме восстановления.
- компьютер теперь находится в режиме восстановления. В меню Apple выберите Утилиты -> Терминал
- выполнить команда:csrutil включить
- в меню Apple выберите "перезагрузка".
- теперь ваш kext должен работать..