如何修补FreeBSD的Meltdown和Spectre漏洞

时间:2020-01-09 10:39:33  来源:igfitidea点击:

受Meltdown(CVE-2016-5754),Spectre变体1(CVE-2016-5753)和Spectre变体2(CVE-2016-5715)影响的所有受支持的FreeBSD版本。
如何修补由64位Intel CPU驱动的FreeBSD(推测执行漏洞)服务器上的Meltdown和Spectre漏洞?
许多现代处理器都有一些问题,这些问题允许无特权的攻击者通过利用推测性执行和共享资源来绕过用户内核或内存访问限制。
目前,FreeBSD为Meltdown和Spectre V2发行了补丁。

修补FreeBSD上的Meltdown和Spectre漏洞的步骤

进行备份在执行备份之前,对系统进行备份有多么重要。
这篇文章中列出的大多数动作是在假设它们将由运行bash或任何其他现代shell的root用户执行的前提下编写的。
我仅在FreeBSD 11.x amd64上对其进行了测试。

步骤1查找您当前的FreeBSD版本

# freebsd-version
`11.1-RELEASE-p4`

记下当前版本。

步骤2通过二进制补丁更新易受攻击的系统

执行以下内容以获取,安装和修补Meltdown和Spectre漏洞:

# freebsd-update fetch

输出示例:

Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 11.1-RELEASE from update6.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata patches.. done.
Applying metadata patches... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 755 patches.....10....20....30....40....50....60.......750...
done.
Applying patches... done.
Fetching 10 files... done.
# freebsd-update install

输出示例:

freebsd-update install
Installing updates... done.

步骤3重新启动FreeBSD框

执行以下关闭命令或重新启动命令

# shutdown -r now

或者

# reboot

步骤4验证FreeBSD上的Meltdown漏洞

缓解措施称为页表隔离(PTI)。

PTI在很大程度上将内核和用户模式页表分开,因此,即使在推测执行期间,大多数内核数据也不会被映射并且不可访问。
已修补的内核将自动在Intel CPU上启用PTI。
可以通过执行以下sysctl命令来检查状态:

# sysctl vm.pmap.pti
`vm.pmap.pti: 1`

另一个选择是从此处下载Meltdown攻击工具,如下所示:

# cd /tmp
# git clone https://github.com/dag-erling/meltdown

输出示例:

Cloning into 'meltdown'...
remote: Counting objects: 123, done.
remote: Total 123 (delta 0), reused 0 (delta 0), pack-reused 122
Receiving objects: 100% (123/123), 25.08 KiB | 1.19 MiB/s, done.
Resolving deltas: 100% (73/73), done.

建立它:

# cd /tmp/meltdown
# make

输出示例:

cc -O2 -pipe   -g -std=gnu99 -fstack-protector-strong    -Qunused-arguments  -c meltdown.c -o meltdown.o
cc -O2 -pipe   -g -std=gnu99 -fstack-protector-strong    -Qunused-arguments  -c util.c -o util.o
cc -O2 -pipe   -g -std=gnu99 -fstack-protector-strong    -Qunused-arguments    -c amd64.S -o amd64.o
(cd /tmp/meltdown &&  DEPENDFILE=.depend.mdattack  NO_SUBDIR=1 make -f Makefile _RECURSING_PROGS=t  PROG=mdattack )
echo mdattack.full: /usr/lib/libc.a  >> .depend.mdattack
Warning: Object directory not changed from original /tmp/meltdown
cc -O2 -pipe   -g -MD  -MF.depend.mdattack.mdattack.o -MTmdattack.o -std=gnu99 -fstack-protector-strong    -Qunused-arguments  -c mdattack.c -o mdattack.o
cc -O2 -pipe -g -std=gnu99 -fstack-protector-strong -Qunused-arguments  -o mdattack.full mdattack.o meltdown.o util.o amd64.o  
objcopy --only-keep-debug mdattack.full mdattack.debug
objcopy --strip-debug --add-gnu-debuglink=mdattack.debug  mdattack.full mdattack
(cd /tmp/meltdown &&  DEPENDFILE=.depend.mdcheck  NO_SUBDIR=1 make -f Makefile _RECURSING_PROGS=t  PROG=mdcheck )
echo mdcheck.full: /usr/lib/libc.a  >> .depend.mdcheck
Warning: Object directory not changed from original /tmp/meltdown
cc -O2 -pipe   -g -MD  -MF.depend.mdcheck.mdcheck.o -MTmdcheck.o -std=gnu99 -fstack-protector-strong    -Qunused-arguments  -c mdcheck.c -o mdcheck.o
cc -O2 -pipe -g -std=gnu99 -fstack-protector-strong -Qunused-arguments  -o mdcheck.full mdcheck.o meltdown.o util.o amd64.o  
objcopy --only-keep-debug mdcheck.full mdcheck.debug
objcopy --strip-debug --add-gnu-debuglink=mdcheck.debug  mdcheck.full mdcheck
Warning: Object directory not changed from original /tmp/meltdown

mdcheck工具尝试确定您的系统是否容易受到攻击。
确切的方法因平台而异。
结果由退出代码指示:0表示完全成功,1表示部分成功(通常在虚拟机中看到),2表示完全失败:

# mdcheck
# echo $?

mdattack工具对指定为虚拟地址和长度的指定目标执行Meltdown攻击,并输出结果:

# mdattack

第4步:在FreeBSD上验证Spectre 2漏洞

retpoline缓解Spectre变体2漏洞的修补程序正在开发中,同时我们在Intel CPU上提供了基于IBRS的缓解措施。
减轻IBRS的主要缺点是明显的性能损失。
同样,由于Intel微代码版本的情况,找到有效且稳定的Blob并非易事。

AMD承诺提供相同的机制,但是检测到它在AMD CPU上的存在与在Intel CPU上的存在是不同的。
我们尚未看到具有此功能的任何AMD CPU,因此尚未提交用于在AMD上检测和使用IBRS的假定代码。
同样,似乎AMD规定即使启用了SMEP,用户/内核边界IBRS保护仍然需要返回堆栈缓冲区(RSB)刷新。
在Intel上,仅对于不提供SMEP的CPU才需要。

您可以通过在更新微代码后查看dmesg缓冲区来验证是否已启用IBRS。
如果" CPU功能"报告中出现"结构化扩展功能3 = 0xc000000 <IBPB,STIBP>"行,则将插入IBPB(IBRS屏障)功能,因此系统可以在用户/内核边界上执行缓解措施。
可以使用sysctl hw.ibrs_active验证缓解的当前状态。
如果存在CPU功能并且未通过可调参数/sysctl hw.ibrs_disable禁用CPU功能,则应指示已激活。

# sysctl hw.ibrs_active
# sysctl hw.ibrs_disable

如果您有权访问英特尔微码列表,例如https://newsroom.intel.com/wp-content/uploads/sites/11/2016/04/microcode-update-guidance.pdf,则可以查看该版本以及当前已修补的微代码。
从端口使用sysutils/x86info,加载cpuctl(4)驱动程序(已加载微码),并使用-a开关查看微码版本,其中包括:

# pkg install x86info
# kldload cpuctl
# x86info
# x86info -a