[论文分享] DnD: A Cross-Architecture Deep Neural Network Decompiler

news2024/12/26 23:35:08

DnD: A Cross-Architecture Deep Neural Network Decompiler [USENIX 2022]

Ruoyu Wu Purdue University
Taegyu Kim The Pennsylvania State University
Dave (Jing) Tian Purdue University
Antonio Bianchi Purdue University
Dongyan Xu Purdue University

深度神经网络(DNN)的应用在近几年稳定增长, 特别是在边缘设备上, 专门的DNN编译器用于将DNN编译成二进制文件. 当DNN模型可访问时, 许多安全应用场景(如DNN模型提取、白盒对抗样本生成和DNN模型修补和加固)都是可能的. 然而这些技术不能应用于编译的DNN. 不幸的是, 没有专门的反编译器能够从已编译的二进制代码开始恢复DNN的高级表示.
为了解决这个问题, 我们提出了DnD, 第一个且与ISA无关的DNN反编译器. DnD使用符号执行, 结合专用的循环分析, 将分析的二进制代码提升为一种新的中间表示, 能够以编译器和ISA不可知的方式表示DNN的高级数学操作. 然后, DnD将提取的DNN数学操作与模板DNN数学操作进行匹配, 恢复所有识别的DNN算子的超参数和参数, 以及整个DNN拓扑. 我们的评估表明, DnD可以完美地恢复不同的DNN模型, 从两个不同编译器(Glow和TVM)为三个不同的ISA(Thumb、AArch64和x86-64)编译的二进制文件中提取它们. 此外, DnD能够提取现实世界微控制器使用的DNN模型, 并使用白盒对抗机器学习技术攻击它们.

一句话 - DnD: 使用符号执行和专用循环分析技术反编译DNN模型二进制文件

换一句话: “开逆向AI的先河”

导论

DNN编译器在边缘设备中的使用越来越多,如微控制器和手机。例如,微控制器使用编译后的DNN二进制文件来执行各种任务,如安全人脸识别、语音识别和语音控制。最近的一项预测估计,到2025年,98%的边缘设备将具有智能功能,通常由DNNs驱动。
从编译的二进制代码中提取DNN模型使各种安全应用程序成为可能,包括DNN模型提取和分析(手动和自动)、白盒对抗样本生成、白盒DNN后门检测以及DNN模型修补和加固。不幸的是,在所有这些使用场景中,通过应用传统反编译器获得的反编译代码的源代码级表示并不能为分析人员提供太多帮助,因为这样的反编译器无法捕获编译后的DNN模型的数学语义。
本文提出DnD,第一个编译器和指令集无关的深度神经网络反编译器,能够从编译后的二进制文件中提取DNN模型。具体来说,在处理编译后的DNN模型时,DnD可以精确地恢复其参数、超参数和拓扑结构,并将反编译后的模型表示为用ONNX建模语言[9]编码的高级表示(如图1所示)。

在这里插入图片描述

DND基于以下三种新技术。首先,它将符号执行与专用循环分析相结合,以捕获表示不同DNN算子如何处理接收数据的精确数学公式。其次,DND使用一种新的中间表示(intermediate representation, IR),以编译器和ISA无关的方式表示高级数学DNN操作。最后,通过将提取的数学操作与模板数学DNN操作进行匹配、恢复超参数以及识别出的所有DNN操作的参数,识别出目标二进制文件中DNN操作的类型和位置以及整个网络的拓扑结构。

实验结果表明,DnD具有通用性和准确性。它支持反编译由两个不同的编译器为三个不同的ISA编译的不同DNN模型,而不需要人工工作。此外,反编译后的DNN模型在结构上与原始DNN模型是等价的,重新编译后生成的二进制文件对样本的分类与原始二进制文件完全相同。进一步证明,DnD可以成功反编译真实世界微控制器使用的DNN二进制文件,恢复的DNN模型可用于增强对原始DNN的对抗攻击,使其能够使用白盒攻击,而不是效率较低的黑盒攻击。

contributions
(1) 设计并实现了DND,第一个编译器和isa无关的DNN模型反编译器。DND可以反编译(剥离)DNN二进制文件,以恢复编译后DNN模型的完整细节,并使用ONNX高级建模语言表示它们。
(2) 设计了一个专用的IR来表示每个DNN算子,并开发了一种新技术,使用符号执行将DNN二进制提升为IR表达式。然后将提取的IR表达式与模板表达式进行匹配,以识别编译后的DNN使用的不同操作符,并恢复其超参数、参数和整体网络拓扑结构。
(3) 在三个ISAs (Thumb、AArch64和x86-64)、两个DNN编译器(Glow和TVM)以及三个广泛使用的DNN模型(MNIST[59]、ResNet v1[20]和MobileNets v2[40])上评估了DND。实验结果表明,DND能够从不同ISA、编译器和模型的编译二进制文件中完整、准确地恢复DNN模型。

方案

Assumptions

DnD依赖以下假设:
(1) 我们可以访问DNN二进制文件
(2) 控制流图(CFG)恢复可靠
(3) DNN编译器不使用混淆技术, 实际上现在还没有DNN模型混淆的研究

Challenges

与C/ c++二进制反编译相比,DNN二进制反编译带来了几个独特的挑战。

挑战1:不同的编译器和体系结构
DNN模型使用各种DNN编译器编译到不同的指令集体系结构(ISAs)上,如Arm Thumb、Arm AArch64和x86-64。每种组合生成的控制流和数据流完全不同,因此简单的模式匹配,无论是使用二进制代码还是通用反编译器生成的反编译代码,都不适合以通用的、编译器和代码类型无关的方式恢复DNN模型超参数。
解决: 使用一个专用的IR,它能够将每个DNN算子表示为一个算子摘要,包括代数操作的AST。由于DNN操作符即使在不同的DNN编译器和ISA中也具有相同的数学语义,而IR和操作符摘要能够捕获数学语义,因此DnD可以以编译器和ISA无关的方式识别它们。

挑战2:向量化的数学计算和复杂的循环结构
作为张量操作,DNN运算符总是被实现和编译为嵌套循环,在循环体中进行矢量化的数学计算。此外,嵌套循环复杂的控制流和巨大的循环索引范围,会导致路径爆炸问题,阻碍使用符号执行生成每个DNN运算符的运算符摘要
解决: 通过跟踪与每个DNN操作符输入和输出相关的符号约束,并将这种符号约束提升到用IR表示的操作符摘要,使用专用的符号执行来捕获向量化数学计算的语义。

挑战3:对DNN算子的可扩展支持
实际模型会有许多不同的DNN算子。因此,手动为每个DNN算子设计一个启发式算法来识别其DNN算子类型并提取其参数是不可扩展的。
解决: 对于未知的DNN操作符,我们将其生成的操作符摘要中包含的AST与操作符模板AST进行匹配,以识别其操作符类型。DND首先建立一个模板AST库,将每个DNN算子映射到对应的AST,然后利用最新的DNN编译器对每个DNN算子进行编译,并生成每个编译后的DNN算子的模板AST,并用设计的IR表示。然后,给定先前生成的未知DNN操作符的操作摘要,DND将其AST与模板AST数据库中的一个AST进行匹配,并确定未知DNN操作符的类型。

Designs

DND的工作流由三个组件组成,如图2所示。具体来说,这三个部分是(1)DNN算子位置识别,(2)算子摘要生成,(3)DNN模型提升
在这里插入图片描述

第一阶段,DnD从输入(删减)的DNN二进制文件中恢复控制流图(CFG),并确定推理函数和DNN操作符的位置
第二阶段,DnD生成每个DNN运算符的运算符摘要。为此,DND首先进行循环分析,确定循环的信息。然后,DnD利用循环的信息进行选择性的符号执行,提取DNN操作符的输出作为其输入和参数的符号表达式。然后,提取的符号表达式以我们的IR格式提升到运算符摘要
第三阶段是将每个算子摘要提升为DNN算子,并将其转换为高级DNN表示。具体来说,DnD首先将每个操作符摘要中的AST与模板AST进行匹配,以确定其DNN操作符的类型, 然后,DND通过识别DNN算子之间的数据依赖关系来恢复DNN拓扑结构, 最后,DND根据识别出的DNN算子类型和拓扑结构恢复各DNN算子的属性和参数,并将完全恢复的DNN模型转换为ONNX模型.

DNN Operator Location Identification

由于DNN算子本质上是张量计算,因此它们被实现和编译为多个嵌套循环,其中包含一些数值计算。此外,DNN操作符要么位于推理函数中,要么位于被调用函数中。DND利用这两个属性来识别DNN算子和推理函数的位置

Operator Summary Generation

在识别出DNN算子的位置后,DND从每个DNN算子中提取符号表达式,并将其提升为操作符摘要。

  • Loop Analysis: 循环分析的主要目标是识别DNN算子中关于基本归纳变量(induction variable, IV)的信息,即每个循环的非正式循环索引变量。如图3b中的i、j、u、v是IV。分析的输出包括IV、它们的初始值、步长(即increment常量)和循环次数(即循环应该重复执行多少次迭代)。
    在这里插入图片描述
    在这里插入图片描述

  • Symbolic Expression Extraction: DNN算子通常进行张量计算,取其输入和参数,生成计算后的输出传递给后续DNN算子作为输入。因此,我们可以将DNN算子的输出表示为该算子的输入和的符号表达式以及算子参数. 为了提取这样的符号表达式,DnD使用IVs作为符号变量执行定制的选择性符号执行
    在这里插入图片描述

  • IR Design: 可以将DNN算子的提取符号表达式抽象为张量计算。与提取的符号表达式不同,该IR适用于DNN优化二进制文件的操作符类型表示和操作符参数恢复
    在这里插入图片描述

  • Operator Summary Lifting: DnD将提取的每个DNN算子的符号表达式提升为我们设计的IR中的算子摘要。每个运算符汇总包含3部分:addr、expr和IVs,分别表示DNN运算符输出的符号地址、DNN运算符输出的抽象语法树(AST)和IVs信息(即初始化值、步长和循环次数)。
    在这里插入图片描述

Template ASTs Generation

为了生成DNN操作符的模板AST,首先利用每个ONNX操作符[11]的使用示例,手工构造一个ONNX格式的操作符实例。然后,DND使用DNN编译器将这个ONNX运算符实例编译为二进制文件。最后,DND使用相同的运算符摘要生成过程,从编译好的二进制文件中生成运算符摘要,并将其expr作为模板AST。

DNN Model Lifting

DnD首先使用AST匹配恢复DNN操作符的类型。然后,DnD利用互操作符数据依赖关系恢复DNN拓扑。最后,DnD结合DNN算子类型和DNN拓扑结构恢复DNN算子的属性和参数,并将完全恢复的模型转换为ONNX格式

(1) AST matching
执行广度优先搜索(BFS),检查DNN操作符的AST和模板AST是否具有相同的树结构,并且两个AST在每个节点中具有相同的数学函数. 期间会用到angr的表达式简化器来判断两个表达式的等价性

(2) DNN Topology Recovery
DND通过利用推断函数中的DNN算子执行顺序和各个DNN算子之间的数据依赖关系来恢复DNN拓扑

(3) Attributes and Parameters Recovery
DND利用生成的操作符摘要和恢复的DNN拓扑恢复每个DNN算子的属性和参数,然后生成ONNX格式的高级DNN表示。
对于只有shape-related属性的DNN操作符(例如,AveragePool的过滤器长度),DnD通过检查它们的循环的嵌套结构和循环的计数(例如,过滤器长度是迭代输入的循环的循环计数)来恢复它们的属性。
而对于参数, DnD利用恢复的IV范围将参数项具体化为具体地址,然后从这些具体地址中提取参数。

实验

主要两个实验
一. 展示支持多少常用的DNN操作符和模型,从而演示DND的通用性。
二. 展示了DND在不同DNN编译器、ISAs和DNN模型中的正确性。将原始DNN模型和对应的反编译DNN模型进行比较,以验证模型架构的等价性,即被比较模型具有相同的DNN算子和拓扑结构,以及它们推理结果的等价性(即给定相同的输入,两个模型输出相同的标签)。

Generality Evaluation

通过评估DnD可以支持多少个广泛使用的DNN模型来评估DnD的通用性。当DNN使用的所有操作符都由DnD支持时,则认为DNN受支持。为此评估了DnD可以为多少个DNN算子创建模板AST。

在这里插入图片描述

Decompilation Correctness Evaluation

为了与之前的模型提取攻击相一致[58,61],我们使用MNIST[59]和ResNet v1[20]作为我们的两个测试DNN模型。我们还包括MobileNets v2[40],一种为移动和嵌入式系统设计的DNN模型。我们将其统计数据显示在表1中。
在这里插入图片描述

测试了反编译模型和原始模型之间的模型架构等价性。将生成的15个反编译DNN模型与对应的原始DNN模型的神经网络结构(即网络拓扑结构、算子数量和每个算子类型)进行比较。所有15个反编译的DNN模型都与相应的原始模型相同。图6显示了原始ResNet v1模型和从DNN二进制文件(使用Glow和Arm Thumb ISA编译)反编译的ResNet v1模型的示例。
在这里插入图片描述

表2使用10,000个测试输入,总结了关于反编译模型和原始模型之间推理等价性的结果。如图所示,对于所有样本,反编译后的DNN模型和原始DNN模型的推理结果完全相同。
在这里插入图片描述

总结

Related Works

[9] Linux Foundation. ONNX. https://onnx.ai/.
[11] Linux Foundation. ONNX operators. https://github.com/onnx/onnx/blob/master/docs/Operators.md.
[20] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep residual learning for image recognition. In
Proceedings of the IEEE conference on computer vision and pattern recognition, 2016.
[40] Mark Sandler, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. Mobilenetv2: Inverted residuals and linear bottlenecks. In Proceedings of the IEEE conference on computer vision and pattern
recognition, 2018.
[59] Corinna Cortes Yann LeCun and Chris Burges. Mnist handwritten digit database. http://yann.lecun.com/exdb/mnist/.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端期末大作业:婚纱网页主题网站设计——唯一旅拍婚纱公司网站HTML+CSS+JavaScript

👨‍🎓静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计👩‍🎓,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

代码随想录训练营day59, 下一个更大元素II, 接雨水

下一个更大元素II 给定一个循环数组, 输出每个元素的下一个更大元素, 没有则-1 所以在遍历的过程中, 模拟走了两遍nums class Solution {public int[] nextGreaterElements(int[] nums) {int len nums.length;//先进行边界判断if(nums null || len < 1){return new int…

Python制作读者下载器,实现随时随地免费看

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 一个看书党一年有多少money投入小说行业呢~ 碰上一本好看的书&#xff0c;你能购买上多少章呢~ 其中的投入&#xff0c;无法想象&#xff0c;尤其是兴致上来了&#xff0c;不得投上个礼物给作者…

redis之作为缓存使用

写在前面 Redis因为其自身高性能的数据读取能力&#xff0c;因此会经常被应用到缓存的场景中&#xff0c;本文就一起看下Redis当做缓存使用时的特点&#xff0c;问题&#xff0c;以及需要注意的点。 1&#xff1a;缓存的架构模式 从架构模式上来看缓存系统可以分为旁路缓存&…

Kotlin 基础学习笔记第八章——高阶函数:Lambda作为形参和返回值

一、声明高阶函数 高阶函数定义&#xff1a;高阶函数就是以另一个函数作为参数或者返回值的函数。 在kotlin中&#xff0c;函数可以用lambda或者函数引用来表示。因此&#xff0c;任何以lambda或者函数引用作为参数的函数&#xff0c;或者返回值为lamda或函数应用的函数&#x…

基于遗传算法优化的lssvm回归预测-附代码

基于遗传算法优化的lssvm回归预测 - 附代码 文章目录基于遗传算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于遗传算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对…

使用openshift 进行云平台连接

使用openshift 进行云平台连接 OpenShift CLI on Windows openshift 文档地址 OpenShift CLI on Mac 通过Homebrew方式安装 brew install openshift-cli安装完成&#xff0c;进行验证 oc version服务连接 oc login 服务地址根据提示输入用户名和密码&#xff0c;即可连接…

某讯滑块验证码反汇编分析-第一章

某讯滑块验证码反汇编分析-第一章js分析初步分析vmp结构js分析 在滑动完成后&#xff0c;会请求【cap_union_new_verify】接口&#xff0c;其中有5个比较长的参数&#xff0c;看起来可能会有加密的&#xff0c;分别如下。 参数名来源uasesscollecteksvData 那现在js看看这些参…

让车机「下雨」,路特斯的智能座舱跑偏了吗?

HIEV消息&#xff08;文/张祥威&#xff09;“我们今天用双8155&#xff0c;都觉得&#xff08;算力&#xff09;还不够。”杨平说。 这位路特斯的智能座舱研发负责人&#xff0c;目前带领着一支两百多人的团队&#xff0c;为Eletre这款车操刀座舱智能化。 双8155&#xff0c;指…

Gitee应用(1):快速搭建Git环境在不同电脑同步文件

一、前言 环境&#xff1a;Windows 11 64位 &#xff1b;vscode&#xff1a;1.73.1 当你要操作在两台不同的电脑上操作&#xff0c;或许经常会遇到一个问题&#xff0c;就是怎么同步同一个或几个文件&#xff0c;以方便你在不同的电脑上进行同个文件内容的创作。 在申请了公司电…

【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系

NIO与内存映射文件 Java类库中的NIO包相对于IO包来说有一个新功能就是 【内存映射文件】&#xff0c;在业务层面的日常开发过程中并不是经常会使用&#xff0c;但是一旦在处理大文件时是比较理想的提高效率的手段&#xff0c;之前已经在基于API和开发实战角度介绍了相关的大文…

Java Math类

JavaMath类\huge{Java \space Math类}Java Math类 Math类 包含执行基本数字运算的方法&#xff0c;Math类没有提供公开的构造器。 MathMathMath类本质就是一个工具类&#xff0c;提供许多方法用于其他类调用&#xff0c;但是无法创建子类对象。 常用方法 ①. abs()取绝对值…

CANoe测试的两种方式Test Module 和 Test Unit对比,你常用哪种呢?

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

前端接口联调时传的参数是array数组形式处理

情景&#xff1a;使用van-uolaoder组件上传多个图片后调用保存按钮&#xff0c;这时由于存在多张图片&#xff0c;调用接口时前端传的参数就是数组形式。&#xff08;前端传的数组要先转为字符串&#xff09; 处理方法是&#xff1a; 1. 先确定后端使用什么注解&#xff0c;如…

Gerb视图支持新表单和旧表单

Gerb视图支持新表单和旧表单 GerbView生产高级软件Companions&#xff0c;但也易于替换、打印和查看HPGL、HPGL/2、Excellon和国际象棋文件。该程序支持RS274D和RS274X。您可以使用此软件将旧格式和标准RS274D转换为具有默认信息的新类型RS274X。Gerbview将致力于展示和绘制您的…

计算机毕业设计django基于python租房系统-房屋租赁系统

项目介绍 在各学校的教学过程中,租房系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的租房系统的平台,这样可以有效地解决租房系统混乱的局面。 本文…

(P3)python类的特殊方法 init、getitem、len、call

python 类的特殊方法 参考资料 python解释器遇到特殊句法时&#xff0c;会去调用特殊方法&#xff0c;这些特殊方法以双下划线开头。 1、__init __ () 该方法在对象创建时被解释器自动调用。 2、__getitem __ () getitem 获取实例对象的具体内容 p[key] 3、__len __() len …

牛客挑战赛65 D.233求min(二维偏序 树状数组/cdq分治)

题目 给出长度为n(n<1e5)的序列a1,a2,...,an​和b1,b2,...,bn(-1e3<ai,bi<1e3)&#xff0c; 请你找出1≤l≤r≤n&#xff0c;使得min(alal1...ar, blbl1...br)最大&#xff0c;并输出这个值 思路来源 官方题解 LYC_music submission 题解 两种做法&#xff0c; …

Python模块和包的介绍(模块含义、用模块好处、模块分类、包和模块的创建)

&#x1f308; 个人主页&#xff1a;王子玉博客 &#x1f506; 免费专栏&#xff1a;Python基础教程、python常用模块 ❤️ 分享网站&#xff1a; 《Python自学网》&#x1f449;&#x1f449;基础入门到逐步深入 | 适合新手入门到精通 | web开发、爬虫、自动化运维、自动化…

yocto 自动挂载分区(基于stmp32mp1)

yocto 自动挂载分区&#xff08;基于stmp32mp1&#xff09; 上一章我们在stm32mp1开发板上实践了创建分区的过程&#xff0c;本节我们再来分析下上小节创建的分区开机时是怎么完成分区的自动挂载的。 答案就在systemd里面&#xff1a; 下面就来详细分析一下这个几个文件 mo…