在之前安装了我的产品的机器中,由于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
我也尝试删除 / Library / StagedExtensions / Library / ,但它也没有改变任何内容。
答案 0 :(得分:5)
我有同样的问题。
/ Library / StagedExtensions的标志必须为“受限”:
ls -laO /Library/StagedExtensions/
drwxr-xr-x @受限制的4个根轮128 2017年11月15日StagedExtensions
如果没有,请从恢复模式尝试以下cmd:
chflags -R restricted /V*/*/Library/StagedExtensions
重新启动并尝试安装kext。
答案 1 :(得分:1)
此解决方法当前可以解决我们在生产中遇到的所有情况:
您应该以恢复模式加载,禁用sip,重新启动,使kext缓存无效,再次在恢复中重新启动,然后重新启用sip。
详细步骤:
答案 2 :(得分:0)
Kext rejected due to insecure location
不是签名拒绝恕我直言。关于签名,在哪里说?当签名是问题时,它的文学家就是这么说的。对我来说,该消息表明该位置不安全。
您是否检查了/Library/Extensions
的访问权限?如果权限太开放,系统将拒绝使用kextload
或kextutil
加载内核扩展。文件夹/Library/Extension
必须归root:wheel
所有,root
之外的其他人都不能写入该文件夹。
对于扩展名的访问权限也是如此,扩展名是捆绑包(.kext
),因此实际上是目录。它们必须归root:wheel
所有,并且只有root
可以拥有写权限。
如果您查看macOS的源代码(是的,macOS是广泛的OpenSource,人们往往会忘记这一点),您会发现此错误仅在一个地方引发:
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
应用,选择启动卷,然后点击CMD+I
。将打开一个窗口,其中列出了所有类型的属性,并且其中应该有一种说法:
System Integrity Protection supported : Yes
如果拒绝,您肯定会遇到问题,但是我不知道哪种方法可以启用/禁用单个卷的SIP,我只能想象某些通过网络安装的文件系统或卷可能无法支持SIP。
关于此事与苹果公司联系,他们给了我以下提示:
如果有用,
sudo kextcache --clear-staging
允许用户清除/Library/StagedExtensions
文件夹 无需启动恢复。
不确定在类似情况下是否可以解决问题,只需在此处与您共享此信息即可。