ARBITRAR: User-Guided API Misuse Detection

论文代码 https://github.com/petablox/arbitrar

摘要

软件api表现出丰富的多样性和复杂性,这不仅使它们成为编程错误的常见来源,而且阻碍了程序分析工具对它们进行检查。这类工具要么要求精确的API规范,这需要程序分析专家,要么假定正确的API用法遵循简单的习惯用法,可以从代码中自动挖掘,但准确性较差。我们提出了一种新的方法,允许普通程序员发现API的误用。我们的方法与用户交互,对每个目标API方法的有效和无效用法进行分类。它通过使用一种主动学习算法,根据API的无效可能性对其使用进行排序,从而最小化用户负担。我们在一个名为ARBITRAR的C/ c++程序工具中实现了我们的方法,并将其应用于21个大型实际程序(包括OpenSSL和Linux Kernel)中检查18种API方法的使用情况。在每一种API方法的平均3轮用户交互中,ARBITRAR发现了40个新的漏洞,其中18个被接受了补丁。此外,ARBITRAR可以在一个包含92个bug的基准套件中找到由先进工具APISAN报告的所有已知bug,其假阳性率仅为51.5%,而APISAN的假阳性率为87.9%。

问题

用于检查API误用的工具要么要求精确的API规范,这需要程序分析专家,要么假定正确的API用法遵循简单的习惯用法,可以从代码中自动挖掘,但准确性较差。

本文工作

在本文中,我们提出了一个基于**最大偏差核密度估计(MD-KDE)**的交互式工具ARBITRAR,该工具用于发现API误用错误,这是一种新的主动学习方法。与现有方法不同,ARBITRAR既不需要API规范,也不需要大量有效使用的代码。给定要在代码库中检查的目标API方法,ARBITRAR使用不受约束的符号执行[51]为该API方法的所有调用站点生成过程间程序跟踪。我们通过从API调用站点向后切片来最小化跟踪。将这些优化后的轨迹转化为一组特征向量。最后,我们在这种向量化的跟踪上使用MD-KDE来检测那些表示API的无效用法的跟踪。具体地说,在每一轮MD-KDE中,将向用户显示最有可能无效的API使用情况。
我们通过将其应用于21个C/ C++程序中18个目标API方法的使用来评估ARBITRAR,其中包括OpenSSL和Linux Kernel等安全关键代码库。ARBITRAR发现了40个新漏洞,其中18个被报告、确认和修补。此外,我们还证明了ARBITRAR是高效的,平均只需要3轮用户交互就可以发现API滥用。我们还对ARBITRAR和APISAN进行了直接比较,APISAN是一种先进的API误用检测器。在一个包含92个bug的基准套件上,ARBITRAR找到了APISAN报告的所有已知bug,其假阳性率为51.5%,远低于APISAN的87.9%。

框架
在这里插入图片描述
给定一组C/ c++程序和一个要检查的目标API方法,我们首先将程序编译为LLVM位码,然后生成所有API使用的符号跟踪(SectionIII-A)。然后,这些符号痕迹被编码到特征向量中,这些特征向量捕获与API有效和无效使用分类相关的信息(SectionIII-B)。最后,使用我们的主动学习算法,我们通过呈现一个潜在的错误跟踪和从反馈中学习(SectionIII-C)来识别异常与用户交互。

1.跟踪生成:在目标API调用周围的上下文中执行受约束的符号执行,结果是一组程序路径或符号跟踪。
在这里插入图片描述
2.跟踪编码:根据编码每条跟踪的功能列表将程序跟踪集转换为固定维的二进制向量。(使用Datalog语言)
在这里插入图片描述
3.主动学习和用户互动
将API误用问题描述为机器学习中的交互式异常检测问题,提出了人在回路算法MD-KDE。
1) 交互式异常检测(IAD)问题:传统的异常检测(AD)[29],[10]方法在批处理模式下运行,即在具有零个或只有几个标记数据点的数据集上训练的机器学习模型负责预测一组异常候选。这种设置尤其具有挑战性,因为在我们的案例中,正信号的稀疏性证实了目标API的误用,因此这些方法通常依赖于异常和/或正常数据点的额外的分布假设,如“one-class”假设[53],[57]。然而,在我们的例子中,这样的假设是不现实的,因为它相当于假设每个目标API的单一有效使用模式。为了解决这个问题,我们通过允许机器学习算法以迭代方式与人类专家通信,为机器学习算法提供更多信号。我们在下面定义交互式异常检测问题。
定义1(交互式异常检测):给定一个包含n个数据点的数据集X={x1, x2,···,xn},以及一个专家oracle f:X→{0,1},将一个数据点从X映射到0(正常)或1(异常),学习者可以在每轮中融合一个数据点(i)进行查询,达到tround的总数量。交互式异常检测(IAD)问题的目标是最大限度地增加已识别异常的总数,即:

在这里插入图片描述
在API误用检测设置中,**数据点是由SectionIII-B中描述的方法生成的跟踪编码。目标是通过向人类专家查询最多T轮的异常轨迹来识别尽可能多的异常轨迹。 **在每一轮中,学习者从数据集中选择一个未标记的数据点,并将其呈现给人类专家,后者为算法提供二进制(异常或非异常)反馈。总体性能是通过T查询中真实异常的百分比来衡量的,即总体精度

2) 基于核密度估计的主动学习算法:针对IAD问题,提出了一种新的基于核密度估计(KDE)的主动学习算法。该算法遵循算法2中的主动学习框架。在每一轮中,给定当前标记的数据集,学习者首先使用采集函数计算每个未标记数据点的排名分数,然后要求专家评估具有最大分数的未标记数据点。直观地说,根据开发人员迄今为止提供的标签,这样的数据点对应于算法认为最有可能是误用目标API的跟踪。
在这里插入图片描述
采集功能为每个未标记数据点(使用标记数据集)提供评分功能。我们的采集函数设计用于选择未标记的数据点,以实现正(异常)数据和负(正常)数据的核密度估计之间的最大差异。更正式地说,使用正负数据点P和N表示带标签的数据集L,采集函数定义如下:
在这里插入图片描述
等式(2)中的期望值可使用以下形式的标记数据点进行估计,
在这里插入图片描述
我们将使用上述捕获函数的主动学习算法称为最大差异核密度估计(MD-KDE)算法。直观地说,MDKDE的行为如下,采用先探索后利用的方式:
1) 在开始时,当没有检测到正数据点时,该算法只需选择一个距离现有标记(负)数据点最远的未标记数据点。这可以被视为探索阶段,或经典主动学习中的模型方差最小化[13]。这种使样本多样化的策略加快了发现第一个异常情况的过程。
2) 当同时存在正数据点和负数据点时,该算法倾向于靠近现有正数据点但远离现有负数据点的数据点。在存在满足这些标准的多个数据点的情况下,我们从这些数据点中选择一个随机点。这可以看作是KDE分类器的开发阶段。由于同一类型的异常情况在特征空间中往往彼此接近,我们发现使用该策略可以检测到许多相似的异常情况。

3) MD-KDE的高效更新:MD-KDE与现有的基于主动学习的异常检测方法相比的一个主要优点是它在多轮查询之间的高效更新。MD-KDE不使用每轮更新的标记数据集来训练新的机器学习模型(通常需要一小时到几天的时间,具体取决于数据集的大小和模型的选择),而是使用与当前未标记样本数成比例的线性时间进行精确的轮对轮更新。即使在跟踪超过50000条的大型数据库中,更新也只需几秒钟。这使得专家能够在整个交互会话中与我们的系统保持联系。

实现

1.分析设置
ARBITRAR使用Apt-tools[26]自动获取程序并将其构建到LLVM位代码中。
2.主动学习
在源代码级别上呈现跟踪来与用户交互,用户通过输入Y或N来提供反馈,这意味着所呈现的跟踪是否有bug。
在这里插入图片描述

优点

精确(即产生低误阳性率)、高效(即需要几轮用户交互)、可伸缩(即在大规模代码库中发现bug)

限制

•API方法要求:与APISAN不同,ARBITRAR是特定于API方法的,并且需要提供方法名。我们提供了一种方法[38]来枚举API方法的调用站点的数量,它可以用于选择出现次数较多的API方法。但是,更准确地说,可以对代码基进行简单的统计分析[32],以确定感兴趣的方法,然后将这些分析提供给ARBITRAR。
•不完整的跟踪生成:与APISAN类似,我们只考虑直接调用API方法的站点。因此,我们的跟踪生成技术可能会错过通过函数指针调用的API方法的跟踪。但是,我们可以使用指向分析[56]来解析函数指针目标,并在跟踪生成期间考虑它们。
•离散用户反馈:我们的主动学习算法只允许一位用户反馈,即“是”或“否”。然而,在实践中,用户可能希望提供其他类型的反馈,例如,有80%的信心的Y。我们目前的设计不允许这样的反馈。然而,像ALPF[30]这样的技术可以用来处理这样的反馈。
•对用户反馈的敏感性:我们的主动学习算法信任所有用户反馈。然而,用户可能会犯错误。在我们的经验中,当给出错误的反馈(例如,标记一个正确的用法是不正确的)时,我们的模型能够在几个正确的答案之后自我修正。然而,这可能不适用于所有API,因为模型取决于API的复杂性。需要进行广泛的研究,以准确地评估我们的模型对用户反馈的敏感性。

未来工作

•模型解释和迁移学习:我们相信我们的算法学习的模型是可解释和迁移的,即,正式构建的模型可以用于realloc和calloc等其他分配函数。我们计划通过测试一个预先训练好的其他相关API方法的API方法的模型来探索这个问题。我们还计划为每个跟踪生成一个描述,解释哪些特性有助于选择跟踪。
•优先级高的错误:优先级高的API误用错误是很重要的。例如,导致内存泄漏和代码异味的API误用错误可能没有导致内存损坏的错误那么重要。对严重级别较高的bug进行优先排序是很重要的。为了解决这个问题,我们计划允许用户提供错误类型反馈(例如,内存泄漏,内存损坏,等等)。然后,我们可以使用这个反馈来训练bug类型检测模型,该模型可以用来对指示关键bug的跟踪进行优先级排序。

相关知识

核密度估计

统计学中,核密度估计,即Kernel Density Estimation,用以基于有限的样本推断总体数据的分布,因此,核密度估计的结果即为样本的概率密度函数估计,根据该估计的概率密度函数,我们就可以得到数据分布的一些性质,如数据的聚集区域。

一句话概括,核密度估计Kernel Density Estimation(KDE)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。

主动学习

主动学习(active learning)是人工智能的一个子领域,在统计学领域也叫做查询学习、最优实验设计。该算法包括两个基本模块:学习模块和选择策略。主动学习通过“选择策略”主动从未标注样本集中挑选部分样本,交给相关领域专家进行标注,然后将标注样本增加到训练数据集给“学习模块”进行训练。当学习模块满足终止条件后停止,否则不断重复获得更多的标注样本进行训练。

主动学习的优点:能够很好地处理较大的训练数据集,减少人工标注成本。

https://zr9558.com/2020/09/13/activelearning-2/

基于主动学习的异常检测算法

Progress in Outlier Detection Techniques: A Survey
主动学习是半监督学习方法的一个示例,其中设计的算法与用户或信息源交互以获得所需的输出[193],[194]。例如,在某些实际数据集包含大量未标记的数据集的情况下,手动标记这些数据的任务非常昂贵。这种情况要求学习算法主动查询信息源或用户。在这种情况下应用主动学习算法时,该算法将能够发现训练数据集中用户标记的较小部分实例。这样做是为了促进重新训练模型的改进。主动学习类似于一个系统,在该系统中,学习算法可以请求用户输入实例的标签,以提供更好的预测。最近,在不同的研究领域[195]–[199]中采用了针对异常值检测的主动学习。Aggarwalet al.[6]在异常值检测中使用主动学习的概念,以解决给出异常值被标记的明确原因以及基于密度估计的OD方法相对较高的计算需求的模糊性。在他们的方法中,他们最初将分类技术应用于包含点云(人工生成)的标记数据集。然后,通过称为“基于集成的最小边际主动学习”的选择性抽样机制,应用主动学习方法最小化分类问题Gornitzet等人[200]提出了另一项工作,将主动学习策略应用于异常检测。为了获得良好的预测性能,他们重复在主动学习过程和模型更新之间交替的过程。在未标记和改进的示例上对该方法进行训练后,应用主动学习规则。
Daset al.[196],[197]使用了一种主动的方法来查询人类分析师,以获得更好的结果。他们热切地为查询过程选择最佳的数据实例,但没有给出对设计选择的明确见解、解释和解释。在接下来的研究中,他们试图解决这些问题。2019年,Daset al.[201]提出了一种通过称为全球定位异常检测(GLAD)的集合进行主动异常检测的方法。他们研究如何在主动学习问题中自动拟合集合离群点检测器。在GLADE中,最终用户保持适度和可理解的全局异常检测器的使用。这是通过在特定数据实例中通过标签反馈自动学习本地权重来实现的。对集合进行微调有助于最大化发现的正确异常值的数量。这种框架被称为循环中的人,因为每一轮迭代的人力分析师都会给出标签反馈。
尽管最近在研究领域中采用了针对离群点检测的主动学习方法,但文献中仍然缺乏这种方法,而且还有更多的工作需要完成。人类分析员发现真实异常值的过程可能很困难,未来人类分析员需要通过设计和配置有效的异常值检测器,将误报影响降至最低的技术。此外,需要更好地洞察和解释通过采用不同算法获得的异常值分数和相关结果。离群点检测环境中的主动学习需要研究社区对其进行可靠的解释和解释。最后,设计用于处理数据流的主动学习算法也是一个很有前途的研究挑战。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值