关于函数内联及其对基于机器学习的二进制分析安全影响的深度研究报告
本研究由韩国成均馆大学的 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 安全模型的影响。
第一部分:函数内联决策机制探索与极端内联构建
inline 关键字、always_inline 属性)、优化等级(-O0 到 -O3, -Os, -Oz)以及众多编译器选项(详见表 II)。在编译时,Clang 前端会根据这些因素为函数标记内部属性。随后,在中间表示层,CGSCC 过程管理器会迭代地对调用图中的强连通组件调用内联过程。该过程的核心是一个成本模型(见图 2):它首先根据一系列内置启发式规则(详见表 III)排除不能内联的情况(如递归调用、间接调用),然后为每个候选调用点动态计算“成本”和“阈值”,当成本低于阈值时执行内联。成本与阈值的计算受多种条件影响(详见表 IV),并可通过特定编译器选项进行调整。链接时,若启用链接时优化,还可能进行额外的跨模块内联。-fno-inline 选项不能阻止带有 always_inline 属性的函数被内联;被内联的函数不一定从二进制中完全消失(尤其是具有外部链接的函数);库函数也可能被内联等。这些澄清对于正确理解内联行为至关重要。-inline-threshold 和降低 -inline-call-penalty 的值),可以驱使编译器执行远比标准优化等级(如 -O3)更激进的函数内联(见图 10)。结合链接时优化,他们实现了所谓的“极端内联”策略。实验表明,在 coreutils 软件包上,极端内联策略能达到 79.64% 的函数内联比例,远高于常规 -O3 优化下的比例(见图 11)。-Os 和 -Oz 由于注重代码大小,内联比例通常低于 -O3。这揭示了训练和评估 ML 模型时假设二进制特征具有一致性的潜在问题。第二部分:函数内联对 ML 安全模型的影响评估
三、 主要研究结果
-inline-threshold 和 -inline-call-penalty),可以构造出一种“极端内联”配置,使函数内联比例远超标准优化级别,在实验中最高达到 79.64%。四、 研究结论与价值
本研究得出核心结论:函数内联虽然是一种善意的编译器优化,但其深刻改变二进制静态特征的能力可被攻击者恶意利用,通过简单的重构编译(无需修改源码或编译器本身)生成能够逃避基于 ML 的安全检测模型的二进制变体。 这暴露了当前严重依赖静态特征的 ML 安全模型的脆弱性。
科学价值: 1. 系统性贡献:这是首个全面、深度聚焦于函数内联安全影响的研究,填补了该领域的知识空白。 2. 机制深入理解:超越了现象观察,深入编译器内部,阐明了内联决策的成本模型和可操控的“旋钮”。 3. 新攻击面揭示:提出了“极端内联”作为一种新的、实用的软件变异/逃避技术,其威胁模型现实(仅需调整编译标志),且效果显著。 4. 评估基准:通过大规模的实验和数据集,为后续研究评估 ML 模型对内联的鲁棒性提供了基准。
应用价值与重要观点: 1. 对攻击者的启示:提供了一种隐蔽且有效的逃避 ML 检测的方法,仅需控制构建过程即可实现。 2. 对防御者与模型开发者的警示:强调了在设计基于 ML 的二进制分析工具时,必须充分考虑编译器优化的影响,特别是函数内联。不能假设训练和部署环境中的二进制具有相似的优化特征。 3. 缓解方向建议:研究在讨论部分提出了潜在的缓解措施,例如在训练数据中增加内联变体、采用对抗性训练纳入编译器感知的变换、或使用反内联启发式方法进行预处理。
五、 研究亮点
六、 其他有价值内容
研究还探讨了不同编译器(GCC vs LLVM)及版本在内联行为上的差异(见图12),指出 GCC 的行为可能更加多变。同时,作者指出了依赖 DWARF 信息获取内联真实情况时可能存在的遗漏案例(如死代码消除导致的内联函数完全消失),并开放了研究中使用的数据集、分析代码和模型以供未来研究复用。这些内容增加了研究的严谨性和可重复性。