【网络安全研究进展系列】PatchScope:基于内存对象访问序列的补丁差异性比对方法

编者按:2022年5月,由网络安全研究国际学术论坛(InForSec)汇编的《网络安全国际学术研究进展》一书正式出版。全书立足网络空间安全理论与实践前沿,主要介绍网络和系统安全领域华人学者在国际学术领域优秀的研究成果,内容覆盖创新研究方法及伦理问题、软件与系统安全、基于模糊测试的漏洞挖掘、网络安全和物联网安全等方向。全书汇总并邀请了近40篇近两年在网络安全国际顶级学术议上发表的论文(一作为华人),联系近百位作者对研究的内容及成果进行综述性的介绍。从即日起,我们将陆续分享《网络安全国际学术研究进展》的精彩内容。

本文根据论文原文“PatchScope: Memory Object Centric Patch Diffing”整理撰写,原文发表于ACM CCS 2020。作者是赵磊(武汉大学),朱云聪(武汉大学),明江(得克萨斯大学艾灵顿分校),张羿辰(武汉大学),张浩天(得克萨斯大学艾灵顿分校),尹恒(加州大学河滨分校)。

一、基本背景

补丁是修复软件漏洞的重要机制,安全补丁可以说是安全分析的结晶,天然携带了安全相关的信息,除了其自身带来的安全影响,安全补丁还可以揭示对应漏洞的细节。利用这些信息可以做很多事情,例如可以用于评估补丁是否有效阻断了原来的漏洞,甚至会不会带来新的安全威胁;通过提取补丁的特征,也可以用来辅助挖掘“n-day”漏洞和构造类似类型的安全补丁。

然而,补丁所携带的信息往往不能够轻易获取,目前常见的两个信息渠道为软件供应商与漏洞数据库。但软件供应商在更新公告或补丁公告中有时会有意无意地掩盖补丁细节,而不会直接揭露具体修改的内容和修改的理由,并且由于新版本发布往往伴随着大量业务逻辑的更新,这使得获取以二进制发布的软件中指定补丁的信息更加困难;而漏洞公告和一些漏洞相关报告往往也只是对漏洞的基本信息进行描述,其他附加信息通常以链接形式给出,但漏洞的根本原因和对应的补丁信息的链接存在缺失的现象,甚至不同漏洞数据库对同一漏洞的描述与提供的信息都不一致。

针对这一现象,有研究人员尝试使用二进制比对的技术来揭示补丁的信息。简单来讲,在此场景下,通过比较未打补丁的程序和打补丁的程序,根据得到的差异信息来分析补丁携带的信息。

二、大规模的补丁实证调研

为了更好地理解补丁究竟会做什么、执行怎样的操作,以及对代码带来怎样的影响,本文基于2000多个公开的补丁信息展开了大规模的实证调研。

本文大体将调研的结果细分为了9类,如图1所示。但概括来看,基本可以分为三大类,其中有很大一部分是用于截断不安全的输入,如添加安全检查等;其次是用于修改数据结构来对数据进行规范化处理;还有一部分是用于修改函数或修改函数的方式,这一类和程序自身逻辑关联更紧密。这里需要说明的是,这些比例加在一起并不是100%,因为有一些补丁可能同时存在多种情况的修改。总的来讲,从调研的结果可以看到补丁代码模式及类型是非常复杂的。

图1

接下来,本文评估了这些改变对代码变动带来的影响。本文发现很大一部分补丁的确能够引起控制流变化。但是,也有相当部分的补丁不会导致控制流变化,即补丁实际带来的可能只是基本块内个别指令的变化,甚至一部分补丁(6.5%)根本不会引起指令的变化,如图2所示。

总的来讲,经过本次调研可以发现,若仅关注控制流及指令层面则难以充分描述补丁带来的差异。考虑到现有方法即便能够找到差异也难以提供给分析人员便于理解的高层次语义信息,那么能不能在适应不同补丁模式的情况下,还提供丰富的语义信息帮助分析人员更好地理解呢?

图2

三、基于内存对象访问序列的补丁差异性比对

针对上述问题,本文的基本思路主要基于两个出发点展开:

■ 程序对输入的操作能够揭示丰富的语义;

■ 安全补丁通常通过修改对数据结构的操作来规范输入的传播。

因此,本文使用补丁前后的程序来运行PoC,进而根据运行时数据结构访问与输入字段之间的关系来得到补丁携带的语义信息。

但二进制通常缺失符号和类型信息,那么如何表达数据结构访问与输入字段的关系呢?为了回答该问题,本文提出了内存对象访问序列的概念,这也是本文的核心。

在正式介绍内存对象访问序列的概念之前,本文提出了下述两个定义。

(1)内存对象mobj的表示方法为:mobj=(alloc,size,type),其中alloc表示分配内存对象时的上下文信息;size表示内存对象的大小;type表示内存对象的类型。其中,type包括静态变量、栈中的局部变量和堆上的动态变量。

(2)内存对象访问的表示方法为:A(mobj)=(mobj,cc,op,optype,a),其中mobj为定义1中的内存对象;cc表示内存对象访问时的上下文信息;op表示在内存对象mobj上进行的相关操作,包含具体指令及其地址,本文主要关注在显式输入传播中涉及的数据移动指令、算术指令和库/系统调用指令;optype表示内存对象mobj的访问类型,包含读和写两种;a表示能够影响该内存对象操作的输入字段。

而将运行时的每个内存对象访问按照发生顺序排列,即构成了内存对象访问序列。基于上述定义,本文提出了基于内存对象访问序列的补丁差异比对的工作方案,如图3所示。

在图3中,首先通过运行监控与多源污点跟踪获取补丁前后程序执行PoC的执行序列与污点标签传播情况;基于上述信息,随后通过对函数调用栈进行识别、根指针提取、推断内存对象大小、根指针传播和污点标签关联等步骤来还原内存对象与内存对象访问,从而构建出补丁前后的两条内存对象访问序列,经过序列对齐后,即可用其揭示的高层次差异来帮助分析人员理解补丁所携带的信息。

图3

作者简介

王笑克,武汉大学国家网络安全学院博士生。他的研究兴趣包括二进制比对,围绕代码库的安全攻防(API误用检测、针对代码库的漏洞挖掘、代码库瘦身)等。

(本文选取了文章部分章节,更多精彩内容请阅读《网络安全国际学术研究进展》一书。)

版权声明:本书由网络安全研究国际学术论坛(InForSec)汇编,人民邮电出版社出版,版权属于双方共有,并受法律保护。转载、摘编或利用其它方式使用本研究报告文字或者观点的,应注明来源。

Bookmark the permalink.

Comments are closed.