大语言模型(LLM)近期在各类安全研究与比赛中逐渐成为热点,主要聚焦于 LLM 的安全应用以及其自身的安全性。这为许多非 LLM 安全研究领域的研究者提供了了解和接触该领域的机会,笔者此前同样对 LLM 相关的安全研究知之甚少,借助这次 DataCon 的契机,对部分赛题涉及的 LLM 安全研究领域进行了简单调研。本文旨在简要梳理当前在 LLM 漏洞挖掘与 LLM 越狱方向已有的相关研究。
LLM 被认为具有自动从已知漏洞中学习特征并查找、修复未知漏洞的潜力。目前,基于 LLM 的漏洞检测和修复解决方案主要集中在函数级别,但其中也有少量的工作开始尝试解决代码库级别(即真实漏洞环境)的问题。
本节主要参考 Large Language Model for Vulnerability Detection and Repair: Literature Review and the Road Ahead,未标注来源的参考文献可以在该 Survey 中找到
从提升 LLM 漏洞挖掘能力的角度,主要可以将当前研究分为三种方法:微调、提示工程和检索增强生成(RAG)。微调通过在漏洞数据上的定向训练来调整模型的参数;提示工程则以黑盒的方式,通过精心设计的 prompt 来优化模型在具体应用场景中的输出效果;RAG 从数据库中检索相关知识并整合到 LLM 的上下文中,同样不需要修改 LLM 的参数。
一般的微调训练包含以下几个步骤:数据准备、模型设计、模型训练和模型优化。根据不同研究方法主要针对的训练阶段,可以划分为以下几个类别:
Data-Centric Innovations(数据准备)
漏洞数据集通常存在标签不平衡和标签不正确的问题。一些研究通过数据采样、伪标签生成以及反事实数据生成等方法,尝试针对这些问题提出解决方案。
Combination of LLM with Program Analysis(数据准备)
一些研究将程序分析工具的结果引入模型的预训练或微调阶段,以帮助 LLM 更好地理解代码逻辑和数据依赖关系。例如:
Combination of LLM with Other Deep Learning Modules(模型设计)
通过 Bi-LSTM (双向长短期记忆网络)处理分段后的代码输入克服了 LLM 的长度限制;亦或是通过 GNN (图神经网络)提取代码的图结构特征来补充 LLMs 对代码结构的理解。
Domain-specific Pre-training(模型训练)
通过在特定编程语言和特定漏洞类型的数据上进行预训练,使用如掩码语言模型、对比学习、程序依赖预测和漏洞语句标注等不同的预训练目标,可以增强模型对特定编程语言、特定漏洞模式以及复杂代码依赖关系的理解能力。
Causal Learning(训练优化)
通过识别和剔除那些与漏洞标签存在虚假相关的非稳健特征,进而使用因果推理算法来提升模型的因果推理能力。
其中,相比于其他方法更像是在解决一些大模型的通病,“结合大模型和静态分析工具”以及“特定领域的预训练”两类方法,则更依赖研究者对程序分析和漏洞挖掘领域的深入理解。限于时间原因笔者没能详细了解相关的研究方法,感兴趣的读者建议阅读相关论文。
那如果我们想要微调自己的大模型,有哪些需要关注的问题呢?