PCIDriverKit 授权检查失败(将 KEXT 迁移到 DEXT)
PCIDriverKit Entitlement check failed (migrate KEXT to DEXT)
kernel: DK: MyDriver-0x100000f45: provider entitlements check failed
kernel: DK: IOUserServer(com.MyDriver-0x100000f45)::exit(Entitlements check failed)
kernel: (com.MyDriver.dext) Kernel requested exit (Entitlements check failed)
我正在尝试使用 PCIDriverKit 创建驱动程序。找不到任何合理的示例代码。
我的问题是我正在尝试访问所有设备,即使我已将它们的掩码正确地放在 Info.plist (0x12345678&0x000000000)
和 com.apple.developer.driverkit = TRUE
和 com.apple.developer.driverkit.transport.pci
权利。
对于大多数设备,我在 macOS 日志中收到上述错误。在我使用的 A KEXT 中,同样的面具工作得很好。
SIP当然是禁用的,系统扩展开发者模式是开启的。
我目前在 XCode 中使用“在本地登录 运行”选项,因为这是一个开发阶段。
如何获得 DEXT 以打开我 Mac 上的所有 PCI 设备?
编辑:
根据 codesign -d --entitlements -
:
,这些是 DEXT 的权利
▒▒qq<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.pci</key>
<array>
<dict>
<key>IOPCIPrimaryMatch</key>
<string>0x12345678&0x00000000</string>
</dict>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
amfid 日志:
amfid: [com.apple.MobileFileIntegrity:amfid] Basic requirement validation failed, error: (null)
amfid: /Library/SystemExtensions/{SOME_GUID}/com.MyDriver.dext/com.MyDriver signature not valid: -67050
对于为什么你的情况出错,我没有 100% 的答案。要在 未修改的 系统上加载 dext,您在对 dext 进行代码签名时肯定需要以下内容:
- 使用 'Developer ID Application' 证书身份签名并进行公证,或者使用 'Apple Developer' 证书签名
- 嵌入式代码签名权利,包括通用 DriverKit 权利、任何特定于系列的权利,以及必要时有关用户客户端访问的权利。
- 来自 Apple 的配置文件匹配:
- 您在 dext 中嵌入的代码签名权利。
- 您用于签署 dext 的代码签名身份的类型和具体实例。
- dext 的应用程序和包 ID。
- 如果使用 Apple Developer 签名身份,则为您将在其上测试 dext 的 Mac 的硬件 ID。
对于本地测试,您可以尝试以下操作来临时解决代码签名问题:
- 禁用系统完整性保护 (SIP)。出于 DriverKit 扩展的目的,这将禁用一些代码签名检查。
- 禁用特定于 DriverKit 的权利检查。这将关闭检查许多特定于家庭的权利。要 禁用 检查, 设置 标志
0x8000
在 dk
内核引导参数中,这是一个位域。请注意,除非您 设置 标志 0x1
,否则 DriverKit 将被完全禁用。因此,请使用 dk=0x8001
禁用 DriverKit 权利检查。
- 禁用 AMFI 检查。如果您尝试声明需要在配置文件中启用的权利,AMFI 通常会终止您的进程。您可以使用
amfi_get_out_of_my_way=1
内核引导参数禁用 AMFI。
显然,您对配置文件的控制有限,因为其中的权利必须得到 Apple 的批准。 (出于这个原因,如果您打算公开发布您的 dext,我通常建议您在 开始全面开发dext,并从 Apple 请求它们。这个过程可能需要几个月的时间。) 因此,虽然知道当您 不 时所需的确切的最小变通方法组合会很有趣有这些配置文件,我还没有详尽地测试过。我意识到这对让您的 dext 尽可能接近发货没有多大帮助,同时仍在等待 Apple 授予缺失的权利。希望有一天我可以系统地探索和记录所有这些。
kernel: DK: MyDriver-0x100000f45: provider entitlements check failed
kernel: DK: IOUserServer(com.MyDriver-0x100000f45)::exit(Entitlements check failed)
kernel: (com.MyDriver.dext) Kernel requested exit (Entitlements check failed)
我正在尝试使用 PCIDriverKit 创建驱动程序。找不到任何合理的示例代码。
我的问题是我正在尝试访问所有设备,即使我已将它们的掩码正确地放在 Info.plist (0x12345678&0x000000000)
和 com.apple.developer.driverkit = TRUE
和 com.apple.developer.driverkit.transport.pci
权利。
对于大多数设备,我在 macOS 日志中收到上述错误。在我使用的 A KEXT 中,同样的面具工作得很好。
SIP当然是禁用的,系统扩展开发者模式是开启的。
我目前在 XCode 中使用“在本地登录 运行”选项,因为这是一个开发阶段。
如何获得 DEXT 以打开我 Mac 上的所有 PCI 设备?
编辑:
根据 codesign -d --entitlements -
:
▒▒qq<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.pci</key>
<array>
<dict>
<key>IOPCIPrimaryMatch</key>
<string>0x12345678&0x00000000</string>
</dict>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>
amfid 日志:
amfid: [com.apple.MobileFileIntegrity:amfid] Basic requirement validation failed, error: (null)
amfid: /Library/SystemExtensions/{SOME_GUID}/com.MyDriver.dext/com.MyDriver signature not valid: -67050
对于为什么你的情况出错,我没有 100% 的答案。要在 未修改的 系统上加载 dext,您在对 dext 进行代码签名时肯定需要以下内容:
- 使用 'Developer ID Application' 证书身份签名并进行公证,或者使用 'Apple Developer' 证书签名
- 嵌入式代码签名权利,包括通用 DriverKit 权利、任何特定于系列的权利,以及必要时有关用户客户端访问的权利。
- 来自 Apple 的配置文件匹配:
- 您在 dext 中嵌入的代码签名权利。
- 您用于签署 dext 的代码签名身份的类型和具体实例。
- dext 的应用程序和包 ID。
- 如果使用 Apple Developer 签名身份,则为您将在其上测试 dext 的 Mac 的硬件 ID。
对于本地测试,您可以尝试以下操作来临时解决代码签名问题:
- 禁用系统完整性保护 (SIP)。出于 DriverKit 扩展的目的,这将禁用一些代码签名检查。
- 禁用特定于 DriverKit 的权利检查。这将关闭检查许多特定于家庭的权利。要 禁用 检查, 设置 标志
0x8000
在dk
内核引导参数中,这是一个位域。请注意,除非您 设置 标志0x1
,否则 DriverKit 将被完全禁用。因此,请使用dk=0x8001
禁用 DriverKit 权利检查。 - 禁用 AMFI 检查。如果您尝试声明需要在配置文件中启用的权利,AMFI 通常会终止您的进程。您可以使用
amfi_get_out_of_my_way=1
内核引导参数禁用 AMFI。
显然,您对配置文件的控制有限,因为其中的权利必须得到 Apple 的批准。 (出于这个原因,如果您打算公开发布您的 dext,我通常建议您在 开始全面开发dext,并从 Apple 请求它们。这个过程可能需要几个月的时间。) 因此,虽然知道当您 不 时所需的确切的最小变通方法组合会很有趣有这些配置文件,我还没有详尽地测试过。我意识到这对让您的 dext 尽可能接近发货没有多大帮助,同时仍在等待 Apple 授予缺失的权利。希望有一天我可以系统地探索和记录所有这些。