- Sur macOS basé sur Apple Silicon, Virtualization.framework limite à un maximum de 2 VM macOS exécutables, conformément à une clause du contrat de licence macOS
- L’analyse montre que cette limite est gérée par la variable privée
hv_apple_isa_vm_quotaà l’intérieur du noyau XNU, et qu’elle peut être redéfinie via des arguments de démarrage - Pour contourner la vérification
AppleInternalde System Integrity Protection, une procédure consistant à compiler et démarrer un noyau de développement (Development Kernel) est utilisée - Après configuration, il a été possible d’exécuter jusqu’à 9 VM macOS simultanément dans UTM, Viable, Parallels, etc.
- Le fait qu’Apple ait laissé dans le noyau une fonction de redéfinition de la limite de VM est notable, et ouvre la voie à de futures améliorations via des outils d’automatisation ou des extensions du noyau
Processus de suppression de la limite de 2 VM macOS sur Apple Silicon
- Sur les Mac Apple Silicon, lors de l’exécution de machines virtuelles macOS avec Virtualization.framework, il existe une limite à 2 instances maximum
- Cette limite est définie conformément à la clause 2.B.iii du contrat de licence logicielle macOS (SLA)
- Cette clause autorise l’exécution d’au maximum 2 instances de macOS pour le développement, les tests, l’utilisation de macOS Server et un usage personnel non commercial
- L’analyse montre que cette limite est implémentée non pas en espace utilisateur mais dans une zone privée du noyau XNU
- Le noyau Intel ne contient pas le même code, et c’est la famille de fonctions
hv_vm_*du noyau Apple Silicon qui prend en charge la pile de virtualisation - La variable
hv_apple_isa_vm_quotadans le code d’initialisationhv_init()gère le nombre de VM, avec incrémentation et décrémentation lors de la création et de la suppression des VM - Le noyau accepte les arguments de démarrage
hypervisor=ethv_apple_isa_vm_quota=, ce dernier permettant de redéfinir la limite de VM
- Le noyau Intel ne contient pas le même code, et c’est la famille de fonctions
- Dans le noyau de release, l’usage de l’argument
hypervisorest restreint par la vérificationAppleInternalde System Integrity Protection (SIP)- L’argument
hv_apple_isa_vm_quotan’est pris en compte que si le drapeauCSR_ALLOW_APPLE_INTERNALest activé - Pour contourner cela, la méthode utilisée consiste à démarrer le noyau de développement d’Apple (Development Kernel)
- L’argument
Compilation d’une collection de noyau de développement
- Il faut télécharger et installer le Kernel Debug Kit (KDK) depuis le site Apple Developer
- Le KDK doit correspondre exactement à la build macOS de l’hôte, sinon des erreurs de liaison du noyau et des kexts, ainsi que des échecs de démarrage, peuvent se produire
- Après avoir vérifié l’architecture du noyau avec la commande
uname, on utilisekmutil createpour générer une collection de noyau de développement (VirtualMachine.kc)- L’exemple utilise macOS 14.0 (build 23A5301h) et le noyau T6020
- L’option
--variant-suffix developmentpermet de sélectionner le noyau de développement, en incluant plusieurs dépôts d’extensions système
Configuration du démarrage sur le noyau de développement
- Après avoir éteint le Mac, il faut démarrer en mode de récupération (recoveryOS) puis effectuer les réglages suivants dans le terminal
- Désactiver System Integrity Protection (
csrutil disable) - Lever la restriction sur les arguments de démarrage (
bputil --disable-boot-args-restriction) - Spécifier la collection de noyau personnalisée (
kmutil configure-boot) - Définir les arguments de démarrage (transmis via la commande
nvram)kcsuffix=development: démarrage sur le noyau de développementhypervisor=0x1: activation de fonctions spéciales de la pile de virtualisationhv_apple_isa_vm_quota=0xFF: définit le nombre maximal de VM à 255
- Désactiver System Integrity Protection (
- Après redémarrage, on peut vérifier l’application des réglages avec
sysctl kern.osbuildconfigetnvram boot-args
Résultat de l’exécution de plusieurs VM
- Une fois la configuration terminée, des tests ont été menés avec des solutions basées sur Virtualization.framework comme UTM, Viable et Parallels
- Sur un MacBook Pro M2 Pro, il a été possible d’exécuter 9 VM macOS simultanément
- Le système restait encore utilisable à un niveau acceptable pour les tests
Moment d’ajout de la fonctionnalité et structure interne
- L’argument de démarrage
hv_apple_isa_vm_quotaa été ajouté avec la pile Virtualization à partir de macOS 12 Monterey- Dans les versions ultérieures, y compris macOS Sonoma, la vérification
AppleInternalest toujours présente - Cela confirme qu’Apple maintient plusieurs fonctions privées à l’intérieur de XNU
- Dans les versions ultérieures, y compris macOS Sonoma, la vérification
Points d’attention lors des mises à jour de l’OS
- L’utilisation d’une collection de noyau personnalisée désactive les mises à jour automatiques de l’OS
- Des erreurs surviennent après mise à jour, il faut donc restaurer la collection de noyau par défaut
- En mode de récupération, on peut revenir au noyau par défaut en générant une nouvelle politique de démarrage avec
bputil - Par exemple :
bputil --full-securityou l’option--disable-boot-args-restriction
Conclusion et pistes d’amélioration
- L’implémentation par Apple de la limite de VM a été identifiée, et une méthode non officielle mais fonctionnelle de suppression de cette limite a été validée expérimentalement
- Il est notable que, même sans documentation officielle de l’équipe Virtualization, Apple ait laissé dans le noyau une fonction de redéfinition de la limite de VM
- Pistes d’amélioration envisagées
- Développement d’un outil d’automatisation pour la compilation de KC et la configuration du démarrage
- Génération automatique de collections de noyau de développement selon l’hôte et prise en charge de la configuration en mode de récupération
- Implémentation d’une fonction de redéfinition de la variable
hv_apple_isa_vm_quotavia une extension du noyau (kext)- Explorer la possibilité de lever la limite sans démarrer sur un noyau de développement
- Développement d’un outil d’automatisation pour la compilation de KC et la configuration du démarrage
- Le prochain sujet de recherche portera sur la possibilité d’enregistrer les VM Apple Silicon dans DEP et de redéfinir le numéro de série
Aucun commentaire pour le moment.