2 points par GN⁺ 18 일 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • 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 AppleInternal de 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_quota dans le code d’initialisation hv_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= et hv_apple_isa_vm_quota=, ce dernier permettant de redéfinir la limite de VM
  • Dans le noyau de release, l’usage de l’argument hypervisor est restreint par la vérification AppleInternal de System Integrity Protection (SIP)
    • L’argument hv_apple_isa_vm_quota n’est pris en compte que si le drapeau CSR_ALLOW_APPLE_INTERNAL est activé
    • Pour contourner cela, la méthode utilisée consiste à démarrer le noyau de développement d’Apple (Development Kernel)

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 utilise kmutil create pour 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 development permet 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
    1. Désactiver System Integrity Protection (csrutil disable)
    2. Lever la restriction sur les arguments de démarrage (bputil --disable-boot-args-restriction)
    3. Spécifier la collection de noyau personnalisée (kmutil configure-boot)
    4. Définir les arguments de démarrage (transmis via la commande nvram)
      • kcsuffix=development : démarrage sur le noyau de développement
      • hypervisor=0x1 : activation de fonctions spéciales de la pile de virtualisation
      • hv_apple_isa_vm_quota=0xFF : définit le nombre maximal de VM à 255
  • Après redémarrage, on peut vérifier l’application des réglages avec sysctl kern.osbuildconfig et nvram 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_quota a été ajouté avec la pile Virtualization à partir de macOS 12 Monterey
    • Dans les versions ultérieures, y compris macOS Sonoma, la vérification AppleInternal est toujours présente
    • Cela confirme qu’Apple maintient plusieurs fonctions privées à l’intérieur de XNU

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-security ou 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_quota via une extension du noyau (kext)
      • Explorer la possibilité de lever la limite sans démarrer sur un noyau de développement
  • 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.

Aucun commentaire pour le moment.