今天为大家推荐的论文是来自中科院信工所陈恺老师、孟国柱老师研究组投稿的关于深度学习框架漏洞挖掘的工作Differential Testing of Cross Deep Learning Framework APIs: Revealing Inconsistencies and Vulnerabilities,目前该工作已发表于USENIX Security 2023。
## 0x01研究摘要
深度学习(DL)框架通常提供一系列模型转换功能,使其他框架上生产的DL模型能够快速迁移和部署到自己的框架上。然而,模型转换中的缺陷可能使模型在不同的框架中表现不同,甚至导致难以察觉的错误。之前的研究主要关注在单个DL框架的安全性,但很少研究跨框架的不一致性以及造成这些不一致的漏洞。为此,作者提出一种新的针对跨框架API缺陷检测方法TensorScope。它将一组功能等价的API作为测试目标,然后执行差分测试以识别不一致性。作者设计了两种新的策略以提高测试效率,包括 1)联合约束分析以提高测试用例的质量和测试效率,以及 2)错误引导的测试用例修复以改进输入的约束。TensorScope在六个流行的DL框架的1,658个API上得到了广泛的评估。结果显示,TensorScope比两种SOTA方法在代码覆盖率上分别提高了28.7%和24.3%。通过对这六种DL框架的持续测试,作者找到了257个框架漏洞,其中包括230个新漏洞,并获得了8个CVE和7,500元左右的赏金。另外,作者成功利用这些不一致性问题,使三个DL模型的准确性最多降低3.5%的准确率,实现对这些不一致性漏洞的初步利用。
图1 整体框架图
## 0x02研究挑战
在这项研究中,作者专注于跨框架API的计算不一致问题并尝试利用差分测试技术发现这些问题。为了实现这一目标,必须解决以下挑战:1)如何提取API参数的约束以及它们的隐式依赖关系?获得API参数的准确约束可以有助于生成测试用例,并提高测试效率。然而,API可能存在语义依赖,作为隐式约束,这些约束无法从API文档中提取。以TensorFlow中的操作符“tf.raw_ops.BatchMatMulV3(x,y,Tout,adj_x,adj_y,name)”为例。除了x和y应该是特定的数据类型之外,x的最后一维和y的倒数第二维应该具有相同的大小。这种依赖性并未在文档中描述,但是如果没有它,生成的输入的大部分都是无效的。2)如何生成代表性的测试用例以更有效地发现错误?考虑到API内复杂的调用关系和参数取值的不确定,为框架API生成高质量的测试用例面临巨大的挑战。特别是取值的边界,符号执行和值范围分析这样的传统程序分析技术在这种情况下无法直接应用。此外,当一个错误只能由特定的值触发时,代码覆盖率在指导测试时并不有效。这就需要新的指标来衡量程序状态并提供有意义的反馈。3)如何评估错误的危害以及在实际场景中的可利用性?通常,作为模型算子的API在DL框架中被很好地封装,不允许用户直接调用。为了利用这些错误,攻击者在大多数情况下必须为DL框架制定一个特定的模型作为输入。这带来了一个新的棘手问题,即如何确定通过这个模型是否可以达到错误。因此,这些错误可能导致的危害及其可利用性并不清楚。
## 0x03研究方法
为了应对上述挑战,作者设计了一种差分测试方法,用于检测六个DL框架中API的不一致性错误。首先,通过分析每个模型转换器中的等价转换规则(参见第3.1节),提取对应的API作为测试对象,为不一致性检查做准备。转换规则不仅揭示了不同框架中对应API的名称,还指出了API参数的对应关系。然后从API概要和实现中提取参数约束。从API概要中,能够获取每个参数支持的类型和值范围等约束。从代码中,利用静态分析来提取断言和错误处理信息,这可以帮助提取在第一个挑战中提到的参数依赖关系。此外,如果被测试程序以错误消息退出,例如,表示更精确的值范围,那么这些约束将会进一步被精化。与此同时,收集所有对应API的约束,并进行联合分析。具体来说,约束的交集能够进一步缩小测试范围并触达更深层的代码;双方约束之间的差异提供了更高的可能性来确定值边界以及引发错误的边界用例(参见第3.2节)。最后,作者使用实际中受到错误转换影响的三个模型,并评估找到的错误的危害。此外,作者实现了一个概念验证攻击,利用这些错误并量化它们的危害(参见第5.3节)。
## 0x04结果发现
图2 TensorScope发现的bug数目统计表
本文已经在从六个DL框架中提取的1,658个对应API上评估了TensorScope。结果显示,TensorScope识别出17,574个约束,相比于DocTer增加了24.7%。同时,相比于知名的模糊测试器Atheris,TENSORSCOPE增加了54.5%的代码覆盖率,相比于FreeFuzz增加了28.7%,相比于DocTer增加了24.3%。共发现257个错误,包括80个非崩溃错误和177个崩溃错误。所有这些错误都被开发者认可,并获得了8个CVE。崩溃错误主要分布在段错误(81.9%),浮点异常(7.9%)和中止(10.2%)。作者还对这些非崩溃错误进行了手动检查,并发现不一致性错误主要分为三类:精度错误(57.5%),数据布局错误(8.7%)和特殊值错误(33.8%)。在错误危害分析方面,作者通过模型转换器展示了这些跨框架错误的潜在利用场景,这些错误使得三个模型的准确性降低了2.3% - 3.5%。
代码链接:https://github.com/tensorscopepro/Tensorscope.git
博士研究生,主要研究方向为软件漏洞挖掘,AI程序分析,相关研究成果发表在USENIX Security和ACM CCS等国际顶级会议。联系方式:wx: endered01