查看原文
其他

FreeBSD BSDiff 被曝高危内存损坏漏洞,时隔4年终修复

X41D-sec 代码卫士 2022-04-06
 聚焦源代码安全,网罗国内外最新资讯!
编译:奇安信代码卫士团队
Bsdiff 和 bspatch 分别是构建二进制文件和响应的打补丁工具,它们能够有效地为应用程序更新机制应用二进制补丁。


漏洞概述

Colin Percival 公司的 bsdiff 工具版本4.3中的 bspatch 被指含有一个高危的内存损坏漏洞 (CVE-2020-14315)。因处理外部输入时检查不足,导致攻击者绕过完整性检查,写出动态分配的缓冲区边界。
尽管打补丁的流程通常和完整性以及真实性检查相关联,但如果真实性检查是在打好补丁后发生的,那么攻击者如能传播恶意补丁,则可在运行 bspatch 代码的进程中引起堆损坏。根据攻击者在恶意补丁文件处理之前和处理过程中控制和调整堆状态的能力,可以实现远程代码执行的后果。一名匿名作者已经在2016年发布关于 FreeBSD bspatch 在32位架构实现的 PoC 视频中进行了演示:https://gist.github.com/anonymous/e48209b03f1dd9625a992717e7b89c4f#file-freebsd-txt-L1192
这个问题 (CVE-2014-9862) 最初是由一名匿名研究人员报告的,存在于“Apple OS X 10.11.6 之前版本和其它产品”中的 bsdiff bspatch 中,多个项目已在2016年解决这个问题,包括:
  • 安卓
https://android.googlesource.com/platform/external/bsdiff/+/4d054795b673855e3a7556c6f2f7ab99ca509998%5E%21/#F0
  • ChromiumOS
https://bugs.chromium.org/p/chromium/issues/detail?id=372525
  • FreeBSD
https://www.freebsd.org/security/advisories/FreeBSD-SA-16:25.bspatch.asc

首轮修复方案通过负控制值阻止了攻击活动。
但可造成整数溢出并造成攻击者界外写入的庞大的控制值问题并未修复。FreeBSD 随后发布补丁,通过其它安全加固措施修复了余下的问题。遗憾的是,多数 bspatch 副本中并未导入该修复方案。
值得注意的是,托管在bsdiff 网站 (https://www.daemonology.net/bsdiff/)上 bsdiff 4.3 版本仍然提供了bspatch.c 的副本,该副本仍因负控制值和庞大的控制值易受攻击。我们检查过的所有 bsdiff 的发行版都基于 Linux 发行版,其中一些应用了最初发布的部分修复方案。
简要分析

在计算缓冲区差值和写操作的大小时检查不充分,导致堆缓冲溢出问题。
while(newpos<newsize) { /* Read control data */ for(i=0;i<=2;i++) { lenread = BZ2_bzRead(&cbz2err, cpfbz2, buf, 8); if ((lenread < 8) || ((cbz2err != BZ_OK) && (cbz2err != BZ_STREAM_END))) errx(1, "Corrupt patch\n"); ctrl[i]=offtin(buf); };
/* Sanity-check */ if(newpos+ctrl[0]>newsize) errx(1,"Corrupt patch\n"); /* Read diff string */ lenread = BZ2_bzRead(&dbz2err, dpfbz2, new + newpos, ctrl[0]);
ctrl [0]取负值或者取值足够大到能溢出newpos+ctrl[0] 时,将会通过完整性检查,允许操作通过BZ2_bzRead()溢出new缓冲区边界。值得注意的是BZ2_bzRead() 会将ctrl[0]从64位的off_t 截断为32位int


在满足一定的利用条件时,攻击者如能交付特殊构造的补丁文件,则能够获得远程代码执行能力。
PoC 地址:
https://github.com/x41sec/advisories/blob/master/X41-2020-006/x41-2020-006-bspatch-poc.patch


修复方案


修复方案参见:
  • https://www.freebsd.org/security/advisories/FreeBSD-SA-16:25.bspatch.asc

  • https://www.freebsd.org/security/advisories/FreeBSD-SA-16:29.bspatch.asc

目前不存在任何缓解措施。


时间线


  • 2016-07-21:CVE-2014-9862 发布

  • 2016-07-25:FreeBSD-SA-16:25.bspatch 发布部分补丁

  • 2016-10-10:FreeBSD-SA-16:29.bspatch 发布完整补丁

  • 2020-07-02:X41 团队发未在上游或代码的重要分支中修复该漏洞,或者未正确修复该漏洞。

  • 2020-07-06:Colin Percival 和 distros@ 收到通知

  • 2020-07-09:漏洞公开


 


推荐阅读

Linux 和 FreeBSD 被曝多个 DoS 漏洞

开源操作系统FreeBSD修复缓冲溢出漏洞



原文链接
https://www.x41-dsec.de/lab/advisories/x41-2020-006-bspatch/





题图:Pixabay License


本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。


奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

    点个 “在看” ,加油鸭~



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存