具有有效签名的 macOS Kext 在第二次安装后被拒绝(high sierra)
macOS Kext with valid signature rejected after 2nd installation (high sierra)
在之前安装过我的产品的机器上,由于 kext 签名被拒绝,第二次安装失败。
我在某些地方看到了同样的错误,例如这里:https://support.eset.com/kb6570,但是即使在恢复模式下清除了 kext_policy table,并在settings --> security 在下次启动时,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/,但也没有任何改变。
更新
现在至少已知该问题的一个可能原因,请参阅下面的更新更新 (2020-04-10)
Kext rejected due to insecure location
是无签名拒绝恕我直言。它在哪里提到签名?当签名是问题时,它是文学上这样说的。对我来说,该消息说该位置不安全。
你检查过/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 后,卷 w/o SIP 支持永远不会安全,否则似乎有一个受信任路径列表,我确信 /Library/Extensions
是这样一个值得信赖的路径,但前提是它的权限设置正确。
要检查您的音量是否支持 SIP,请打开 Disk Utility
应用程序,select 您的启动音量并点击 CMD+I
。一个 window 打开,列出了所有类型的属性,其中应该有一句话:
System Integrity Protection supported : Yes
如果它说不,你肯定会遇到问题,但我不知道是哪个 en-/disable 单个卷的 SIP 是已知的,我只能想象某些文件系统或卷已挂载通过网络可能无法支持 SIP。
更新 (2018-07-31)
就此事联系 Apple,他们给了我以下提示:
Also, in case it is useful, sudo kextcache --clear-staging
allows a user to clear the /Library/StagedExtensions
folder
without booting into recovery.
不确定这是否解决了类似情况下的问题,在此与您分享此信息。
更新 (2020-04-10)
显然 ls -alO@u /Library/Extensions
的输出应该是这样的:
drwxr-xr-x 5 root wheel restricted 160 Oct 24 12:18 .
drwxr-xr-x@ 3 root wheel restricted 96 Mar 25 13:00 ..
com.apple.rootless 25
drwxr-xr-x 15 root wheel restricted 480 Oct 24 12:18 Extensions
然而在一些受影响的系统上它看起来像这样:
drwxr-xr-x 4 root wheel - 128 Apr 6 18:58 .
drwxr-xr-x 3 root wheel - 96 Apr 6 18:56 ..
drwxr-xr-x 13 root wheel - 416 Apr 6 18:57 Extensions
如您所见,缺少 com.apple.rootless
文件属性并且文件夹未标记 restricted
。 请注意,这是启用了 SIP 且用户从未自行禁用它的系统的输出。
很遗憾,无法恢复该属性。该属性的值为:
# xattr -p com.apple.rootless /Library/StagedExtensions
KernelExtensionManagement
但即使禁用了 SIP,以下命令也会失败:
sudo xattr -w com.apple.rootless KernelExtensionManagement \
/Library/StagedExtensions
它returns [Errno 1] Operation not permitted
。因此,如果其他人已在此处发布的解决技巧之一不起作用(并且对于某些人 none 有效!),请准备好重新设置您的系统,因为它已严重损坏,而事实并非如此。这不是你的错,但 Apple 在这里没有提供任何帮助。
此解决方法目前解决了我们在生产中遇到的所有情况:
您应该在恢复模式下加载,禁用 sip,重新启动,使 kext 缓存无效,再次在恢复模式下重新启动,然后重新启用 sip。
详细步骤:
- 从 Apple 菜单select重新启动。
- 当您的 Mac 重新启动时,在听到启动提示音后立即按住 Command(⌘) + R 键。按住按键直到出现 Apple 标志,让电脑进入恢复模式。
- 计算机现在处于恢复模式。从 Apple 菜单 select 实用程序 -> 终端
- 运行命令:
csrutil 禁用
- 从 Apple 菜单,select 重新启动。
- 加载 macOS 后,打开终端并键入:
sudo kextcache -无效/
- 如果您的 kext 位于非标准位置,请添加自定义 kext 路径,例如:
sudo kextcache -invalidate /Library/MyApp/MyApp.kext
- 从 Apple 菜单,select 重新启动。
- 当您的 Mac 重新启动时,按住 Command(⌘) + R 键
听到启动提示音后立即。按住键直到
出现 Apple 标志使计算机进入恢复模式。
- 计算机现在处于恢复模式。从 Apple 菜单 select
实用程序 -> 终端
- 运行 命令:csrutil enable
- 从 Apple 菜单,select 重新启动。
- 现在你的 kext 应该 运行..
我遇到了同样的问题。
/Library/StagedExtensions的标志必须是"restricted":
ls -laO /Library/StagedExtensions/
drwxr-xr-x@ 4 root wheel restricted 128 Nov 15 2017 StagedExtensions
如果没有,请在恢复模式下尝试以下命令:
chflags -R restricted /V*/*/Library/StagedExtensions
重新启动并尝试安装 kext。
在之前安装过我的产品的机器上,由于 kext 签名被拒绝,第二次安装失败。
我在某些地方看到了同样的错误,例如这里:https://support.eset.com/kb6570,但是即使在恢复模式下清除了 kext_policy table,并在settings --> security 在下次启动时,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/,但也没有任何改变。
更新
现在至少已知该问题的一个可能原因,请参阅下面的更新更新 (2020-04-10)
Kext rejected due to insecure location
是无签名拒绝恕我直言。它在哪里提到签名?当签名是问题时,它是文学上这样说的。对我来说,该消息说该位置不安全。
你检查过/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 后,卷 w/o SIP 支持永远不会安全,否则似乎有一个受信任路径列表,我确信 /Library/Extensions
是这样一个值得信赖的路径,但前提是它的权限设置正确。
要检查您的音量是否支持 SIP,请打开 Disk Utility
应用程序,select 您的启动音量并点击 CMD+I
。一个 window 打开,列出了所有类型的属性,其中应该有一句话:
System Integrity Protection supported : Yes
如果它说不,你肯定会遇到问题,但我不知道是哪个 en-/disable 单个卷的 SIP 是已知的,我只能想象某些文件系统或卷已挂载通过网络可能无法支持 SIP。
更新 (2018-07-31)
就此事联系 Apple,他们给了我以下提示:
Also, in case it is useful,
sudo kextcache --clear-staging
allows a user to clear the/Library/StagedExtensions
folder without booting into recovery.
不确定这是否解决了类似情况下的问题,在此与您分享此信息。
更新 (2020-04-10)
显然 ls -alO@u /Library/Extensions
的输出应该是这样的:
drwxr-xr-x 5 root wheel restricted 160 Oct 24 12:18 .
drwxr-xr-x@ 3 root wheel restricted 96 Mar 25 13:00 ..
com.apple.rootless 25
drwxr-xr-x 15 root wheel restricted 480 Oct 24 12:18 Extensions
然而在一些受影响的系统上它看起来像这样:
drwxr-xr-x 4 root wheel - 128 Apr 6 18:58 .
drwxr-xr-x 3 root wheel - 96 Apr 6 18:56 ..
drwxr-xr-x 13 root wheel - 416 Apr 6 18:57 Extensions
如您所见,缺少 com.apple.rootless
文件属性并且文件夹未标记 restricted
。 请注意,这是启用了 SIP 且用户从未自行禁用它的系统的输出。
很遗憾,无法恢复该属性。该属性的值为:
# xattr -p com.apple.rootless /Library/StagedExtensions
KernelExtensionManagement
但即使禁用了 SIP,以下命令也会失败:
sudo xattr -w com.apple.rootless KernelExtensionManagement \
/Library/StagedExtensions
它returns [Errno 1] Operation not permitted
。因此,如果其他人已在此处发布的解决技巧之一不起作用(并且对于某些人 none 有效!),请准备好重新设置您的系统,因为它已严重损坏,而事实并非如此。这不是你的错,但 Apple 在这里没有提供任何帮助。
此解决方法目前解决了我们在生产中遇到的所有情况:
您应该在恢复模式下加载,禁用 sip,重新启动,使 kext 缓存无效,再次在恢复模式下重新启动,然后重新启用 sip。
详细步骤:
- 从 Apple 菜单select重新启动。
- 当您的 Mac 重新启动时,在听到启动提示音后立即按住 Command(⌘) + R 键。按住按键直到出现 Apple 标志,让电脑进入恢复模式。
- 计算机现在处于恢复模式。从 Apple 菜单 select 实用程序 -> 终端
- 运行命令: csrutil 禁用
- 从 Apple 菜单,select 重新启动。
- 加载 macOS 后,打开终端并键入: sudo kextcache -无效/
- 如果您的 kext 位于非标准位置,请添加自定义 kext 路径,例如:
sudo kextcache -invalidate /Library/MyApp/MyApp.kext - 从 Apple 菜单,select 重新启动。
- 当您的 Mac 重新启动时,按住 Command(⌘) + R 键 听到启动提示音后立即。按住键直到 出现 Apple 标志使计算机进入恢复模式。
- 计算机现在处于恢复模式。从 Apple 菜单 select 实用程序 -> 终端
- 运行 命令:csrutil enable
- 从 Apple 菜单,select 重新启动。
- 现在你的 kext 应该 运行..
我遇到了同样的问题。
/Library/StagedExtensions的标志必须是"restricted":
ls -laO /Library/StagedExtensions/
drwxr-xr-x@ 4 root wheel restricted 128 Nov 15 2017 StagedExtensions
如果没有,请在恢复模式下尝试以下命令:
chflags -R restricted /V*/*/Library/StagedExtensions
重新启动并尝试安装 kext。