From a9f937c6d2c04fe0fc950665e59d8dfafc341299 Mon Sep 17 00:00:00 2001 From: t_feng Date: Fri, 31 Jul 2020 20:14:58 +0800 Subject: [PATCH] BootHole analysis --- content/zh/blog/t_feng/2020-07-31-boothole.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 content/zh/blog/t_feng/2020-07-31-boothole.md diff --git a/content/zh/blog/t_feng/2020-07-31-boothole.md b/content/zh/blog/t_feng/2020-07-31-boothole.md new file mode 100644 index 0000000..bcf5dec --- /dev/null +++ b/content/zh/blog/t_feng/2020-07-31-boothole.md @@ -0,0 +1,71 @@ ++++ +title = "BootHole漏洞分析" +date = "2020-07-31" +tags = ["漏洞分析", "CVE"] +archives = "2020-07" +author = "t.feng" +summary = "BootHole漏洞分析" ++++ + +# BootHole漏洞分析 +## 漏洞描述 +UEFI Secure Boot是由UEFI Forum主导,用于保护引导过程免受攻击的安全模式。为了防止引导组件被恶意篡改,它通过校验引导过程中所有组件的签名来保障引导阶段的安全性。GRUB2支持在efi文件中注入签名,参与安全启动的校验流程。但是,由Eclypsium公司发现GRUB2引导程序存在漏洞,导致使用UEFI Secure Boot的系统容易被恶意攻击者利用,进而跳过安全校验流程,修改引导过程或引导的内核及其他恶意动作。(CVE-2020-10713)。 +## 漏洞分析 +- 经过分析,该漏洞在解析grub.cfg文件时在grub2内部发生了一个缓冲区溢出的漏洞。grub.cfg文件位于EFI分区中,因此只要拥root权限的攻击者,可以跳过修改shim或者grub2引导程序文件的前提下,修改grub.cfg。由于缓冲区溢出使得攻击者可以在UEFI引导阶段获得执行任意代码的权限,从而跳过原有的安全校验流程。 +- 当前之所以可以造成解析grub.cfg文件溢出后可以造成攻击者拥有执行任意代码权限的原因是因为:这个缓冲区溢出覆盖了词法分析器Flex在堆中的部分字段,这些字段包括多个内部解析元素,拥有任意读写能力。所以,会造成攻击者获得执行任意代码的权限并篡改引导过程。 +### 代码分析 +GRUB2提供的YY_FATAL_ERROR函数并没有停止执行或者退出,仅仅是向串口打印一个错误并返回调用的函数。所以会导致yy_flex_strncpy将长度超大的字符串复制到yytext中从而造成缓冲区溢出。 +``` +#define YY_FATAL_ERROR(msg) \ + do { \ + grub_printf (_("fatal error: %s\n"), _(msg)); \ + } while (0) +``` +``` +#define YY_DO_BEFORE_ACTION \ + yyg->yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + if ( yyleng >= YYLMAX ) \ + YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ + yy_flex_strncpy( yytext, yyg->yytext_ptr, yyleng + 1 , yyscanner); \ + yyg->yy_c_buf_p = yy_cp; +``` +## 影响性分析 +1. 系统上已经存在的攻击者能够劫持引导过程并在系统启动期间执行恶意代码。 +2. 使用此漏洞可以绕过利用UEFI安全启动的系统。 +## 规避措施 +无 +## 解决方案 +- 下载openEuler发布的最新版本grub2软件包: + - [漏洞SA](https://cve.openeuler.org/#/infoDetails/openEuler-SA-2020-1038) + - [aarch64架构](https://repo.openeuler.org/openEuler-20.03-LTS/update/aarch64/Packages/) + - [x86_64架构](https://repo.openeuler.org/openEuler-20.03-LTS/update/x86_64/Packages/) +- 查看当前系统已安装的grub2软件包: + - rpm -aq | grep grub2 +- 找到下载的grub2包中与系统对应的软件包,置于同一目录并执行升级: + - rpm -Uvh grub2-*.rpm +- 升级完成之后,进入/boot/efi/EFI/openEuler目录下,重新生成grub.cfg文件: + - grub2-mkconfig -o grub.cfg + +## FAQ +1. Legacy模式是否受此漏洞影响? +Legacy模式属于非安全启动,无漏洞的触发场景,但是代码本身存在漏洞,建议修复。 + +2. Legacy模式如何修复漏洞? +需要按照解决方案中的步骤进行软件包升级。但是,在第4步执行完软件包升级之后,需要重新安装bootloader。如,启动盘是/dev/sda,则需要执行(Legacy模式与UEFI模式grub.cfg文件路径存在差异): +grub2-install /dev/sda +grub2-mkconfig –o /boot/grub2/grub.cfg + +3. UEFI模式+非安全启动是否受此漏洞影响? +UEFI模式+非安全启动无漏洞的触发场景,但是代码本身存在漏洞,建议修复。 + +4. UEFI模式+安全启动是否受此漏洞影响? +会触发漏洞场景,跳过安全启动限制,影响系统安全性、可用性、机密性,强烈建议修复。 + +5. 普通用户是否可以修改grub.cfg文件 +普通用户无修改权限,仅root用户可以修改grub.cfg文件。 + +6. 其他的组件:shim,kernel,bios等是否要同步升级? +OSV厂商如果使能了安全启动,受此漏洞影响,强烈建议升级grub2软件包修复此漏洞。同时,需要吊销原来安全启动的证书,更新shim、grub2、fwupdate、kernel这些包的签名。如果不更新安全启动证书,系统回退到原来受影响的grub2版本后,仍受此漏洞影响。 -- Gitee