Sur une machine sur laquelle mon produit a été installé auparavant, une deuxième installation échoue en raison du rejet de la signature kext.
J'ai constaté à certains endroits la même erreur, par exemple ici: https://support.eset.com/kb6570 , cependant, même après avoir effacé la table kext_policy en mode de récupération et approuvé manuellement le kext dans les paramètres > sécurité au prochain démarrage, le kext semble toujours être non approuvé.
Par exemple, l'exécution de kextutil fournit les éléments suivants:
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:
etat d'approbation de kext dans la base de données:
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
Validation du certificat 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
J'ai également essayé de supprimer / Library/StagedExtensions/Library/, mais cela n'a rien changé non plus.
Cette solution de contournement résout actuellement tous les cas rencontrés en production:
Vous devez charger en mode de récupération, désactiver sip, redémarrer, invalider le cache kext, redémarrer à nouveau, puis réactiver sip.
Étapes détaillées:
J'ai eu le même problème.
Le drapeau de/Library/StagedExtensions doit être "restreint":
ls -laO /Library/StagedExtensions/
drwxr-xr-x @ 4 roues motrices restreintes 128 15 novembre 2017 StagedExtensions
Sinon, essayez ci-dessous cmd à partir du mode de récupération:
chflags -R restricted /V*/*/Library/StagedExtensions
Redémarrez et essayez d'installer le kext.
Kext rejected due to insecure location
n'est pas un rejet de signature IMHO. Où dit-il quelque chose à propos de la signature? Quand la signature est le problème, le littéraire le dit. Pour moi, ce message indique que l'emplacement n'est pas sécurisé.
Avez-vous vérifié les autorisations d'accès de /Library/Extensions
? Si les autorisations sont trop ouvertes, le système refusera de charger les extensions de noyau avec kextload
ou kextutil
. Le dossier /Library/Extension
doit appartenir à root:wheel
et personne, à l'exception de root
, ne peut écrire dans ce dossier.
Il en va de même pour les autorisations d'accès des extensions, qui sont des ensembles (.kext
) et donc des répertoires. Ils doivent appartenir à root:wheel
et seule la variable root
peut être autorisée en écriture.
Si vous regardez le code source de macOS (oui, macOS est largement OpenSource, les gens ont tendance à l'oublier), vous voyez que cette erreur est renvoyée à un seul endroit:
if (authOptions->requireSecureLocation) {
if (!kextIsInSecureLocation(theKext)) {
OSKextLogCFString(NULL,
kOSKextLogErrorLevel | kOSKextLogValidationFlag,
CFSTR("Kext rejected due to insecure location: %@"),
theKext);
result = false;
goto finish;
}
}
Maintenant, kextIsInSecureLocation()
est très simple:
Boolean
kextIsInSecureLocation(OSKextRef theKext)
{
NSURL *url = (__bridge NSURL *)OSKextGetURL(theKext);
if (!url) {
return false;
}
return pathIsSecure(url.path);
}
Et ainsi est 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;
}
Donc, avec SIP désactivé, tout chemin est sécurisé, avec SIP activé, les volumes sans support SIP ne sont jamais sécurisés, sinon il semble y avoir une liste de chemins sécurisés et je sais pour Assurez-vous que /Library/Extensions
est un tel chemin de confiance, mais uniquement si son autorisation est définie correctement.
Pour vérifier si votre volume prend en charge SIP, ouvrez l'application Disk Utility
, sélectionnez votre volume de démarrage et appuyez sur CMD+I
. Une fenêtre s'ouvre qui répertorie tous les types de propriétés et parmi celles-ci, une devrait être:
System Integrity Protection supported : Yes
Si la réponse est non, vous auriez certainement un problème, mais je ne sais pas lequel, car aucun moyen d’en activer/désactiver SIP pour des volumes individuels est connu, j’imagine seulement que certains systèmes de fichiers ou certains volumes montés sur le système réseau peut ne pas être en mesure de prendre en charge SIP.
Contactant Apple à ce sujet, ils m'ont donné le conseil suivant:
De plus, au cas où cela serait utile,
Sudo kextcache --clear-staging
permet à un utilisateur d'effacer le dossier/Library/StagedExtensions
sans démarrer dans la récupération.
Je ne sais pas si cela résout le problème dans des cas similaires, il suffit de partager cette information avec vous ici.