Note: In August of 2018, Lenovo joined the Linux Vendor Firmware Service, which enables installing firmware updates from within Linux. You should use fwupdmgr
to update the various firmware components of your ThinkPad, and the WinPE hackery below is no longer required.
My original post follows below, it might still be applicable to other manufacturers.
Lenovo only provides Windows installers for Intel Management Engine (ME) firmware updates. Since ME occasionally has embarrassing security issues, this is pretty bad for Linux users and everyone else not using Windows. However, it is possible to install these updates using Windows PE (WinPE). But the process of doing so isn’t particularly well-documented. The following steps should apply to any new-ish ThinkPad. I have personally used it on an X1 Carbon 5th-gen (2017). I’ll assume you’re using Linux; it’s probably easy enough to adapt the instructions for BSD etc.
First, you need to download a Windows 10 installer image from Microsoft’s download page. Don’t worry, we’re not going to install it. Windows 10 is required for newer machines (Kaby Lake and newer, for laptops that’s the Core i3/i5/i7 7xxx series), on older machines you can also use that old Windows 7 image you still have lying around somewhere. Mount the installer image:
sudo mount -o loop,ro Win10_1709_English_x64.iso /mnt
Next, you’ll have to download the Intel ME firmware update from Lenovo’s support page. Enter your model number, go to the “Drivers & Software” page, and select “Chipset”. From the various updates available you’ll have to download two. First, get the “Intel Management Engine 11.8 Firmware for Windows” (version number might differ for your machine). This is the update you actually want to install. However, you need Intel’s Management Engine Interface (MEI) driver to install the update, and WinPE doesn’t ship those. So you also need to download the “Intel Management Engine 11.7 software for Windows” (again, the version number might differ), which contains the driver.
Once you’ve got the firmware and software packages, unpack them with
wine. When running them, don’t forget to de-select
the option to immediately run the update at the end—that won’t work. You can
check that the unpacking worked by looking at your ~/.wine/drive_c/DRIVERS/WIN
directory. It should contain two directories, ME
and AMT
. cd
into the
latter and extract SetupME.exe
with cabextract SetupME.exe
(you might have
to install the cabextract
tool using your package manager). The only thing you
need is the HECI_REL
directory, which contains the MEI driver—you can delete
the rest.
Now you’re ready to create your WinPE image! Do so with the following command,
which you can install from the wimtools
package in Debian. You might require
additional tools, which mkwinpeimg
it will tell you about.
mkwinpeimg --windows-dir=/mnt \
--overlay=$HOME/.wine/drive_c_DRIVERS winpe.img
This will take a few seconds, and you will end up with a file called winpe.img
which will be a bit above 300MB (or 400MB if you didn’t delete the AMT driver
setup files before). You can write this file to a USB thumb drive, substituting
your USB drive’s device ID for sdx
. This will irrecoverably delete all
files on your thumb drive, so backup your files before doing this!
sudo dd if=winpe.img of=/dev/sdx bs=1M
Wait for this to complete, then reboot your ThinkPad and choose the USB drive as
boot device (press F12 during the UEFI/BIOS screen). After a minute or so,
you’ll see a Windows command prompt. Move into the ME driver directory with cd
/WIN/AMT/HECI_REL/win10
(assuming you used a Windows 10 image, use win7
if
you used Windows 7) and execute drvload heci.inf
to load the MEI driver. Now
move to the firmware update installer directory with cd /WIN/ME
and run the
updater with MEUpdate.cmd
. Wait for a bit until it’s finished. If it complains
about not finding shutdown.exe
at the end, that’s fine. Reboot by clicking the
close button at the top right of the command prompt window (yup, really). Done!
tl;dr: You can get the short version at https://news.ycombinator.com/item?id=1574415.