热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【技术分享】Linux上的0patch代理:微补丁CVE20169445(含演示视频)

翻译:胖胖秦预估稿费:130RMB投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿在12月,我们终于得到了Linux代理的工作原型。它已经制作了相当一段时间,现在,它处于alpha

http://p8.qhimg.com/t01437673ae9a171dce.png

翻译:胖胖秦

预估稿费:130RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


在12月,我们终于得到了Linux代理的工作原型。它已经制作了相当一段时间,现在,它处于alpha阶段,我们终于可以开始0patching Linux的用户空间代码。Linux代理仍然缺乏Windows代理支持的一些功能,但它已经准备好了。

超过65%的Web服务器运行着不同风格的Unix ,修补高可用性的Linux环境安全漏洞应该一直都不是问题。如果我们以Heartbleed漏洞为例,部署官方补丁所需的时间不仅包括供应商发布补丁所需的时间,还包括DevOps测试和部署它所需的时间。我们的目标是使补丁尽可能小,易于查看,甚至更容易部署,从而避免重新启动服务器的需要,从而大大缩短这一时间。 

当在Ubuntu上开发和测试Linux代理时,我们已经为Heartbleed创建了一个补丁,虽然还有很多易受攻击的服务器,但是它们能马上能得修复。

这个漏洞在去年十一月发表了Chris的博客中。漏洞位于gstreamer的VMnc解码器,它处理VMware屏幕捕获格式。这是一个非常简单的整数溢出并且Chris提供了PoC。

我创建一个Fedora 25虚拟机,然后尝试使用totem,totem是一个原生于Gnome的视频播放器,它在未修补的Fedora 25上使用gstreamer编程框架。使用totem来播放PoC会导致崩溃。Chris对这个bug进行详细分析。他指出在vmncdec.c文件中的vmnc_handle_wmvi_rectangle方法发生了整数溢出,它是gstreamer-plugins-bad包的一部分。你可以在Gihub上查看其源码gstreamers github。Chris 解释发生溢出的原因是,因为用户提供的rect->width和rect->height会与bytes_per_pixel相乘,最终的结果会作为分配图像数据缓冲区的大小。这两个变量都是带符号的32位整数。如果提供足够高的值,则就会发生整数溢出。随后的内存分配(在下面的图像中标记为红色)会产生比图像数据小的缓冲区,这将导致缓冲区溢出。

http://p8.qhimg.com/t01a0c1f7c4255c4f44.png

我反汇编了libgstvmnc.so ,并定位vmnc_handle_wmvi_rectangle函数,在这个函数里高度和宽度相乘,缓冲器被分配(在下面的图像中标记为红色)。

http://p0.qhimg.com/t01647bcd058ed77589.png

当有效比特超过了结果的一半时,IMUL指令会设置进位和溢出标志,所以我的第一个想法是,如果这些标志设置,我们可以返回一个错误指令。补丁位置在上图中以绿色标记。这是我补丁的第一个版本,它应用于IMul的原位置上(绿色标记的上述图像上):

imul   0x30c(%rbx),%edi       //Multiply width and height
jc _bad                       //If CF is set jump to return error
imul   0x314(%rbx),%edi       //Multiply with bytes_per_pixel
jc _bad                       //If CF is set jump to return error
jmp _good                     //If no CF is set continue execution
_bad:
pop %rdi                      //Return error code:
add $0x28,%rsp
mov $0xffffffff,%eax          //Set %eax to -1
pop %rbx
pop %rbp
pop %r12
pop %r13
pop %r14
pop %r15
retq                          //and return
_good:

正如你所看到的,我们在每一个imul指令后都进行检查,如果进位标志被设置,则返回一个错误。 然而,应用补丁后,totem仍然崩溃。在经过一些调试后,我发现,仅仅在vmnc_handle_wmvi_rectangle函数里返回错误是不够的。因此我看了下方的官方补丁  。

http://p6.qhimg.com/t017273319e5d40075c.png

在vmnc_handle_packet函数中可以找到官方补丁 。你可以看到,如果width大于16386或者height大于0x4000,就会返回一个错误。我们的补丁应该和它一样。我反汇编了未修补和已修补的两个版本的 vmnc_handle_packet 函数, 并用Bindiff寻找一个合适的补丁位置。下面的图像代表两个代码的组合视图。绿色代码是由官方补丁添加的。

http://p8.qhimg.com/t01e6ce440da35487aa.png

只有当数据包类型等于TYPE_WMVi 或0x574D5669时, 官方补丁代码才会被执行。在我选择的修补程序位置(红色标记-点击上面的图片可查看大图)的%EDI 寄存器保存数据包类型值,而  %r8w 和%CX 保存着宽度和高度。这是最终生成的补丁:

cmp $0x574d5669,%edi  //If the packet type doesn't equal TYPE_WMVi,
jnz _end              //continue execution
cmp $0x4000,%r8w      //If width is greater than 0x4000,
ja _bad               //jump to return error
cmp $0x4000,%cx       //If height is smaller than 0x4000,
jbe _end              //continue execution, else return error
_bad:
mov $0xffffffff,%eax  //Set %eax to -1
add $0x48,%rsp
pop %rbx
pop %rbp
pop %r12
pop %r13
pop %r14
pop %r15
retq                  //and return
_end:

补丁可以成功地阻止整数溢出和后续的内存分配,使文件可以正常播放,正如官方补丁一样。这里是我们Linux 0patch代理和我们刚刚开发的补丁的短视频。

如你所见,totem在尝试打开PoC时崩溃 。将补丁文件复制到补丁文件夹内并启用补丁后,totem不再崩溃,视频可以正常播放。

开发这个补丁花了大约8小时。这包括反汇编libgstvmnc.so ,尝试了开发了一个错误的补丁,分析了官方补丁并打上正确的补丁。这是一个相对简单的补丁,但我的目的是想展示我们的Linux代理及其功能,这几乎与我们在Windows上正在做的一样。

我们正在不断努力扩展支持的操作系统平台,所以我们有一天可以为需要它的每个人带来0patch


推荐阅读
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
author-avatar
余小刚玩guitarvp_996
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有