Journal Mise à jour du firmware d'un Lenovo Thinkpad moderne…

Posté par . Licence CC by-sa
58
1
août
2017

Sommaire

Bonsoir nal

Il y a quelques semaines, je fus victime d'un odieux larcin, mon PC portable pro a été dérobé (cher voleur, tu peux faire un git push de mes devs ferroviaires ?). Donc nouveau PC portable pro, installation de Debian, et toute la phase rigolote de sécurisation de la machine.
Je vous passe l'installation de Debian (LUKS, SELinux, nftables…), on va se concentrer ici sur les firmwares.

1er firmware : le microcode du processeur. 

Comme vous le savez peut-être, les processeurs x86 ne parlent plus directement x86 dans le silicium, mais utilisent un microcode, avec une couche de traduction des instructions, un ordonnanceur pour l'exploitation efficace des différentes parties du processeur, tout un bazar pour la gestion de l'énergie… Et tout ça, c'est un logiciel, le microcode, qu'il convient de mettre à jour pour corriger des bugs (lien bug ocaml) ou des failles de sécurité (trouver un lien).
Sous debian, cette étape est facile : apt install intel-microcode puis un reboot, il met à jour le microcode et on n'en parle plus.

Donc passons à la partie rigolote : l'UEFI…

2ème firmware : l'UEFI d'un Thinkpad X270

Historiquement, la mise à jour d'un BIOS non EFI imposait de passer par un DOS pour mettre à jour la puce. C'était pénible, il fallait trouver un freedos et le booter… Avec l'UEFI, c'est supposé devenir plus simple, avec un binaire efi à démarrer ou mieux encore l'utilisation du nouveau protocole qui permet à l'OS d'envoyer un blob à l'UEFI pour une application au prochain redémarrage. Ce nouveau protocole est encore très expérimental, donc j'ai choisi de l'ignorer et de rester sur la méthode «old school».
Donc direction le site de Lenovo, je saisis le modèle du PC portable (X270 20HN), je vais dans les téléchargements, section BIOS/UEFI, et là 2 choix : un binaire windows ou une ISO de CD bootable. Bon, le binaire windows on va pas essayer, prenons l'ISO. La machine n'a pas de lecteur de CD (ça serait physiquement impossible), donc cela doit être comme une ISO de distribution Linux et être «universel».

Aller chercher les fichiers

Je télécharge le fichier ISO, je fais un file dessus… et surprise !

snoopy@peanuts2:~/Downloads$ file r0iuj11wd.iso 
r0iuj11wd.iso: ISO 9660 CD-ROM filesystem data 'R0IET40W' (bootable)

Où est la surprise ? Un disque «universel» sera identifié avec un secteur de boot DOS/MBR comme suit :

snoopy@peanuts2:~/Downloads$ file debian-9.0.0-i386-xfce-CD-1.iso 
debian-9.0.0-i386-xfce-CD-1.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 6908, 608 sectors

Peut-être est-ce un CD bootable moderne avec des fichiers EFI alors ?

$ find /mnt/disc/
/mnt/disc/

Que de quoi ? J'ai une ISO de 21MB vide ?

Pour comprendre un peu ce qu'il se passe, plongeons dans les années 90. Pour rendre un CD bootable à l'époque, il a été décidé de mettre dans une sorte de piste à part dans l'ISO une image de disque qui elle sera démarrée par le BIOS. Il s'agit de l'extension El Torito. Mais où se cache donc cette image disque dans l'ISO ? Demandons à isoinfo.

$ isoinfo -d -i r0iuj11wd.iso 
CD-ROM is in ISO 9660 format
System id: 
Volume id: R0IET40W
Volume set id: 
Publisher id: 
Data preparer id: 
Application id: NERO BURNING ROM VER 12,5,5,0
Copyright File id: 
Abstract File id: 
Bibliographic File id: 
Volume set size is: 1
Volume set sequence number is: 1
Logical block size is: 2048
Volume size is: 10934
El Torito VD version 1 found, boot catalog is in sector 20
Joliet with UCS level 3 found
NO Rock Ridge present
Eltorito validation header:
    Hid 1
    Arch 0 (x86)
    ID 'NERO BURNING ROM VER 12'
    Key 55 AA
    Eltorito defaultboot header:
        Bootid 88 (bootable)
        Boot media 4 (Hard Disk Emulation)
        Load segment 7C0
        Sys type 6
        Nsect 1
        Bootoff 1B 27

Voilà, là on commence à avoir des informations. Une ISO est constituée de secteurs de 2048 octets, et isoinfo nous dit que l'offset de l'image de boot est 0x1B soit 27.
Donc demandons à notre ami dd.

$ dd if=r0iuj11wd.iso of=boot.img skip=27 bs=2048
10907+0 records in
10907+0 records out
22337536 bytes (22 MB, 21 MiB) copied, 0.0174814 s, 1.3 GB/s
$ file boot.img 
boot.img: DOS/MBR boot sector; partition 1 : ID=0x4, active, start-CHS (0x0,1,1), end-CHS (0x14,63,32), startsector 32, 42976 sectors

Ha ben voilà qui est mieux. On a une table de partition DOS, on pourrait la copier sur une clé USB et la démarrer.
Ou avoir la flemme d'aller chercher une clé USB. Continuons donc.

$ /sbin/fdisk -l boot.img
Disk boot.img: 21.3 MiB, 22337536 bytes, 43628 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start   End Sectors Size Id Type
boot.img1  *       32 43007   42976  21M  4 FAT16 <32M

On a une partition, donc on peut l'extraire…

$ dd if=boot.img of=boot_inner.img skip=32 bs=512
43596+0 records in
43596+0 records out
22321152 bytes (22 MB, 21 MiB) copied, 0.0442729 s, 504 MB/s
$ file boot_inner.img 
boot_inner.img: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "MSDOS5.0", reserved sectors 2, root entries 512, sectors 40960 (volumes <=32 MB) , Media descriptor 0xf8, sectors/FAT 159, sectors/track 32, heads 64, hidden sectors 32, serial number 0x3a1aeaaa, unlabeled, FAT (16 bit)

Parfait, on a une image que l'on peut monter… Que contient-elle ?

$ tree .
├── EFI
│   └── BOOT
│       └── BootX64.efi
├── Flash
│   ├── 406E3.PAT
│   ├── 406E8.PAT
│   ├── 506E8.PAT
│   ├── 806E9.PAT
│   ├── BCP.evs
│   ├── BootX64.efi
│   ├── NoDCCheck_BootX64.efi
│   ├── R0IET40W
│   │   ├── $0AR0I00.FL1
│   │   └── $0AR0I00.FL2
│   ├── README.TXT
│   └── SHELLFLASH.EFI
└── System Volume Information
    ├── IndexerVolumeGuid
    └── WPSettings.dat

Démarrer le bon fichier…

Le fichier EFI/BOOT/BootX64.efi est le fichier cherché par défaut par l'UEFI sur un disque. Très bien. On note qu'il est identique au fichier Flash/BootX64.efi.
Copions le dossier Flash dans la partition /boot/efi, et redémarrons et passons sur la console grub…

Dans grub, j'exécute donc les commandes suivantes (et vive la complétion) :

set root='(hd0,gpt1)'
chainloader /Flash/BootX64.efi
boot

Et l'outil de mise à jour de Lenovo se lance, victoire !

À noter pour les plus joueurs : a priori, les fichiers .PAT, .FL1 et .FL2 devraient pouvoir être envoyés dans le firmware par le protocole de mise à jour UEFI, mais… je n'ai pas envie de cramer ma machine pro, donc je n'essaye pas pour le moment…

Amusez bien tout le monde, et n'oubliez pas vos mises à jour ! Dans le lot, j'ai quand même eu des mises à jour de l'Intel ME (qui a connu des failles critiques cette année), des correctifs pour l'UEFI qui pouvait fuiter son mot de passe au démarrage… bref, que du bonheur.

  • # Les liens

    Posté par . Évalué à 5 (+3/-0).

    Toutes mes excuses, j'ai oublié les liens…

    Pour le bug OCaml/Intel : http://ocamllabs.io/general/2017/06/26/IntelHyperThreadBug.html

    Pour les failles de sécu, on en a vu plusieurs, comme la memory sinkhole de 2015.

  • # fwupd

    Posté par (page perso) . Évalué à 10 (+15/-0).

    fwupd est un projet (utilisé entre autre par la logithèque GNOME) qui permet de mettre à jour des firmwares de façon fiable et sécurisée. Je sais que Dell, Intel et Logitech ont d'ores et déjà rejoint le projet. Si ce n'est pas encore le cas de Lenovo, ça vaudrait sans doute le coup de les contacter pour leur en parler. Plus il y aura de linuxiens à en faire la demande, plus on aura de chance de faire bouger les choses.

    De voire apparaître la mise à jour du firmware dans sa logithèque et de pouvoir l'installer d'un simple clique en même temps que le dernier Firefox, c'est tout de même plus sympa et bien plus accessible pour le commun des mortels (ou les grosses feignasses :)

    Pour plus d'infos, Richard Hughes a écrit plusieurs articles à ce sujet sur son blog.

    • [^] # Re: fwupd

      Posté par . Évalué à 10 (+8/-0).

      Carrément. D'autant que la part d'utilisateurs de Linux dans les clients de Thinkpad doit être énorme comparée à d'autres fabriquants !

      • [^] # Re: fwupd

        Posté par . Évalué à 3 (+3/-1).

        Oui les Thinkpad sont de très bonnes machines et fonctionnent très bien sous Linux

        • [^] # Re: fwupd

          Posté par (page perso) . Évalué à 5 (+4/-0).

          Je confirme, je suis devenu fan au boulot et depuis à la maison j'équipe tout le monde en thinkpad, j'en ai 4 au total, X230, X220, X200 et un vieux X60, je les achète d'occas sur ebay à un prix dérisoire (200€ pour des versions haut de gamme à 2000€ neuf).

          http://www.funix.org mettez un manchot dans votre PC

          • [^] # Re: fwupd

            Posté par . Évalué à 1 (+2/-3). Dernière modification le 02/08/17 à 13:26.

            J'ai pris un vintage : un Thinkpad T43, Modele 2669.

            Processeur : Intel Pentium M à 1.86 GHz (compatible PAE)
            Mémoire : 512 Mo de DDR2-666
            Disque dur : 40 Go 5400 RPM (UDMA33, PATA)
            GPU : ATI Mobility Radeon X300
            Écran : TFT Mat 1024x768
            Chipset sonore : AC'97
            Chipset carte mère : Intel 915PM Express
            USB2, WiFi, lecteur optique : lecteur DVD + graveur CD tout ça.
            Batterie fonctionnelle, OS fourni.

            Le tout à… 30 € TTC !

            Prévu (et livré avec) pour Windows XP.

            Upgrade matériel :
            - 2GB (2x1) DDR2 666 PC2-6400 (j'ai dû enlever le clavier pour accéder au second emplacement. Pas fun quand une visse est usée et courbée et ne voulait plus bouger aux trois quarts de son retirage…)
            - Écran avec pixels morts remplacé
            - Nettoyage (il puait le tabac) avec un produit adéquat du clavier et de la coque.
            - Disque dur remplacé par un Hitachi Desktar de 80 Gio à 7200 RPM en miniIDE (IDE 2"5)

            Upgrade logiciel :
            - On passe à Windows 7 x86 SP1.

            99% des pilotes sont trouvés automatiquement via Windows Update (lecteur d'empreintes, chipset USB, chipset audio, bidule TPM, WiFi, Bluetooth, modem, …).
            Quelques uns, tels que l'ethernet, fonctionnaient déjà de base.

            Seul le pilote graphique a été difficile à trouver. Il est uniquement disponible sur le site de Lenovo. Il est prévu pour Windows Vista, mais Windows 7 reste rétrocompatible avec WDDM 1.0. Ce qui permet à l'accélération graphique de fonctionner, ouf ! :)

            Maintenant je cherche à lui trouver une utilité, mais je l'adore déjà.

            Il est petit, léger, beau, rapide (relativement, hein), et beaucoup plus solide que mon ASUS N56VV (beaucoup plus récent et onéreux, dont le lecteur optique est beaucoup moins fiable d'ailleurs).

            Bon y'a juste le BIOS qui gueule un peu au démarrage car il ne reconnaît plus le firmware du disque dur (donc la protection contre les chocs du HDD ne fonctionne plus), mais j'ai jamais fait tomber mes laptops de toute façon. Et je l'utilise qu'occasionnellement.

            En fait, je l'utilise déjà pour développer, et pour jouer à des vieux jeux Megadrive (Phantasy Star IV, surtout). :D

            "Quand certains râlent contre systemd, d'autres s'attaquent aux vrais problèmes." (merci Sinma !)

            • [^] # Re: fwupd

              Posté par . Évalué à 7 (+6/-0).

              Le tout à… 30 € TTC !

              Prévu (et livré avec) pour Windows XP.

              Upgrade matériel :
              - 2GB (2x1) DDR2 666 PC2-6400 (j'ai dû enlever le clavier pour accéder au second emplacement. Pas fun quand une visse est usée et courbée et ne voulait plus bouger aux trois quarts de son retirage…)
              - Écran avec pixels morts remplacé
              - Nettoyage (il puait le tabac) avec un produit adéquat du clavier et de la coque.
              - Disque dur remplacé par un Hitachi Desktar de 80 Gio à 7200 RPM en miniIDE (IDE 2"5)

              Donc ça t'as coûté combien en tout ?

              • [^] # Re: fwupd

                Posté par . Évalué à 4 (+2/-0). Dernière modification le 02/08/17 à 20:45.

                En tout, dans les 100 €.

                • 30 € TTC l'ordi.
                • 40 € TTC mémoire et disque dur.
                • 35 € TTC l'écran.

                Pour un Thinkpad légendaire, c'est pas cher payé. :)

                (aujourd'hui sur ebay ça va à ~100 € le Thinkpad T43 qui fonctionne mais avec maximum 1 Go de RAM seulement, un disque dur de 40 Go à 5400 RPM, et avec un clavier QWERTY, et le modèle utilise un GPU Intel largement moins puissant, et une version en anglais de Windows. Argh !).

                "Quand certains râlent contre systemd, d'autres s'attaquent aux vrais problèmes." (merci Sinma !)

            • [^] # Re: fwupd

              Posté par (page perso) . Évalué à 4 (+3/-0).

              niveau solidité, je me souviens d'un commercial d'IBM à l'époque (avant le rachat par lenovo) qui vantait les mérites de la coque en magnésium, fibre de carbone renforcée et autre titane, accéléromètre, etc. on pourrait croire à un blabla commercial comme un autre, sauf qu'il a jeté par terre son portable en fonctionnement et il a sauté dessus à pieds joints (le portable était fermé) ! Le truc fonctionnait encore !
              C'est vrai que c'est pas le portable le plus élégant, mais il est limite durci, j'ai pu le tester à mes dépends plusieurs fois en le faisant tomber n fois sans que ça le perturbe. Fort heureusement lenovo a gardé la même philosophie.

              http://www.funix.org mettez un manchot dans votre PC

              • [^] # Re: fwupd

                Posté par . Évalué à 3 (+2/-0).

                Par contre, le revêtement de leurs écrans se rayent très facilement avec… les touches du clavier. C'est fâcheux car autant lâcher un thinkpad et marcher dessus n'est pas une chose que je fais couramment, autant fermer l'écran et transporter mon portable c'est quasi tout le temps.

                Certes les zones rayées sont invisibles dés lors que la partie de l'écran qu'elles recouvrent affichent une images lumineuse.
                Mais c'est comme un pixel mort, une fois vu, il devient le nez au milieu de la figure.

    • [^] # Re: fwupd

      Posté par . Évalué à 1 (+0/-0).

      Ce matin j'ai pu mettre à jour en un clic et en 5 secondes à peine le firmware logitech clavier/souris

  • # C'est bien ton processeur a des gros seins

    Posté par . Évalué à 10 (+16/-0).

    silicone

    silicium

  • # Comportement standard

    Posté par (page perso) . Évalué à 4 (+2/-0).

    Le fichier EFI/BOOT/BootX64.efi est le fichier cherché par défaut par l'UEFI sur un disque. Très bien. On note qu'il est identique au fichier Flash/BootX64.efi.

    Il me semble que c'est ce qui est prévu par la norme, ou en tout cas le standard de facto. Tu mets tous tes fichiers dans ton répertoire, et tu copies ton bootloader dans EFI\BOOT. C'est ce que fait Ubuntu également, de mémoire.

    • [^] # Re: Comportement standard

      Posté par . Évalué à 3 (+2/-0).

      Oui, c'est le comportement attendu.

      Un peu de documentation à ce sujet ici : https://www.happyassassin.net/2014/01/25/uefi-boot-how-does-that-actually-work-then/ (en gros, cet article est une explication détaillée de la spécification UEFI)

      What the firmware will actually do when trying to boot in this way is reasonably simple. The firmware will look through each EFI system partition on the disk in the order they exist on the disk. Within the ESP, it will look for a file with a specific name and location. On an x86-64 PC, it will look for the file \EFI\BOOT\BOOTx64.EFI. What it actually looks for is \EFI\BOOT\BOOT{machine type short-name}.EFI

  • # Bien au contraire ...

    Posté par (page perso) . Évalué à 8 (+7/-0).

    Je vous passe l'installation de Debian (LUKS, SELinux, nftables…)

    Au contraire, même si ce n'est pas le thème de ton article, j'aurais bien aimé voir comment tu installes SELinux, si tu as rencontré des erreurs avec les policies par défaut (par rapport au document sur le wiki Debian), si ton gestionnaire de fenêtres a posé des soucis, etc.

    Pareil, côté nftables, as-tu un retour d'expérience (installation, utilisation) ?

    • [^] # Re: Bien au contraire ...

      Posté par . Évalué à 6 (+4/-0).

      Je ferai ça dans un prochain journal alors, quand j'aurai commencé à vraiment exploiter SELinux pour castrer des applications dangereuses…
      Par rapport à nftables : it works… Et ça fait plaisir d'avoir un ensemble qui soit lisible et qui gère à la fois IPv4 et IPv6.

      • [^] # Re: Bien au contraire ...

        Posté par . Évalué à 2 (+2/-1).

        A la lecture du mot "nftables", je me suis demandé kekseksa, alors j'ai cherché un peu et je suis tombé sur article sur le sujet : https://linuxfr.org/news/nftables-successeur-diptables

        Diantre, une syntaxe à la pf pour la configuration du firewall sous linux, en remplacement d'iptables, mais c'est merveilleux ! Alors je vérifie sur ma machine (debian/buster), et la c'est le drame : nftables est bien candidat a l'installation, mais ce qui est présent par défaut c'est iptables…

        Je reviens sur l'article cité qui m'a vendu du rève, et je m'apercois qu'il date de 2009 :-(
        Il y a presque 10 ans, on annonçait donc le remplaçant d'iptables, mais il n'est pas installé par défaut sur ma machine aujourd'hui ? C'est la faute à ma debian qui n'est pas à jour, ou bien nftables c'est pas encore prêt pour le desktop ?

        • [^] # Re: Bien au contraire ...

          Posté par . Évalué à 5 (+3/-0).

          Beaucoup d'outils dépendent encore d'iptables. iptables et nftables ne peuvent pas être utilisés en même temps.
          Et la stabilité de nftables est très récente, c'est que depuis Debian stretch que le paquet est dans stable.
          Mais effectivement, ça promet de changer beaucoup de choses, il était plus que temps !

  • # whitelist

    Posté par (page perso) . Évalué à 3 (+3/-0).

    Un peu en rapport mais pas trop, j'ai un thinkpad E330 et ce genre de machine possède un bios avec des whitelist pour les cartes wifi. Ce qui signifie que si l'on veut changer la carte mais qu'elle n'est pas dans cette liste le bios lance une erreur 1802 au démarrage.

    En farfouillant un peu, il existe un forum ou on peut faire une demande de "mod bios", soit une version modifié de bios sans cette liste. Et voila, j'ai pu changer la carte avec l'aide de freedos et ce bios modifié.

    Si quelqu’un à la raison de ces listes.

    • [^] # Re: whitelist

      Posté par (page perso) . Évalué à 4 (+2/-0).

      Réglementation sur les ondes type FCC etc. j'imagine ? Les machines sont testées avec du matos (wifi et 3G) qui est précis et autorisé et qui ne doit pas permettre de faire n'importe quoi niveau ondes.

      Effectivement : https://news.ycombinator.com/item?id=4770992

      https://www.reddit.com/r/thinkpad/comments/4ca5ga/why_is_lenovo_whitelisting_wifi_cards_to_what_end/

      the practice originated with IBM, who is known for going to extreme lengths to avoid civil liabilities. the idea is if they allow someone to modify the firmware to broadcast on channels inappropriate to the nation in which the laptop sold, they could conceivably be held liable for allowing the violation to occur. it's not unique to IBM or thinkpad.

      Apparemment ce n'est plus le cas depuis le X250 cependant.

      « Je vois bien à quels excès peut conduire une démocratie d'opinion débridée, je le vis tous les jours. » (Nicolas Sarkozy)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.