• macOS : se faire un SIP sur mesure avec le shell UEFI

     

    Note préalable : ce tutoriel ne concerne que les machines avec processeur Intel dont la version de macOS est supérieure ou égale à 10.11 (El Capitan).

    Le SIP (System Integrity Protection) a été introduit en 2015 avec macOS El Capitan pour protéger l'intégrité du système. Il a l'avantage de mettre le système à l'abri de modifications indésirables, mais il faut parfois le désactiver pour utiliser certains logiciels, comme VMware Fusion ou Workstation.

    On se retrouve alors sans protection, car les seules instructions proposées par Apple sont csrutil enable et csrutil disable. C'est du on/of. Il y a bien un paramètre --without pour exclure certaines protections, mais il est plus ou moins obsolète, et ne permet pas de régler aussi finement le SIP que la méthode que je vais vous présenter.

    Elle consiste à installer un shell UEFI sur la partition EFI du disque contenant le système sur lequel vous voulez démarrer. Ce peut être un disque interne ou externe, du moment qu'il y a un système macOS dessus le disque est éligible.

    Avant toute chose il vous faut choisir la valeur du SIP que vous voulez mettre. Voici une liste des valeurs les plus courantes, le 0x indique que ce sont des valeurs hexadécimales :

    0x10 : SIP activé. C'est la valeur par défaut. Seul le flag allow_apple_internal est actif.
    0x7f : SIP désactivé. C'est la valeur que vous obtenez quand vous faites un csrutil disable.

    Les valeurs qui suivent représentent un SIP partiellement actif, avec apple_allow_internal inactif :

    0x1 : autoriser les extensions non signées (allow_untrusted_keys).
    0x2 : autoriser tous les systèmes de fichiers (allow_unrestricted_fs).
    0x800 : allow_unauthenticated_root. Flag inutile avant Big Sur (macOS 11).
    0x3 : autoriser 0x01 + 0x02 (allow_untrusted_kexts + allow_unrestricted_fs).
    0x803 : 0x01 + 0x02 + 0x800.

    Avec apple_allow_internal activé :

    0x11 : allow_untrusted_keys + allow_apple_internal.
    0x12 : allow_unrestricted_fs + allow_apple_internal.
    0x810 : allow_unauthenticated_root + allow_apple_internal.
    0x13 : autoriser 0x01 + 0x02 + 0x10.
    0x813 : 0x01 + 0x02 + 0x800 + 0x10.

    En général 0x803 est suffisamment permissif pour installer tous les logiciels, tout en conservant un bon niveau de sécurité. Si votre système est antérieur à Big Sur 0x3 suffira.

    Commencez par créer un dossier UEFI dans votre dossier Téléchargements. Puis téléchargez le shell UEFI pour machines Intel et placez-le dans le dossier UEFI.

    Dans l'application Terminal, exécutez la commande :

    diskutil list | grep EFI

    Cela va lister toutes les partitions de type EFI, et uniquement celles-là avec leur identifiant. Par exemple, j'obtiens ceci sur ma machine, avec un seul disque externe branché :

    1: EFI ⁨EFI 209.7 MB disk0s1
    1: EFI ⁨EFI⁩ 209.7 MB disk2s1

    disk0s1 c'est l'identifiant de l'EFI du disque interne principal du Mac. disk2s1 c'est celui de mon dd externe. Chez vous ce sera aussi disk0s1 pour votre disque interne, mais les valeurs des autres disques seront peut-être différentes. Si vous avez plusieurs dd externes branchés, vous aurez plus de lignes.

    Si vous n'êtes pas sûr de quel disque est concerné par chaque EFI, utilisez simplement la commande diskutil list et vous aurez tous les types de partitions.

    Une fois que vous saurez sur quel EFI vous voulez installer le shell UEFI vous aurez à modifier les deux scripts que vous allez créer pour remplacer disk2s1 par la valeur qui vous intéresse. Ne peuvent être mentionnées que des partitions de type EFI.

    Une partition de type EFI s'appelle généralement EFI, tout simplement, mais ce n'est pas obligatoire. Par exemple elle pourrait s'appeler ESP ou REFIND. Si c'est votre cas, il faudra remplacer toutes les occurences de /Volumes/EFI par /Volumes/ESP ou /Volumes/REFIND dans les deux fichiers scripts que vous allez créer. Vous allez aussi créer un fichier .nsh mais il n'est pas concerné.

    Créez avec TextEdit le premier script contenant les instructions suivantes :

    cd ~/Downloads/UEFI/
    sudo diskutil mount disk2s1
    mkdir -p /Volumes/EFI/EFI/BOOT/BACKUP
    bless --folder /Volumes/EFI/EFI/BOOT --label "UEFI Shell"
    if [ -e /Volumes/EFI/EFI/BOOT/bootx64.efi ] ; then
      mv /Volumes/EFI/EFI/BOOT/bootx64.efi /Volumes/EFI/EFI/BOOT/BACKUP/bootx64.efi
    fi
    cp Shell_Full.efi /Volumes/EFI/EFI/BOOT/bootx64.efi
    cp startup.nsh /Volumes/EFI/EFI/BOOT/
    dot_clean -m /Volumes/EFI/EFI/BOOT
    sudo diskutil unmount disk2s1

    Remplacez les deux occurences de disk2s1 (2è et dernière ligne) par l'identifiant qui vous intéresse, ainsi que toutes les occurences de /Volumes/EFI si votre partition ne s'appelle pas EFI puis sauvegardez le fichier sous le nom create_UEFI.command et placez-le dans le dossier UEFI. Si Textedit a suffixé le fichier par .txt, enlevez le .txt.

    Créez avec TextEdit un nouveau fichier contenant les instructions suivantes :

    @echo -off
    set -v file csr.bin
    if "%StartupDelay%" == "" then
      set StartupDelay 0
    endif
    set -v found nothing
    for %a in "" 1 2 3 4 5 6
      for %b in 0 1 2 3 4 5 6 7 8 9 a b c d e f
        if not %found% == startup then
          if exist fs%a%b:\EFI\BOOT\startup.nsh then
            fs%a%b:
            cd \EFI\BOOT
            if exist %file% then
              dmpstore -l %file%
            endif
            set -v found startup
          endif
        endif
        if %found% == startup then
          if exist fs%a%b:\System\Library\CoreServices\boot.efi then
            alias -v macos fs%a%b:\System\Library\CoreServices\boot.efi
            set -v device fs%a%b:
            set -v found boot
            goto BREAK
          endif
        endif
      endfor
    endfor
    alias -v macos "echo ^"Missing macOS^""
    :BREAK
    macos
    ver
    ver -s

    Enregistrez ce fichier sous le nom startup.nsh et placez-le dans le dossier UEFI. Là aussi, si TextEdit a rajouté un .txt à la fin retirez-le.

    Créez enfin un dernier fichier texte avec le contenu suivant :

    #!/bin/bash
    if [[ $0 != "$BASH_SOURCE" ]]; then
      bash "$BASH_SOURCE" "$@"
    fi
    trap exit ERR
    main() {
    local "file=/Volumes/EFI/EFI/BOOT/csr.bin"
    local "unmount=no" "value=0x803" operand data
    sudo diskutil mount disk2s1
    unmount="yes"
    for operand in "$@"; do
      value="$((value|($operand)))"
    done
    printf -v value "%08X" "$value"
    echo "Setting to $value"
    data="240000006300730072002d006100630074006900760065002d0063006f00"
    data+="6e0066006900670000001061437c2aabbb4ba880fe41995c9f8207000000"
    data+="04000000${value:6}${value:4:2}${value:2:2}${value::2}"
    xxd -r -p - "$file" <<<"$data"
    if [[ $unmount == yes ]]; then
      sleep 0.1
      diskutil unmount disk2s1
    fi
    }
    main "$@"

    Remplacez les deux occurences de disk2s1 par l'identifiant de votre EFI, remplacez le 0x803 qui est sur la 8è ligne par la valeur de SIP qui vous intéresse, et enfin remplacez l'unique occurence de /Volumes/EFI par le bon nom si votre partition ne s'appelle pas EFI, puis sauvegardez le fichier dans le dossier UEFI sous le nom mkcsrfile.command.

    Dans Terminal, tapez la commande :

    chmod +x ~/Downloads/UEFI/*.command

    pour rendre les deux fichiers .command exécutables.

    Si vous avez effectué tout ce qui précède, vous devriez avoir dans le dossier UEFI les éléments suivants :

    create_UEFI.command
    mkcsrfile.command
    Shell_Full.efi
    startup.nsh

    Double-cliquez à présent sur create_UEFI.command, attendez que le script soit exécuté, puis double-cliquez sur le fichier mkcsrfile.command.

    C'est terminé. Vous êtes prêt à redémarrer en appuyant sur la touche alt et à choisir la partition EFI qui s'affiche en plus des disques, en principe elle devrait s'appeler "UEFI Shell".

    Vous n'aurez à démarrer en appuyant sur la touche alt qu'une seule fois, une fois que le shell UEFI est exécuté la valeur du SIP est conservée dans la NVRAM. Le redémarrage sur le shell UEFI ne sera nécessaire que si vous faites un reset de la NVRAM ou que vous vouliez modifier la valeur du SIP en relançant la commande mkcsrfile.command avec une valeur de SIP différente.

    Dans le Terminal vous pouvez à tout moment voir le statut du SIP en tapant :

    csrutil status

     


    Tags Tags : , , ,
  • Commentaires

    Aucun commentaire pour le moment

    Suivre le flux RSS des commentaires


    Ajouter un commentaire

    Nom / Pseudo :

    E-mail (facultatif) :

    Site Web (facultatif) :

    Commentaire :