引言 (Introduction)
- 问题背景
:软件漏洞对计算机系统安全构成重大威胁。2023 年报告了 28,902 个漏洞。PHP 作为最流行的 Web 应用程序语言之一,为近 80% 的顶级网站提供支持,但也容易受到 SQL 注入和跨站脚本 (XSS) 等常见 Web 安全漏洞的影响。因此,有效检测 PHP 软件漏洞变得尤为重要。 - 传统方法局限
:传统的静态应用安全测试 (SAST) 工具(如 CodeQL, RIPS, SonarQube, Fortify SCA, Checkmarx)受限于其规则库的全面性和精确性,常导致高误报和漏报率。此外,CodeQL 尚不支持 PHP 语言。 - 深度学习与 LLM 的兴起
:研究者开始探索深度学习和 LLM 在漏洞检测中的应用。然而,现有 LLM 方法主要依赖 C/C++ 语言的漏洞数据集,忽略了其他语言(如 PHP),并且数据收集和预处理存在挑战。 - RealVul 的贡献
:RealVul 旨在解决这些问题,提出一个 LLM-based 框架,用于 PHP 漏洞检测。通过漏洞候选检测、数据预处理和改进的数据合成方法,RealVul 能够有效提升 LLM 的漏洞检测能力和泛化性能。
相关工作 (Related Works)
-
现有数据集:
- 合成数据集
:如 SARD 和 Juliet,虽然标签准确,但缺乏噪声和上下文信息,未能完全封装实际漏洞的复杂性。 - 真实项目衍生数据集
:通常基于漏洞修复来收集数据(如 Devign, Reveal, Big-Vul, D2A, CrossVul, DiverseVul)。然而,这种方法存在准确性、唯一性等问题,且样本与漏洞之间的关联可能不强。 -
现有方法:
- 深度学习模型
:早期研究主要使用 RNN 和 GNN。例如,µVulDeePecker 使用 token-based 方法和 BLSTM 网络,SySeVR 结合语义信息。图神经网络 (GNN) 方法如 Devign 和 Reveal 利用代码属性图 (CPG),LineVD 使用程序依赖图 (PDG),VulChecker 结合 ePDG 和 S2V。 - LLM 方法
:随着自然语言处理的发展,CodeBERT 等模型展现了代码理解和生成能力。LineVul 和 DiverseVul 等工作开始将 LLM 应用于漏洞检测。但这些方法通常过度依赖现有数据集,缺乏合理的漏洞代码预处理,导致对未知项目的分析不可靠。 -
RealVul 的区别:RealVul 通过定位漏洞触发点、代码切片、无关信息置换、去除相似样本等方式合理处理样本,并使用更先进的代码 LLM 进行分析以实现卓越性能。
LLM赋能安全领域前沿研究“甚少”
PHP是网页开发中最常用的语言之一,约有80%的前1000万网站使用PHP(如Facebook、WordPress等),并且在GitHub上诞生了超330万个开源项目。然而PHP易受到常见Web漏洞(如SQL注入、XSS)的攻击,因此有效检测PHP漏洞至关重要。
静态分析缺陷
传统的静态检测工具(如CodeQL、RIPS、SonarQube等)依赖规则库覆盖,其规则不够完备且易产生大量误报漏报;并且CodeQL尚不支持PHP语言。
以往大多数数据集以及检测方法都是静态分析以及其他语言:
DL、LLM相关工作少
近期研究开始尝试深度学习和LLM方法检测漏洞,但大多聚焦于C/C++语言,PHP相关工作缺乏
数据集缺陷
-
许多漏洞数据集,大致可分为两类:合成数据集和来自真实项目的数据集。合成数据集过于简化和孤立,虽然包含准确的标签,但缺乏噪声和上下文信息,无法完全体现现实世界漏洞的复杂性。 -
为了弥补合成数据集的局限性,一些研究人员建议基于漏洞修复来收集数据。而一个潜在的 PHP 漏洞修复案例。该漏洞的执行路径经过三个函数。该方法在抽取样本时,会根据该函数是否已修复,将漏洞的执行路径拆分为四个样本。在模型训练过程中,样本之间的相关性会被忽略,导致模型难以仅基于该数据集识别漏洞。如下图所示

核心目标
本文的核心目标是设计一个针对PHP漏洞检测的LLM框架RealVul,以弥补现有研究的不足。具体而言,关注如何从真实项目中定位漏洞触发点并提取有效样本、如何通过代码预处理突出漏洞特征、以及如何利用半合成数据扩充稀缺样本,从而使预训练的代码LLM更好地识别PHP中的XSS(CWE-79)和SQL注入(CWE-89)漏洞。希望通过RealVul框架验证:结合漏洞候选检测、程序切片、数据预处理和数据合成的方法,是否能显著提升LLM对PHP漏洞的检测效果和泛化能力。
RealVul:核心框架
框架流程图:
RealVul框架由样本选择、数据预处理和模型训练三部分组成。具体流程如下:
- 漏洞候选点识别与程序切片
:利用启发式规则定位代码中可能触发漏洞的语句(如字符串拼接等)。针对每个潜在触发点,去除代码注释,生成抽象语法树 (AST),并基于 AST 提取全局代码、函数代码以及控制流和数据流,保留与触发点数据流和控制流相关的语句。如果触发点在函数内部,则将函数输入视为全局变量(如转写为 $_GET格式),并将函数代码转换为全局代码。来标准化函数代码和全局代码的不同表示形式。完成漏洞候选检测后,使用代码注释在潜在漏洞触发点处标记污点变量,以增强样本的漏洞表示
细节流程如下实例:

-
数据预处理:对提取的代码片段进行标注、归一化和去重。每个样本根据其“污点”变量是否可能导致漏洞分别标记为有漏洞/无漏洞。归一化时,去除长常量字符串等无关信息,并对变量名进行标准化映射(如“var0、var1”),以突出漏洞语义;用户定义的函数名保留不变以保持函数行为信息。归一化后,基于序列相似度去重,删除高度重复的代码片段,避免训练集存在冗余。
-
模型微调:使用低秩自适应(LoRA)技术微调多种预训练代码LLM(如CodeT5、CodeT5+、StarCoder2、CodeLlama等)来做二分类任务。针对不同漏洞类型(CWE-79、CWE-89),分别训练独立模型以提高检测针对性。
-
数据合成:为缓解真实样本不足的问题,RealVul借鉴其他论文研究思路,将简化后的漏洞片段(尽量较短的数据流和较简单的分支)插入到真实项目的函数中,再次切片和预处理,生成大规模半合成数据集。该方法使得LLM在训练时可以接触到更多具有代表性的PHP漏洞样本
实验过程和结果 -
实验设计:
-
D_real:通过 RealVul 框架从 CrossVul 数据集收集的真实世界漏洞数据集。 -
D_syn:通过 RealVul 数据合成算法从 D_real 和 SARD 数据集合成的大规模数据集。 -
D_rep:基线方法使用的数据集,通过比较漏洞修复前后的代码差异获得。 - EXP3: 消融研究 (Ablation Study)
:研究规范化和模型微调对性能的影响,并与上下文学习方法进行比较。 -
EXP1: 有效性 (Effectiveness):在随机划分的训练、验证和测试集上比较 RealVul 与基于漏洞修复数据集微调的 LLM 的性能。
-
EXP2: 泛化性 (Generalization):测试集数据对于微调的 LLM 是未知的,即训练、验证和测试集来自不同的项目源。此外,与 RIPS 和 Fortify SCA 等传统 SAST 工具进行比较。
-
评估指标:准确率 (accuracy)、召回率 (recall)、精确率 (precision) 和 F1 分数。
-
LLM 模型:使用 CodeT5-base, CodeT5p-770m, CodeLlama-7b, StarCoder2-3b, StarCoder2-7b。
-
数据集:
-
有效性:
- 结果
:RealVul 在 CWE-79 (XSS) 和 CWE-89 (SQLI) 上表现出色,尤其在 F1 分数方面。即使 CWE-89 的真实数据样本量较小,评估结果也相对稳定。 - 与基线对比
:RealVul 显著优于基线方法,F1 分数远超 50%。CodeLlama-7b 和 StarCoder2-3b 与 RealVul 结合表现最佳。 - 优势分析
:RealVul 的采样和处理技术使代码更好地表示漏洞特征,从而增强 LLM 的检测性能。 -
泛化性:
- 结果
:RealVul 在来自不同数据源的测试集上表现出更优异的泛化性能,F1 分数显著超过基线。 - 与 SAST 工具对比
:RealVul 在 CWE-79 上略逊于传统 SAST 工具,但在 CWE-89 上明显优于 SAST 工具。这是因为 RealVul 能够更全面地识别 SQL 漏洞。 - 模型分析
:参数数量对 LLM 的漏洞检测能力影响很小,较小的模型(如 CodeT5 和 CodeT5p)也具有足够的分析能力。RealVul 通过漏洞候选检测和预处理减少了单个样本代码长度,突出了潜在漏洞触发相关信息,降低了模型的分析能力需求。
根本原因如下图所示SQL注入的检测更有优势:

-
消融研究:
- 规范化影响
:规范化处理在大多数情况下是必要的,最大 F1 分数差异达到 14.06%,表明适当减少无关语义信息有助于 PHP 漏洞检测任务。 - 模型微调必要性
:实验结果显示,上下文学习方法与 RealVul 之间存在显著性能差距,证实了微调的必要性

在此解释一下各个评测维度的实际意义,方便是师傅们理解
|
|
|
|
|---|---|---|
| Accuracy(准确率) |
|
|
| Recall(召回率) |
|
|
| Precision(精确率) |
|
|
| F1分数 |
|
|
局限性
-
针对每种类型的 CWE 漏洞专门调整了模型,以增强检测能力。这种方法会产生大量开销,统一的多分类模型的性能值得研究。 -
缺乏有效的漏洞样本标记方法,这导致只能手动标记样本和数据合成来弥补数据量的不足。因此,数据集的有效性可以进一步提高。 -
采用了基于启发式规则的方法来识别潜在的漏洞触发语句,这些规则库仍然需要在我们的框架中进行扩展或修改,以适应新的漏洞模式或更新的编程实践。一方面,框架函数本身无法匹配所有潜在的漏洞点。另一方面,匹配到的 SQL 执行函数也无法判断是否内置了 SQL 注入漏洞的过滤器 -
与函数级和项目级数据集相比,提供的下文信息相对有限。 ### New Ideas for Future Research
基于上述分析和局限性,我们可以思考未来的新的研究思路:
-
高级函数语义分析与规范化:
- 构建函数调用图和控制流图
:在规范化阶段,不仅保留用户定义函数名,还可以构建完整的函数调用图和控制流图,分析函数的内部行为和数据流。这将有助于 LLM 更好地理解函数的功能和潜在的漏洞传播路径。 - 基于功能语义的函数名标准化
:研究如何根据函数的实际功能对其名称进行更高级的标准化,而不仅仅是保留。例如,将所有实现“清理”功能的函数统一为 sanitize_data()。 - 融合代码注释中的功能信息
:开发方法从代码注释中提取关于函数功能、输入输出和安全假设的信息,并将其作为附加上下文集成到 LLM 的输入中,以增强模型的语义理解。 -
统一的多分类漏洞检测模型:
- 多任务学习 (Multi-Task Learning)
:探索构建一个能够同时检测多种 CWE 类型的统一 LLM 模型,而不是为每种类型单独训练。这可以减少训练开销,并可能通过共享不同漏洞类型之间的特征表示来提高整体性能。 - CWE 层次结构嵌入
:利用 CWE 的层次结构,将漏洞类型编码为嵌入向量,让模型理解不同漏洞之间的关系,从而更好地泛化。 -
自动化/半自动化漏洞样本标签与增强:
- 符号执行/污点分析辅助标签
:结合符号执行 (Symbolic Execution) 或更高级的污点分析 (Taint Analysis) 工具,自动化识别代码中的污点源、传播路径和汇点,从而生成更准确、更丰富的漏洞标签。 - 主动学习 (Active Learning) 机制
:引入主动学习策略,让人工专家只对模型最不确定的样本进行标签,从而高效地扩充高质量的标签数据集。 - 更复杂的代码变换与合成
:除了简单的插入,研究更高级的代码变换技术(如控制流混淆、数据流重排、变体生成)来合成更多样化、更具挑战性的漏洞样本,以提高模型的鲁棒性。 -
动态自适应的漏洞触发规则识别:
- 基于机器学习的规则生成
:不再依赖纯粹的启发式规则,而是使用机器学习模型(例如,通过少量人工标记的样本训练)来识别新的漏洞触发模式,实现规则库的动态更新和扩展。 - 结合静态分析工具的反馈
:将 RealVul 与现有的 SAST 工具相结合,利用 SAST 工具的发现作为 LLM 训练的弱标签或反馈信号,以迭代改进 LLM 的触发规则识别能力。 - 上下文敏感的触发点识别
:研究如何让 LLM 在识别潜在漏洞触发点时,不仅考虑语句本身,还能结合其所在函数的上下文、文件甚至整个项目的配置和依赖关系。 -
增强 LLM 的可解释性与交互性:
- 可视化漏洞检测路径
:开发工具可视化 LLM 在代码中识别出漏洞的关键路径和证据,帮助开发人员理解漏洞的性质和修复方案。 - 生成修复建议
:在检测到漏洞后,让 LLM 不仅报告漏洞,还能根据上下文生成具体的修复建议,甚至直接提供代码补丁。 - 交互式调试与分析
:允许安全专家与 LLM 进行交互,通过提问或提供额外信息来帮助 LLM 细化其分析,特别是在模糊或复杂的案例中。 -
跨语言和跨框架的泛化:
-
将 RealVul 的方法论扩展到 PHP 之外的其他 Web 语言(如 Python, Node.js, Java)和框架。这需要解决不同语言的 AST 结构、数据流/控制流分析差异以及特定语言漏洞模式的挑战。
最后总结一下RealVul的基于LLM的漏洞检测框架的突出优点
|
|
|
|
|---|---|---|
| 1. 数据难题 | 创新性地构建数据集
|
|
| 数据合成
|
|
|
| 2. 任务复杂性 | 精细化预处理
|
|
| 聚焦漏洞触发点
|
|
|
| 3. 模型局限性 | 任务特定微调
|
|
| 4. 评估困难 | 严格的评估设定
|
|
| 与传统工具对比
|
|
原文始发于微信公众号(船山信安):RealVul: 基于大语言模型训练微调的PHP漏洞检测框架深度解析安全工具
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。