admin管理员组

文章数量:1590328

文章目录

    • Cross-Language Binary-Source Code Matching with Intermediate Representations
      • abstract
      • introduction
      • Motivation
        • Cross-language code clone detection
        • Cross-Language Binary-Source Code matching
      • Priliminaries
        • Intermediate Representation
        • Code embedding
        • problem formulation
      • Cross-Language binary-source code matching
        • Overview
        • Transforming Source and Binary Code into IRs
        • Transformer-based LLVM-IR embedding
        • Model Learning
        • Code Matching
      • Experimental Setup
        • Research Questions
        • Evaluated Tasks and Dataset
          • 跨语言的源-源代码匹配
          • 跨语言二进制-源代码匹配
          • 单语言匹配
          • 预训练数据集
        • Baseline
        • Evaluation Metrics
      • Experimental Result And Analysis

Cross-Language Binary-Source Code Matching with Intermediate Representations

SANER 2022 B类会议

华科

abstract

Binary-source code matching plays an important role in many security and software engineering related tasks such as malware detection, reverse engineering and vulnerability assessment.

漏洞评估

Currently, several approaches have been proposed for binary-source code matching by jointly learning the embeddings of binary code and source code in a common vector space.

几种二进制源码匹配方法提出基于二进制代码和源码在公共向量空间联合学习的方法

Despite much effort, exiting approaches target on matching the binary code and source code written in a single programming language.

However, in practice, software applications are often written in different programming languages to cater for different requirements and computing platforms.

迎合不同的需求和计算平台

Matching binary and source code across programming languages introduces additional challenges when maintaining multi-languages and multi-platform applications.

To this end, this paper formulates the problem of cross-language binary-source code matching, and develops a new dataset for this new problem.

制定了跨语言二进制源码匹配,并且开发了一个新数据集

We present a novel approach XLIR, which is a Transformer-based neural network by learning the intermediate representations for both binary and source code.

To validate the effectiveness of XLIR, comprehenseve experiments are conducted on two tasks of cross-language binary-source code matching, and cross-language source-source code matching, on top of our curated dataset.

Experimental results and analysis show that our proposed XLIR with intermediate representations significantly outperforms other state-of-th-art models in both of the two tasks.

intermediate 中间

outperforms 表现优于

introduction

最近有研究者开始调查二进制到源码匹配问题,例如二进制代码出处和在开源软件上的二进制到源码的重用检测。这些方法都提取了二进制代码和源码的语义特征,并且提出两个编码网络将它们表示为两个隐藏向量。

检测使用不同编程语言写的代码克隆程序在文献中仅取得微弱的进步。但实际上,软件应用经常使用不同的编程语言编写以迎合不同的平台。

当前的方法旨在以端到端的方法对齐二进制代码和源代码的语义嵌入。

核心见解。 在编译器中中间表示支持多种前端编程语言例如c和java,和多种后端架构例如arm和mips。也就是说中间表示通常独立于编程语言和计算架构。也即是中间表示通过共享相似的词汇和语法结构可以显著性的减少二进制代码和源代码之间的gap,

如下图所示,一个简单的循环 源码和二进制代码生成对应的LLVM-IR,具有相似的语义:

  • 源码->LLVM-IRs 使用LLVM Clang工具,https://clang.llvm/
  • 二进制代码->LLVM-IRs,使用RetDec工具,https://retdec/

作者首先将源码和二进制转为中间表示,而后使用基于Transformer的神经网络,该网络经过在LLVM-IR语料库上与训练,而后映射到一个公共空间,并用三元组损失函数共同学习。

Motivation

Cross-language code clone detection

在跨语言的代码检测中,核心见解是虽然源代码片段使用的不同编程语言,但他们可能会共享相同的语义。

Cross-Language Binary-Source Code matching

  • 场景1:漏洞模式检出:给定源代码中存在漏洞,那么去寻找使用其他语言写的二进制文件是否有类似后门是必要的
  • 场景2:版权保护分析:给定二进制库文件,匹配它是否存在OSS的库文件中,然后可以检查是否匹配license

Priliminaries

Intermediate Representation

中间表示是具有简单语法规则的定义清晰和良好格式的程序表示,通常是编译器从源代码到目标代码之间的转换。

现代编译器首先解析源代码,然后翻译成IR,然后从中间表示生成目标代码。

这种附加层具有双向独立属性,即IR是独立于源代码和目标机器代码的,但保留了程序的语义。

因此,IR组成了跨语言匹配方法的基础。

Code embedding

代码嵌入也称为代码表示学习,旨在保留程序的语义分配到向量中。

当前代码嵌入分为4类:

  • Token序列
  • AST
  • IR
  • Code graph

基于token序列的代码表示方法是很自然的,它反映了代码的词汇信息。

为了表示代码的结构信息,一些工资提出使用结构化神经网络(TreeLSTM和GGNN)来表示AST和Code graph(CFG和DFG)。

最近的一些工作提出使用IR来表示代码的低级信息。

problem formulation

S指源代码,B指二进制文件,V指IR的embedding表示,J指衡量相似程度的距离函数如余弦函数。

Cross-Language binary-source code matching

Overview

上图描述了XLIR的整个架构表示,模型训练阶段由下面3个步骤组成:

  1. 将源代码和二进制转换为IR表示,当前支持c,c++和java语言
    • LLVM Clang 将c和c++转为IR,https://clang.llvm/
    • Jlang和Polyglot 将Java转为IR https://polyglot-compiler.github.io/JLang/ https://www.cs.cornell.edu/projects/polyglot/
    • RetDec反汇编将非混淆的二进制文件转为IR
  2. 将IR表示为embedding嵌入,使用IR-BERT
    • 预训练了一个掩码语言模型在大型的IR语料库中
    • follow的CodeBert和OSCAR的工作
  3. 模型学习,为了相关成对的源码和二进制代码的关系,作者映射它们到一个公共的特征空间,并且联合学习它们的相关性。

代码匹配阶段,使用余弦距离测量二进制代码和源码的语义相似性,匹配的分数如果超过预定义的阈值则指示二进制代码和源代码是匹配的。

Transforming Source and Binary Code into IRs

为了不失一般性,作者选择c,c++和java作为跨语言场景的编程语言,因为解析器在这些成熟的程序语言中已经有了很大的发展。

作者选择LLVM-IR作为中间表示,因为:

  1. LLVM-IR是与源代码语言独立的,这会在不同编程语言的前提下 共同于一会保持相似的IR结构。
  2. LLVM-IR是与目标无关的,从LLVM-IR转换为任何目标相关的汇编代码在实践中很容易
  3. LLVM-IR被社区广泛认可,可以简化代码转换,例如反汇编,优化和语义提取。

为了避免编译时函数名、变量名等字符串信息泄露到二进制文件中,作者在编译时将-s参数传递给编译器,以剥离所有调试信息。

LLVM-IR有两种不同的表现形式,它们持有完全相同的语义信息。

  • Bitcode格式 是专门为机器处理而设计的,例如代码转换和自动优化
  • 机器IR格式,具备人类可读性,广泛用于程序调试和分析。

作者选择使用bitcode格式作为IR的通用表示进行代码嵌入。

Transformer-based LLVM-IR embedding

作者采用了transformer为IR嵌入表示,transformer是一种基于自注意力机制的并且在源代码嵌入表示非常流行的模型。

预训练阶段是follow的How could neural networks understand programs?这篇工作,发表在ICML2021上。

首先在大规模的外部IR语料库中预训练了一个掩码语言模型,称为IR-BERT。然后将参数转到作者的模型中。

给定一个LLVM-IR语料库,使用Byte Pair Encoding(BPE)令牌化为一系列的token。

Neural machine translation of rare words with subword units

在预训练之前,将两个段的拼接作为输入,两个段由特殊的分隔符SEP拼接,每个序列的第一个和最后一个标记由CLS和EOS填充。

然后将连接的句子作为输入输入到transformer编码器中,在编码语言建模中,输入句子的令牌会被随机采样并替换为MASK,作者选择15%的输入进行替换,并在选定的输入中80%被MASK替换,10%不变,剩下10%随即替换为词汇表中选择的token。

Bert: Pre-training
of deep bidirectional transformers for language understanding

Model Learning

设定三元组指代训练实例:

<b, s^+, s^->

b代表二进制代码,s+代表对应的源代码,s-代表在源代码文件中随机选择的代码片段;

当训练该三元组时,XLIR预测余弦相似度对于每个<b, s+>和<b,s->实例对,并且最小化排名loss。

rank loss出处:Deep code search

其中D代表训练数据集,sim代表源代码和二进制代码的相似度分数,ə是一个小的常量值,作者默认使用0.06。

Code Matching

在推理阶段,给定一个二进制文件b和一堆源代码文件S,对于每个源代码s属于S,作者首先将二进制文件和源代码通过训练模型得到对应的嵌入表示,然后计算b和s的余弦距离。

如果余弦距离大于阈值,那么则认定二进制和源代码匹配上了,否则不匹配。一般采用80%作为阈值。

Experimental Setup

Research Questions

构建实验以回答以下问题:

  1. XLIR是否在跨语言代码匹配中更有效
  2. XLIR在但语言中代码匹配效果如何
  3. 该方法能否扩展以有效检测代码函数克隆
  4. XLIR的主要影响因素是什么
Evaluated Tasks and Dataset
跨语言的源-源代码匹配

该任务主要为了检测不同编程语言的源代码克隆。该任务之前在下文中已研究。该文使用CLCDSA数据集,四种不同的编程语言,C++,C#,Java,Python等,在两个在线oj竞赛平台收集代码。每个编程问题都关联有多个不同语言实现的解决方案。

Clcdsa: cross language code clone detection using syntactical features and api
documentation

  • Atcoder
  • Google Code Jam

作者选择使用c,c++和java作为学习语言,所有源代码都应该被编译,并且过滤掉无法被编译成功的文件,按照6:2:2划分训练集验证集和测试集。上表显示了统计信息。

跨语言二进制-源代码匹配

当前没有此类数据集,作者基于CLCDSA策划了一个新数据集,该数据集将一种编程语言的源代码编译成二进制代码,同时保持另一种编程语言的源代码不变。具体来说,作者将将一个源文件编译为32个不同的目标文件:

  • 使用了两个编译器:GCC和LLVM Clang
  • 四个优化选项:-O0,-O1,-O2和-O3
  • 跨平台:x86-32, x86-64,arm-32,arm-64
单语言匹配

使用POJ-104数据集,由50000个C和C++编写的程序组成。

预训练数据集

作者在一个大规模的IR语料库中训练IR-BERT,采用How could neural
networks understand programs?文章的数据集,由11个现实世界六i选哪个的软件组成:Linux-vmlinux、Linux-modules、GCC、MPlayer、OpenBLAS、PostgreSQL、Apache、Blender、ImageMagcick、Tensorflow、Firefox。使用-O0优化级别的LLVM Clang将这些软件编译为IR,从855792个函数中获得了48023781条IR指令。

Baseline

跨语言二进制-源代码匹配的baseline:

  • BinPro,提取函数调用图在二进制和源代码中,使用匈牙利算法匹配
  • B2SFinder,在3个测度(字符串,数字,控制流)提取7个特征,引入了一个加权匹配算法来匹配
  • XLIR(LSTM),使用LSTM编码IR

跨语言源代码-源代码匹配:

  • LICCA, 基于代码的句法和语义特征检测源代码克隆
  • XLIR,使用LSTM编码IR
Evaluation Metrics

recall、precision、F1

Experimental Result And Analysis

本文标签: 软件NLP