分享自:

深入探讨函数内联及其对基于机器学习的二进制分析的安全影响

期刊:Network and Distributed System Security (NDSS) SymposiumDOI:10.14722/ndss.2026.241872

关于函数内联及其对基于机器学习的二进制分析安全影响的深度研究报告

本研究由韩国成均馆大学的 Omar Abusabha, Jiyong Uhm, Tamer Abuhmed 和 Hyungjoon Koo(通讯作者)共同完成,并于 2026 年 2 月 23-27 日在网络与分布式系统安全研讨会(Network and Distributed System Security Symposium,NDSS)上发表。

一、 研究背景与目标

本研究聚焦于计算机安全与软件工程交叉领域,特别是基于机器学习(Machine Learning,ML)的静态二进制分析。静态二进制分析是指在不执行程序的情况下,通过分析可执行文件(二进制文件)的机器指令、控制流图等特征来理解程序功能、检测漏洞或识别恶意软件。近年来,利用 ML 模型处理这些低级特征已成为提高分析效率与准确性的主流方向。

然而,二进制文件是由源代码经过编译器复杂的优化流水线生成的。其中,函数内联(Function Inlining)是一项被现代编译器(如 LLVM、GCC)广泛采用的优化技术。其核心思想是将被调用函数(callee)的代码体直接“嵌入”到调用者函数(caller)的调用点,以消除函数调用的开销,并可能开启进一步的优化机会。尽管这一优化旨在提升性能,但它会从根本上改变二进制文件的静态特征:内联函数的指令会与其调用者指令融合,原有的函数边界变得模糊,控制流图(Control Flow Graph,CFG)和调用图(Call Graph)的结构也随之发生显著变化。这给严重依赖这些静态特征的 ML 模型带来了潜在风险。

尽管函数内联的影响众所周知,但其对基于 ML 的二进制分析模型的具体安全影响(例如影响程度、是否可被恶意利用)在现有文献中尚未得到充分探索。许多相关研究要么低估、忽视内联的影响,要么仅采用启发式方法进行粗略处理。本研究旨在填补这一空白,首次从安全视角对函数内联进行系统性、全面的研究。具体目标包括: 1. 深入剖析编译器(以 LLVM 为例)内部函数内联的决策机制。 2. 探索能够显著提升内联比例的编译器选项组合,提出“极端内联”(Extreme Inlining)概念。 3. 系统评估函数内联(特别是极端内联)对多种基于 ML 的安全分析任务的影响,揭示其可能被用作逃避 ML 检测的攻击手段。

二、 研究详细流程

本研究工作流程可分为两大相辅相成的部分:首先是对函数内联机制本身的深入剖析与操控,其次是评估内联对 ML 安全模型的影响。

第一部分:函数内联决策机制探索与极端内联构建

  1. 决策流水线解构:研究者以 LLVM 编译器工具链为对象,详细剖析了函数内联的完整决策流程。如图 1 所示,该流程始于源码中的提示(如 inline 关键字、always_inline 属性)、优化等级(-O0 到 -O3, -Os, -Oz)以及众多编译器选项(详见表 II)。在编译时,Clang 前端会根据这些因素为函数标记内部属性。随后,在中间表示层,CGSCC 过程管理器会迭代地对调用图中的强连通组件调用内联过程。该过程的核心是一个成本模型(见图 2):它首先根据一系列内置启发式规则(详见表 III)排除不能内联的情况(如递归调用、间接调用),然后为每个候选调用点动态计算“成本”和“阈值”,当成本低于阈值时执行内联。成本与阈值的计算受多种条件影响(详见表 IV),并可通过特定编译器选项进行调整。链接时,若启用链接时优化,还可能进行额外的跨模块内联。
  2. 澄清误解与微妙之处:研究通过案例分析,澄清了关于函数内联的六个常见误解。例如:-O0 或 -fno-inline 选项不能阻止带有 always_inline 属性的函数被内联;被内联的函数不一定从二进制中完全消失(尤其是具有外部链接的函数);库函数也可能被内联等。这些澄清对于正确理解内联行为至关重要。
  3. 编译器选项探索与极端内联实现:为了主动、最大化地影响内联行为,研究者系统地探索了 LLVM 中影响内联成本模型的编译器选项。他们发现,通过组合调整特定的选项(尤其是提高 -inline-threshold 和降低 -inline-call-penalty 的值),可以驱使编译器执行远比标准优化等级(如 -O3)更激进的函数内联(见图 10)。结合链接时优化,他们实现了所谓的“极端内联”策略。实验表明,在 coreutils 软件包上,极端内联策略能达到 79.64% 的函数内联比例,远高于常规 -O3 优化下的比例(见图 11)。
  4. 内联比例与静态特征分析
    • 比例分析(研究问题 RQ6-RQ8):研究选取了 coreutils、nginx 等多个软件包,在不同优化等级和编译器选项下编译,并利用 DWARF 调试信息提取内联情况的真实数据。结果显示,内联比例因应用程序和构建配置差异巨大(见图 7、8)。例如,coreutils 在 -O3 下内联比例很高,而 nginx 则较低。-Os-Oz 由于注重代码大小,内联比例通常低于 -O3。这揭示了训练和评估 ML 模型时假设二进制特征具有一致性的潜在问题。
    • 静态特征影响分析(研究问题 RQ9):研究者使用工具提取了 62 项与指令、CFG、CG 相关的统计特征。通过比较 -O0 与极端内联编译的二进制,发现极端内联显著改变了这些特征(附录图 14)。例如,算术指令数量增加(可能由于多个调用点内联了算术操作函数),循环数量减少但单个循环的规模增大(可能由于循环展开等后续优化)。这直接证明了内联如何从根本上扰动 ML 模型所依赖的静态特征。

第二部分:函数内联对 ML 安全模型的影响评估

  1. 研究对象与模型选择:研究选择了五个具有代表性的、基于 ML 的二进制安全分析任务进行评估,共涉及 20 个独特的模型:
    • T1: 二进制代码相似性检测:选用 6 个模型(Asm2Vec, Gemini, Trex, SAFE, BinShot, JTrans)。
    • T2: 函数符号名预测:选用 2 个模型(AsmDepictor, SymLM)。
    • T3: 恶意软件检测:训练/实现了 6 个模型(逻辑回归、随机森林、CatBoost、KNN、CNN、DNN)。
    • T4: 恶意软件家族分类:使用与 T3 相同的 6 类模型。
    • T5: 漏洞检测:利用 BCSD 模型(Gemini, Asm2Vec, SAFE, Trex)通过代码搜索方式探测漏洞。
  2. 数据集构建:为公平评估,研究构建了包含良性和恶意软件的大规模数据集(见表 V)。良性软件包括 coreutils、OpenSSL 等常用工具,编译时生成非内联、常规内联和极端内联三种变体。恶意软件数据集聚焦 IoT 恶意软件(如 Mirai, Gafgyt),包含野外采集的样本和通过极端内联策略重新编译生成的“逃避变体”。
  3. 实验设计与流程(研究问题 RQ1-RQ5)
    • 对于每个 ML 任务,研究者准备了三类测试数据对:非内联样本对、常规内联样本对、极端内联样本对。
    • 使用标准指标(如准确率、精确率、召回率、F1 值、MRR)评估模型在不同测试集上的性能。
    • 通过对比模型在“非内联”与“内联/极端内联”样本上的表现,量化函数内联带来的性能影响。
  4. 关键实验结果
    • RQ1 (BCSD):如图 3 所示,大多数 BCSD 模型在面对内联样本时性能出现下滑,召回率下降尤为明显(意味着更多相似函数对被误判为不相似)。在极端内联下,性能下降更为显著(F1 平均下降 12.6%)。Asm2Vec 的表现异常,分析发现其性能受优化级别差异影响较大(见图 4)。
    • RQ2 (函数名预测):如图 5 所示,AsmDepictor 在常规内联下性能略有提升(可能受益于更多上下文),但在极端内联下 F1 值下降 23.99%。SymLM 在内联和极端内联下性能均大幅下降,极端内联时 F1 值暴跌 75.69%。
    • RQ3 (恶意软件检测) & RQ4 (家族分类):如表 VI 所示,所有 ML 模型对野外恶意软件检测和分类准确率都很高(~98%, ~87%)。然而,当测试经过极端内联重新编译的恶意软件变体时,所有模型性能均显著下降:恶意软件检测平均准确率下降约 20%,恶意软件家族分类平均准确率下降约 40%。这表明内联可以有效逃避检测。
    • RQ5 (漏洞检测):如表 VII 所示,在应用内联优化后,大多数漏洞检测模型的 MRR@100 分数平均下降了约 69%,表明内联使得定位已知漏洞函数变得更加困难。

三、 主要研究结果

  1. 函数内联决策机制的复杂性:研究详细揭示了 LLVM 中函数内联是一个受多因素(源码提示、优化等级、数十个编译器选项、成本模型启发式规则、链接时优化)影响的复杂、迭代决策过程。
  2. 极端内联的可行性:通过系统调整编译器选项(主要是 -inline-threshold-inline-call-penalty),可以构造出一种“极端内联”配置,使函数内联比例远超标准优化级别,在实验中最高达到 79.64%。
  3. 对 ML 安全模型的显著影响:广泛的实验证明,函数内联(尤其是极端内联)会显著降低多种基于 ML 的二进制安全分析模型的性能。这种影响在恶意软件检测、家族分类和漏洞检测等任务中表现为有效的逃避攻击手段。
  4. 内联行为的多样性与不一致性:函数内联的比例和效果高度依赖于具体的应用程序源码特性和构建配置,这挑战了 ML 模型训练和评估中常假设的二进制特征一致性前提。

四、 研究结论与价值

本研究得出核心结论:函数内联虽然是一种善意的编译器优化,但其深刻改变二进制静态特征的能力可被攻击者恶意利用,通过简单的重构编译(无需修改源码或编译器本身)生成能够逃避基于 ML 的安全检测模型的二进制变体。 这暴露了当前严重依赖静态特征的 ML 安全模型的脆弱性。

科学价值: 1. 系统性贡献:这是首个全面、深度聚焦于函数内联安全影响的研究,填补了该领域的知识空白。 2. 机制深入理解:超越了现象观察,深入编译器内部,阐明了内联决策的成本模型和可操控的“旋钮”。 3. 新攻击面揭示:提出了“极端内联”作为一种新的、实用的软件变异/逃避技术,其威胁模型现实(仅需调整编译标志),且效果显著。 4. 评估基准:通过大规模的实验和数据集,为后续研究评估 ML 模型对内联的鲁棒性提供了基准。

应用价值与重要观点: 1. 对攻击者的启示:提供了一种隐蔽且有效的逃避 ML 检测的方法,仅需控制构建过程即可实现。 2. 对防御者与模型开发者的警示:强调了在设计基于 ML 的二进制分析工具时,必须充分考虑编译器优化的影响,特别是函数内联。不能假设训练和部署环境中的二进制具有相似的优化特征。 3. 缓解方向建议:研究在讨论部分提出了潜在的缓解措施,例如在训练数据中增加内联变体、采用对抗性训练纳入编译器感知的变换、或使用反内联启发式方法进行预处理。

五、 研究亮点

  1. 研究视角新颖:首次将函数内联这一传统编译器优化置于 ML 安全对抗的背景下进行系统性审视。
  2. 研究深度与系统性:从编译器内部机制剖析,到外部选项探索(极端内联),再到对五大类安全任务、20个模型的广泛评估,构成了一个完整、深入的研究链条。
  3. 威胁模型现实:所提出的攻击方法无需复杂混淆或编译器篡改,仅利用合法的编译器配置选项,具有很高的现实可操作性。
  4. 发现重要:明确证实了通过操控标准编译流程即可有效逃避先进的 ML 检测模型,这一发现对安全社区具有重要的警示意义。

六、 其他有价值内容

研究还探讨了不同编译器(GCC vs LLVM)及版本在内联行为上的差异(见图12),指出 GCC 的行为可能更加多变。同时,作者指出了依赖 DWARF 信息获取内联真实情况时可能存在的遗漏案例(如死代码消除导致的内联函数完全消失),并开放了研究中使用的数据集、分析代码和模型以供未来研究复用。这些内容增加了研究的严谨性和可重复性。

上述解读依据用户上传的学术文献,如有不准确或可能侵权之处请联系本站站长:admin@fmread.com