经典思辨|WaDec:使用大语言模型反编译WebAssembly
文摘
科技
2024-09-30 16:00
北京
本文对发表在ASE’24上的论文《WaDec: Decompile WebAssembly Using Large Language Model》进行解读。WebAssembly (Wasm) 被广泛应用于Web、区块链、物联网和云计算等领域,但其二进制格式使得分析与调试变得极为困难。传统反编译工具的可读性有限,而最新的大型语言模型(LLM)虽然在代码相关的任务中表现优异,但处理Wasm反编译任务时仍面临挑战。论文提出的WaDec是首个利用微调LLM的方法,将Wasm代码分解并生成更易理解的源代码,在代码可读性上取得了较好的效果。
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。Wasm 作为一种轻量、高效的二进制码,被广泛应用于区块链、物联网和云计算等领域。然而,由于其低级二进制格式,针对Wasm的分析与理解极为困难。理解Wasm二进制码的一种方式是将其反编译为可读的高级语言。目前,已有的传统Wasm反编译工具如Ghidra、Wasm2c等,常常产生臃肿且可读性差的代码。即使一些基于LLM的通用反编译工具在一般二进制文件方面取得成功,但在处理Wasm时仍面临独特的挑战。其一,与一般的二进制文件不同,Wasm 缺乏对复杂数据结构、基于堆栈的架构和线性内存模型的支持,提高了性能但降低了可读性;其二,Wasm 的冗长文本表示(通常长达数千行)使反编译变得复杂,导致使用现有的基于LLM的方法时效果显著下降。为了解决这些问题,论文引入了一种新方法WaDec,它利用微调的LLM来反编译Wasm代码,将其转换为更易于理解、更高级别的源代码表示形式。表1对WaDec和已有Wasm反编译工具进行了对比。
表1:Wasm反编译的方法对比
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。WaDec的设计核心是利用微调的大型语言模型(LLM)处理WebAssembly(Wasm)二进制代码,并将其反编译为更高层次、易于理解的源代码表示形式。这个系统设计分为几个关键步骤:1. 数据集构建:鉴于Wasm是相对较新的技术,当前没有专门的反编译数据集,论文构建了自己的数据集,包括了从C语言程序编译生成的Wasm文件。数据集的特征包括更细粒度的Wasm(wat)片段和相应的C代码片段。C代码中的字符串常量被替换为格式化字符串,并记录了偏移地址映射,从而为反编译过程提供必要的上下文信息。这些上下文信息可以辅助LLM根据Wasm的结构化特征进行反编译。2. 数据预处理:为了降低输入片段的复杂性并提高模型的反编译效率,WaDec采用了结构化切片策略,将wat代码按照block分割为更小的片段。每个片段通常包含一个循环语句或条件语句,并利用空间和时间信息来补充切片片段中缺失的信息。为了统一反编译后变量命名的一致性,WaDec实现了统一变量重命名方案,确保不同片段中的变量保持一致,进而更好地还原易于理解的源代码。3. 大语言模型微调和推理:WaDec基于CodeLlama-7b-hf模型,经过微调后专门适应Wasm反编译任务。在反编译过程中,模型不仅要理解Wasm的复杂结构,还要生成符合源代码逻辑的C代码片段。通过自监督学习技术,模型能够有效地处理wat片段并生成对应的C代码。在推理过程中,模型根据输入的wat代码片段生成相应的C代码,并结合提示的时间和空间信息,确保生成的C代码保持逻辑一致性和可读性。图1:WaDec工作流程
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。表2:实验结果对比
1. 相似性和准确性:在代码相似性方面,WaDec在多项指标上超越了现有最先进的工具。AST编辑距离(AED)比Ghidra高出185%,圈复杂度(CNN)提高了8%,而余弦相似度(COS)更是提升了41%。这些结果表明,WaDec在保持代码结构方面——尤其是精确重建复杂循环结构——的卓越性能。此外,WaDec的CodeBLEU得分远高于基线工具,显示其在恢复代码语法和结构方面的能力。2. 可读性:WaDec的代码膨胀率仅为3.34%,相比其他工具大幅减少,尤其是Ghidra的116.94%和Wasm2c的964.84%。这意味着WaDec生成的代码更加紧凑且易于阅读。此外,WaDec在语法完整性方面也表现出色,达到0.8906,明显高于其他工具。3. 可重用性:WaDec在代码的可重编译、执行方面表现出色,显著超过基线工具。这表明,WaDec生成的代码不仅具有高度的可读性,还能够成功编译和执行,展示了其在真实环境中处理复杂Wasm代码的实际应用能力。MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。WaDec使用微调的 LLM 实现了更高效、更可读的Wasm反编译结果。该模型在wat2c数据集上进行自监督学习微调,提高了反编译效率。论文的结果表明,WaDec 的性能显著优于现有工具,实现了最低的代码膨胀率并保持了较高的可重新编译执行率。Wasm反编译任务的效果提升不仅增强了 Wasm 代码的可读性和可分析性,还为更强大的自动化代码分析、优化和安全审计流程铺平了道路
编辑:刘牧耕
原文作者:Xinyu She, Yanjie Zhao, Haoyu Wang