近些天为了激活笔记本上的WoL功能,对UEFI Bios有了一些了解。新一代的UEFI规范实现了很多先进的功能,比如图形界面,文件系统支持,扩展性,secure boot,secure flash(capsule)等,而这些原本是为了使用户体验更好,使用更方便、安全的的功能,被厂商念错了经。M$利用secure boot功能限制电脑安装其他的操作系统,甚至安装了Ubuntu一类的系统,连进一步安装各种驱动都要受到限制(这个以后有空再写,大体上可以通过PK自签名绕过)。LEN0V0利用UEFI的高级功能,在用户重装系统后自动重新安装联想组件,本来无可厚非,无奈国内版本重装的**@*%#¥……,而且前段时间被爆出了安全漏洞。穑cure flash使得刷新固件变得异常困难,完美的刷写只有破解Signed Capsule的结构或者使用SPI烧录。更不用提白名单限制用户安装新网卡、前段时间闹得沸沸扬扬的ME漏洞、EC漏洞等等。总之UEFI真正的强大功能能否被实现,还得看各个厂商的看(wei)法(suo)和态(cheng)度(du)了。。。真正的安全不是厂商觉得安全,而是让用户觉得安全,对自己使用的东西有完全的掌控。
平台:lenovo g50-80笔记本,UEFI BIOS,Insyde BIOS
结论:
1. 使用insydeflash工具,一般情况下执行的是secure flash,即直接将升级文件写入内存区域(或ESP分区),形成capsule,然后发SMI指令,设置更新的变量,然后S3 reboot,重启之后系统直接进入升级模式,由现有的BIOS执行capsule校验,(可能包括Insyde QA检验和Manufacturer Trust检验,类似RSA签名),校验通过则由现有BIOS里面的flash程序刷新,顺带可能会刷新EC(内部微处理器固件,比如主板驱动,功能键驱动等)、ME(CPU微码)、FV(不知道什么东西)。这期间可能会刷新系统变量,比如原有的BIOS设置,secure boot的key,slic,根证书等等。这就导致了BIOS修改之后无法刷入,BIOS校验程序在FLASH里面,破解校验程序本身就需要刷入新的BIOS,而不破解校验则根本无法刷入新BIOS,这样的安全性挺高。详情参见UEFI capsule规范,以及Intel的开发指南,以及Tinocore的源代码。(https://www.techinferno.com/index.php?/forums/topic/1870-flash-modified-biosuefi-which-are-digitally-signed-circumvent-secure-flash/ )
2. BIOS-MOD网站上给出了recover的方式,通过在开机时按几个键,让电脑进入BIOS修复模式,从USB读取固件,自己恢复。这里的关键是如何进入恢复模式、如何得到正确的恢复文件。经过摸索,G50机型的恢复键是:关机,插上电池,插上装有恢复文件的U盘,拔下AC -> 按住Fn+R不要松手,插AC -> 按电源键开机,电源灯闪烁红色,松开所有按键。但是正确的恢复文件格式、文件名没有找到。估计应该是使用官方给出的升级文件bioss.fd,也许应该重命名成Broadwell.fd(从PcdPeim模块里找到,见 https://www.bios-mods.com/bios-recovery/insyde-bios-recovery/#comment-1457 ),拔下所有U盘之外的USB设备。。。。。。不过一直没有成功,原因未知。而且据说可以恢复,恢复过程也需要校验,这种方式可能也无法绕过校验。
3.直接刷写flash,这种方式包括在DOS下用fpt tool(INTEL官方的刷写程序,开发UEFI时的工具,可以直接刷写),在EFI SHELL下用一些工具刷写,DOS下用其他工具刷写等,这些方式都是通过某些特殊的指令直接读写flash芯片,有很大的危险性,一方面这些读写指令有些可能被锁定,很容易刷写失败。另一方面由于不了解flash里面的结构(厂家不可能公开),很容易刷成砖(比如写错区域,或者把启动区代码刷掉了等等)。。。这些都会造成不可修复的soft-brick。。。。。不保修的。一般也无法个人修复,除非你有SPI工具。
4.SPI方式,利用烧录器直接刷芯片,危险性同上,但是由于以SPI方式,flash里面的内容可以进行完全读写,可以先读出来做一个完全备份。出现问题总能修复。好处在于利用夹具可以直接夹在芯片引脚上,无需拆焊,很方便。这也是一般的主板维修方法。(https://www.bios-mods.com/forum/Thread-TUTORIAL-how-to-unlock-hidden-tabs-in-lenovo-g50-80-Mod-lenovo-g50-80-bios )
但是!FLASH芯片很容易刷坏的,一旦坏了就比较麻烦了。另外稳定的SPI工具也不便宜。而且,对于EC和CPU ME,似乎没有办法直接刷写。Nvram(保存系统变量的位置)暂时不清楚在哪。
5.直接读写变量,实现部分修改的目的。这也是在BIOS-MOD论坛上推荐的办法。大体是在DOS下或者EFI SHELL下直接读写NVRAM,达到越过BIOS界面直接修改系统功能的目的。问题同3,某些读写指令可能被锁住了。至于如何确定某个变量的储存位置,需要解析UEFI BIOS文件,有些工具可以实现,包括MDL和BIOS-MOD论坛里的各种工具、脚本,比如Universal IFR Extractor等,大致是通过解析UEFI BIOS文件找到变量储存位置(UEFI文件很容易解析,有固定的格式 ,工具能解析大部分格式,但有的厂商的UEFI BIOS解析不出来)。(https://www.bios-mods.com/forum/Thread-READ-FIRST-Access-Advanced-settings-through-EFI-shell )。其中的BOOTX64.EFI其是通用的UEFI SHELL,也可以通过Tinocore的对应源代码自己编译。
以上就是几种刷写Insyde BIOS的方法。处理Insyde BIOS的具体细节可以google或者在BIOS-MOD以及MDL论坛等去找。下一篇继续。