第二次安装后拒绝有效签名的macOS Kext(高山脉)

时间:2018-06-17 13:47:44

标签: macos macos-high-sierra kernel-extension

在之前安装了我的产品的机器中,由于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 / ,但它也没有改变任何内容。

3 个答案:

答案 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。

详细步骤:

  1. 从Apple菜单中选择“重新启动”。
  2. 随着Mac重启,听到启动提示音后,立即按住Command(⌘)+ R键。按住键,直到出现Apple徽标,计算机才能进入“恢复”模式。
  3. 计算机现在处于恢复模式。从Apple菜单中选择实用程序->终端
  4. 运行命令: csrutil禁用
  5. 从Apple菜单中,选择重新启动。
  6. 加载macOS后,打开终端并输入: sudo kextcache -invalidate /
  7. 如果您的kext位于非标准位置,请添加自定义的kext路径,例如:
    sudo kextcache -invalidate /Library/MyApp/MyApp.kext
  8. 从Apple菜单中,选择重新启动。
  9. 在Mac重新启动时,按住Command(⌘)+ R键 听到启动铃声后立即响起。按住键,直到 Apple徽标似乎使计算机进入了恢复模式。
  10. 计算机现在处于恢复模式。从Apple菜单中选择 实用程序->终端程序
  11. 运行命令: csrutil enable
  12. 从Apple菜单中,选择重新启动。
  13. 现在您的kext应该可以运行了。

答案 2 :(得分:0)

Kext rejected due to insecure location不是签名拒绝恕我直言。关于签名,在哪里说?当签名是问题时,它的文学家就是这么说的。对我来说,该消息表明该位置不安全。

您是否检查了/Library/Extensions的访问权限?如果权限太开放,系统将拒绝使用kextloadkextutil加载内核扩展。文件夹/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。

更新(2018-07-31)

关于此事与苹果公司联系,他们给了我以下提示:

  

如果有用,sudo kextcache --clear-staging   允许用户清除/Library/StagedExtensions文件夹   无需启动恢复。

不确定在类似情况下是否可以解决问题,只需在此处与您共享此信息即可。