大语言模型 C/C++ 代码漏洞检测效能的实证研究

admin 2024年6月27日18:48:02评论3 views字数 10493阅读34分58秒阅读模式

摘要

代码漏洞检测是软件安全领域的研究热点,涌现出了大量的工具与算法,但受制于代码复杂抽象的逻辑实现,高效的漏洞检测仍未实现。近年来,由于大语言模型技术展现出极强的语言理解和文本生成能力,大语言模型赋能漏洞检测的研究应运而生。选取了 4 款大语言模型在 juliet-test-suite 基准数据集上对其漏洞检测效能进行实证研究,并与传统的静态分析工具进行对比。实验结果显示,当前商业大语言模型具备一定的漏洞检测能力,但无法完全替代传统的检测方法。最后,分析梳理了大语言模型在漏洞挖掘领域的能力评估、现有局限和未来发展趋势,有助于未来大语言模型在漏洞挖掘领域的普及和应用。

内容目录:
1 相关工作
2 术  语
3 效能评估
3.1 工具选择
3.2 基准数据集
3.3 提示词
3.4 结果解析与标准化
3.5 评估指标与评估场景
4 结果分析

4.1 RQ1:大语言模型 C/C++ 代码漏洞检测效能

4.2 RQ2:大语言模型与静态分析工具 C/C++ 漏洞检测效能对比
4.3 RQ3:基于大语言模型的代码漏洞检测的挑战与局限性
4.4 RQ4:如何使用大语言模型赋能软件漏洞检测
5 有效性威胁
5.1 内部有效性威胁
5.2 外部有效性威胁
5.3 构造有效性威胁
6 结  语

软件漏洞是指软件在其生命周期(即设计、开发、部署、运维)中产生的缺陷,这些缺陷可被黑客利用,从而绕过系统的访问控制,非法获得访问权限,盗窃数字资产,造成用户隐私数据泄露,导致企业和个人巨大的经济损失。美国国家漏洞数据库(National Vulnerability Database,NVD) 公 布 的数据显示,截至 2023 年 8 月,公布的代码漏洞超过 22 万个,其中大多数漏洞来源于 C/C++ 编写的软件。

软件安全的需求日益增长。对于 C/C++ 编写的软件而言,其语言自身的复杂度、代码规模、抽象的逻辑实现等因素深刻影响漏洞检测方法的效果。研究人员一直在探索软件漏洞检测方法,包括人工审查、渗透测试、动态测试、静态分析等。其中,静态分析是指在不运行代码的情况下,通过词法分析、语法分析、规则匹配等方法对源代码进行扫描,从而挖掘出潜在缺陷。

随着生成式人工智能的突破,以 ChatGPT 为代表的大语言模型表现出的语义理解、文本生成和代码理解能力引发了笔者的思考。通过研究以下问题,研究大语言模型赋能代码漏洞检测领域,为网络空间安全引入新的变革,提升安全领域的整体势能。

(1)RQ1:大语言模型 C/C++ 代码漏洞检测效能如何?

(2)RQ2:大语言模型与静态分析工具 C/C++代码漏洞检测能力对比。

(3)RQ3:基于大语言模型代码漏洞检测的挑战与局限性。

(4)RQ4:大语言模型如何赋能软件漏洞检测?许多实证工作已经对传统的漏洞检测方法和其代表性工具的检测效能进行了研究,并刻画了工具的使用场景、擅长挖掘的漏洞类型、检测置信度等特点。本文对 4 种大语言模型的 C/C++ 漏洞检测能力进行实证研究,评估大语言模型在具有代表性的 C/C++ 代码缺陷类型数据集上的检测能力,总结出大语言模型在代码漏洞检测领域的优势特点与局限,以期为后续研究大语言模型在静态代码漏洞检测的工作奠定基础,以及提供有益的启示。

本文的主要贡献如下:

(1)以覆盖缺陷类型广泛、数据量充足的测试集为基准开展了大语言模型在代码漏洞检测方面的效能评估工作。

(2)基于商业模型与开源模型,针对传统代码漏洞检测方法和大语言模型代码漏洞检测方法进行了交织对比,深入剖析了各方法的优势与局限,对于该领域的研究和实践有重要的参考意义。

(3)针对大语言模型的能力、应用场景等方面,对大语言模型在代码漏洞检测领域的应用进行了讨论和展望,指出下一步研究方向。

1

相关工作

围绕代码漏洞检测技术效能的实证研究一直在进行。早在 2004 年,Zitser 等人就构建了包含14 个缓冲区溢出漏洞的代码测试集,对 5 款静态分析工具进行了评估,并指出静态分析工具的误报率较高的问题。之后 Zheng 等人、Chatzieleftheriou等人、KAUR 等人、AUSTIN 等人通过相似的研究模式,利用代码漏洞数据集评估开源或商业的静态分析工具。2022 年,Lipp 等人基于不同类型的漏洞进行工具的差异化分析,得到通过多分析工具组合的方法能降低静态分析误报率的结论,但该研究也从侧面验证,经过 18 年的技术迭代,仍然没有解决静态分析高误率报的问题。

自从研究人员引入深度学习解决漏洞检测静 态 分 析 技 术 的 固 有 缺 陷, 许 多 先 进 的 漏 洞 检测 模 型 被 提 出, 例 如 华 中 科 技 大 学 研 究 团 队 提出 的 VulDeePecker,利用代码切片作为深度学习模型的输入,从而检测漏洞。之后,为了解决VulDeePecker 的局限性,进一步提出了基于深度学习的漏洞检测框架 SySeVR。Zhou 等人通过提取代码属性图特征,训练门控图神经网络,对比现有技术,该模型的漏洞检测准确率提升了 10.51%。但 Steenhoek 等人开展的针对基于深度学习的漏洞检测实证研究指出,模型的输出难以保持一致性,34.9% 的测试数据会在反复实验中呈现不同的结果。

随着大语言模型的流行,不少研究人员开始评估大语言模型在专业领域的效能。Ye 等人对GPT-3 和 GPT-3.5 系列模型的能力进行了详细分析,分析涵盖了各种任务,包括文章总结、情感分析和问答,对模型的优点和缺点有了一定的了解。微软研究院的 Bubeck 等人在技术报告《通用人工智能的火花:GPT-4 的早期实验》中比较了 GPT-4、GPT-3.5 和 GPT-3 在代码理解、代码生成、编程挑战、代码推理执行、代码描述等方面的能力,GPT 均表现优异。此外,还有研究工作在网络安全领域开展,例如 Chen 等人 在 2021 年研究了大语言模型在代码训练时的性能,探索了该模型理解和生成代码的能力,提出了使用大语言模型执行与代码相关的任务的见解。该研究验证了 Codex 生成 SQL 注入和脚本注入恶意载荷的能力,同时指出 Codex 在漏洞检测方面的能力不及最基本的静态分析工具。同样有报告指出,ChatGPT 在代码缺陷二分类检测和CWE 多标签分类检测任务中表现欠佳。该报告中,作者从 Github 上收集了大量包含漏洞的 Java 工程,并邀请了安全专家对 Java 漏洞数据集进行了人工确认,数据集包含 18 种 CWE 缺陷类型,检测效果最好的缺陷类型精确率也未超过 50%。随着模型能力的提高,需要开展进一步的研究,以了解大语言模型在网络安全领域应用的潜力。应该考虑思维链提示的方式,增强大语言模型的逐步推理能力,从而获得较好的检测效果。甚至,可以结合代码理解能力,挖掘传统静态分析工具不擅长挖掘的逻辑型漏洞。

术  语

(1)通用缺陷枚举(Common Weakness Enumeration,CWE)。缺陷广泛存在于软件、固件、硬件或服务中,在某些特定的条件下将导致漏洞。CWE 是由 MITRE 开发的软件和硬件缺陷类型分类分级体系,可作为通用的规范性缺陷描述语言、安全工具的衡量标准,以及缺陷的识别、缓解和预防工作的基线。

(2)常见漏洞披露(Common Vulnerability Exposure,CVE)。漏洞是指软件在其生命周期(设计、开发、部署、执行整个过程)中存在的违反安全策略的错误,这些错误可被攻击者利用来获取系统控制权限或隐私数据。漏洞可被看作某一类型缺陷的实例。CVE 是 MITRE 发起的识别、定义、公开披露网络安全漏洞的项目,每个漏洞都有对应的 CVE 记录,漏洞信息由世界各地的安全从业者发现、分配和发布。

效能评估

本节介绍效能评估的实证研究方法,评估的整体流程如图 1 所示。首先利用基准数据集测试大语言模型和静态分析工具的漏洞检测能力;其次收集工具检测结果,对其进行归一化和标准化处理;最后基于效能评估指标得出结论。

大语言模型 C/C++ 代码漏洞检测效能的实证研究

图 1 方法流程

3.1 工具选择

本次评估对象包括 4 种大语言模型和 1 款作为对比参照的静态分析工具。静态分析和大语言模型在漏洞检测领域的使用场景类似,可在不运行代码的条件下进行代码安全检测,通过源代码的词法、语法、语义等特征挖掘出潜在缺陷。代码静态分析是软件漏洞检测的经典方法之一,其他的漏洞检测技术有动态分析、协议模糊测试、交互式安全测试等,但此类技术都需要运行程序,使用场景和大语言模型不同。大语言模型的选取主要聚焦世界顶尖的科技公司和高校所推出的模型,本次实证研究中选择的 ChatGPT、LLaMA、PaLM 和 ChatGLM2分 别 来 自 OpenAI、Meta(Facebook)、Google 和清华大学。

(1)CodeQL。CodeQL 是 Github 开 源 的 代码静态分析工具,本次实证研究中使用 2.1.3 版本的 CodeQL。CodeQL 使用了代码语法分析技术,在漏洞检测过程中考虑了程序语法特征,需要编译代码获取中间表示,再结合规则集进行漏洞检测。CodeQL 预定义的规则集由社区共同维护。先前的实证研究工作中指出,CodeQL 是一款优秀的静态分析工具,其性能略低于商业的静态分析工具,但超过 Flawfinder、Cppcheck 等 C/C++ 的静态分析工具。

(2)LLaMA。LLaMA 为 Facebook 开源的大语言模型,有 70 亿、130 亿、330 亿和 650 亿参数的版本,最小尺寸的模型经过一万亿词符语料的训练。本次实证研究中,本地部署了 70 亿参数的模型。

(3)ChatGPT。ChatGPT 是 OpenAI 发 布 的GPT 系列大语言模型,预训练时使用了大量从社交媒体、聊天记录、问答网站、代码仓库等多个来源收集的数据。OpenAI 并没有公开 ChatGPT 模型的具体参数量,但 GPT-3 最大版本的模型参数规模就已经高达 1 750 亿个。GPT4 目前为该系列最新的多模态大模型,支持图像、文本的输入。本次实证研究中,通过调用 API 接口进行测试。

(4)ChatGLM2。ChatGLM2 为 开 源 的 中 英双语对话模型,使用了生成式语言模型(General Language Model,GLM)混合目标函数,经过了 1.4 TB中英文词符的与人类偏好对齐训练,模型参数量为6 亿。本次实证研究中,本地部署了 6 亿参数的模型。

(5)PaLM。PaLM 是 Google 公 司 推 出 的 大语言模型,训练过程中加入了大量代码语料,擅长Python 和 JavaScript 的代码编程,具备一定的代码安全分析能力。本次实证研究中,通过调用 API 接口进行测试。

3.2 基准数据集

为了评估上述漏洞检测工具的效能,本文调研了不同类型的 C/C++ 漏洞代码基准测试集,包括由真实代码构成、用于评估协议模糊测试工具效能的基准测试集 Magma,以及通过抓取代码仓库安全相关 commit 所构建的真实代码数据集 Devign和 MSR。为了尽可能多地覆盖代码缺陷类型,降低测试用例的词符输入,本次实证研究工作选用具有多种代表性缺陷类型,且文档丰富、被广泛用于静态分析工具性能评估的基准数据集 Juliet-test-suite, 许 多 先 前 的 工 作 同 样 使 用 了 Juliet-test-suite 进行性能验证。基准数据集 Juliet-test-suite 由 NIST 提供,包含 64 099 个构造的 C/C++ 漏洞代码测试用例,涵盖 118 种 CWE 缺陷类型。

Juliet-test-suite 中 包 含 了 大 量 CodeQL 无 法检测的缺陷类型,完整使用 118 种测试用例会导致 CodeQL 大量的漏报,影响最终的效能评估结果。因此,需要对基准数据集进行裁剪,筛选出CodeQL 支持检测的缺陷类型与基准测试集缺陷类型的交集。图 2 显示了最终的缺陷类型分布和测试用例数量,一共有 47 种缺陷类型,共计 36 470 个测试用例,会被用于本次研究。结合 CWE 分级分类体系对每个 CWE 类型进行根溯源,47 种缺陷类型分别属于 CWE-682、CWE-664、CWE-691、CWE-697、CWE-703、CWE-707、CWE-710 这 7种高层级的缺陷类别。

大语言模型 C/C++ 代码漏洞检测效能的实证研究

图 2 C/C++ 测试用例分布

3.3 提示词

提示词是指导大模型生成高质量的与特定主题或内容相关的响应。经过多种提示词的测试,选定以指令、背景信息、输入数据为主要组成部分的提示词进行基于大语言模型的漏洞检测。指令部分是任务的具体描述。背景信息部分告诉大语言模型检测结果需要符合 CWE 的分类,指出缺陷的具体位置,并按照一定结构化的数据格式返回检测结果。输入数据部分则是被测对象的源代码。提示词的示例如下文所示。

Prompt:

You are a code security expert, analyze the following code snippet for any vulnerabilities, provide your findings in a JSON format like {“cwe”: “CWE-121”, “line”: 9}.```C

<testcases here>

LLM Response:

The given code snippet has a vulnerability, which is a stack-based buffer overflow in the memcpy function call. The json format for the vulnerability would be:

{“cwe”: “CWE-121”, “line”:”11”, “description”:“...”},

safe function: [{“function”: “f1”, “line”: 31,“description”: “...”}, {“function”: “f2”, “line”:31, “description”: “...”}]

3.4 结果解析与标准化

对不同的工具和模型输出的分析结果进行关键信息提取和关键信息归一化处理,其中,Codeql 将检测结果输出为 CSV 格式,按照规则与 CWE 的映射表进行映射,得到统一标准化后的检测结果。大语言模型判断回复是否按要求返回 json 格式,如果是,则进行下一步;如果不是,判断回复的整个文本中是否包含 json 数据,如果是,则单独抽取 json数据,如果不是,则解析文本,检查数据中是否包含了需要的关键信息,提取缺陷函数、缺陷类型、缺陷行等漏洞相关信息。至此完成了关键信息提取步骤,进行关键信息归一化处理步骤。归一化处理为判断缺陷类型、缺陷位置及缺陷函数等的描述方式是否符合预定义的标准,如检查缺陷类型是否仅包含了 CWE 编号,缺陷位置是否是 int 整型,缺陷函数是否包含形参等。通过统计处理规则、解析规则及异常处理情况,可从侧面反映出具体模型在代码漏洞检测工作流中的可操作性。

3.5 评估指标与评估场景

建立合理的评估指标是开展评估活动的必要前提。混淆矩阵是表示精度评价的一种标准格式,本文借鉴混淆矩阵来建立效能评估指标。

(1)正报 TP:使用工具分析测试用例时,期望的结果之一是工具能够报告目标类型的一个缺陷,这种类型的报告被认为是“真阳性”或正报。

(2)误报 FP:如果工具在不存在漏洞的测试用例中错误地报告任何类型的缺陷,则该条报告被视为“假阳性”,即误报。

(3)漏报 FN:如果工具在分析存在漏洞的测试用例时没有报告目标类型的缺陷,则认为工具在测试用例上的结果为“假阴性”或漏报。

(4)真阴 TN:如果工具在分析不存在漏洞的测试用例时没有报告任何类型的缺陷,则认为工具在该测试用例上的结果为“真阴性。”但在本基准测试集中,测试用例需要引用其他的辅助文件或辅助函数,无法确定具体的关联关系,因此无法确定真阴性。

漏洞检测的粒度会影响评估指标,因此本文定义 3 种粒度场景,用来评估漏洞检测模型和静态分析工具是否能提供准确的缺陷点位和非误导性的缺陷类型,从而辅助加速代码漏洞确认。

场景 1:如果工具在测试用例的具体漏洞代码行报告了准确的缺陷类型,则视为该漏洞被检测到。

场景 2:如果工具在测试用例的漏洞函数片段中报告了准确的缺陷类型,即便代码行未对齐,也视为该漏洞被工具检测到。

场景 3:如果工具在测试用例的漏洞函数片段中报告了代码缺陷,即使缺陷类型不正确,也视为该漏洞被工具检测到。在该场景下,漏洞检测工具由于输出的缺陷类型与基准测试集的缺陷类型不在同一个层级,但存在继承关系,因此被认定为正报。

受 Lipp 等人工作的启发,选择一款漏洞检测工具的理由,无外乎在尽可能多地挖掘出代码中漏洞的同时,最大限度地减少误报。由于TN 不确定,无法计算涉及TN 的评估指标,如准确率、误报率等。因此,在功能性和可靠性层面,工具的效能主要由检出率(召回率)和精确率共同评估。召回率及精确率的计算公式如下:

大语言模型 C/C++ 代码漏洞检测效能的实证研究

此外,由于源代码具有高度的敏感性,工具是否能离线部署同样也是一个重要的评估指标。因此,在工具的可操作性层面,工具的效能主要由是否支持离线部署、结果是否易理解、工具的自动化程度等指标评估。

 结果分析

本节介绍测试结果,并围绕提出的研究问题进行结果分析评估。

4.1 RQ1:大语言模型 C/C++ 代码漏洞检测效能

本文对 4 种大语言模型和 1 种静态分析工具的C/C++ 代码漏洞检测能力进行了测试,使用的测试用例涵盖 47 种 CWE 缺陷类型,共计 36 470 个。在预定义的 3 种评估场景下,每种 CWE 类型的精确率和检出率详细结果显示在附录中。

在测试过程中,结合不同的测试用例和提示词进行测试发现:LLaMa 模型虽然知道 CWE 的含义,但只能输出提示词中的 CWE 类型,无法分析代码,不能指出代码缺陷的位置,不具备代码漏洞检测能力;ChatGLM2 无法输出代码缺陷位置行,只能通过函数名称进行比对。在评估场景 1 中,ChatGLM2即使输出了正确的 CWE 类型,也因为不能对应代码行而被算作误报和漏报,精确率和检出率都为 0,因此 ChatGLM2 不具备行级代码漏洞检测的能力。此外,提示词明确要求模型返回 json 格式的结果,但 ChatGLM2 的输出仍然是纯文本,这给后续的解析与标准化处理引入了困难。

测试结果显示,ChatGPT 在场景 1~3 中,准确率和检出率都优于 PaLM 和 ChatGLM2。ChatGLM2 的检出率在场景 2、3 中优于 PaLM,但精确率却不及 PaLM。

实证研究结果表明,当前大语言模型具备一定的 C/C++ 代码漏洞检测能力,检测粒度可以是代码行或函数段。商业的大语言模型在提示词理解、结果输出和检测效能上优于开源的大语言模型。

4.2 RQ2:大语言模型与静态分析工具 C/C++ 漏洞检测效能对比

图 3、图 4 显示了 3 种大语言模型和静态分析工 具 CodeQL 在 本 次 测 试 中 C/C++ 代 码 典 型 缺 陷类型的精确率和检出率对比。典型的缺陷类型主要是与 C/C++ 语言特性相关的,包括缓冲区溢出相关的缺陷、整数溢出相关的缺陷和内存操作相关的缺陷。在多数缺陷类型中,ChatGPT 的精确率都高于CodeQL,其余的大语言模型则在场景 1 中和 CodeQL一致,精确率和检出率多数为 0。在场景 2 中,ChatGPT 漏洞检测的精确率和检出率高于 CodeQL,但 在 场 景 3 中 不 及 CodeQL。在 场 景 3 中,CodeQL的漏洞检出率高于 ChatGPT,此现象产生的原因是CodeQL 的检测牺牲了精确率,以大量的误报换取高检出率。考虑 ChatGPT 目前和 CodeQL 的效能差异,可以推测其性能也超过了大部分传统的静态分析工具。

大语言模型 C/C++ 代码漏洞检测效能的实证研究

大语言模型 C/C++ 代码漏洞检测效能的实证研究

图 3 典型 C/C++ 漏洞的检测精确率对比

大语言模型 C/C++ 代码漏洞检测效能的实证研究

图 4 典型 C/C++ 漏洞的检测检出率对比

实证研究的结果表明,在漏洞检测精确率方面,ChatGPT 超过了传统的静态分析工具 CodeQL。但在场景 3 以函数段为粒度的缺陷检测中,CodeQL对部分缺陷类型的检出率高于大语言模型。综合观察精确率和检出率,本次实证工作中,ChatGPT 的C/C++ 漏洞检测效能全面超过静态分析工具。

4.3 RQ3:基于大语言模型的代码漏洞检测的挑战与局限性

检 测 效 果 受 限 于 特 定 类 型 的 缺 陷:统 计 评估 场 景 1、2 中 CodeQL 精 确 率 和 检 出 率 指 标 高于 ChatGPT 的 缺 陷 类 型, 得 到 CWE-{242、482、676、685、457}5 种。上述缺陷主要为使用危险函数,使用未初始化变量,函数调用参数错误等,属于非上下文敏感型的缺陷。检测这种类型的缺陷通常使用规则匹配即可,不需要理解代码上下文信息,因此静态分析工具检测此类缺陷更有效。

词符输入限制:大模型限制了词符上下文,比如 GhatGLM 和 LLaMa 只支持 2 048 词符序列长度的输入。在测试过程中,一些测试用例由于长度超过限制,丢失了分析结果。本次实证工作使用的基准测试集是构造代码,在代码复杂度、代码逻辑上下文信息、代码多样性等方面无法比拟现实中的代码工程。大语言模型的词符上下文限制会影响真实代码工程的检测,而传统的静态分析工具不存在此问题。

结果解析与格式化困难:大模型输出的结果是文本数据,如果接入自动化的工作流中,需要规定其输出格式,对输出内容进行检查。在实证研究中,仅 ChatGPT 可以完全输出 json 格式的回答,其余大模型会附加额外的文本,给关键信息提取工作造成困难。表 1 显示了模型和工具的结果解析处理所需的步骤。

表 1  漏洞检测模型 / 工具的结果处理与输入限制

大语言模型 C/C++ 代码漏洞检测效能的实证研究

虚假答案:生成式人工智能会产生虚假答案,ChatGPT 就输出了很多已经弃用或者不存在的 CWE缺陷类型。因此,需要检查大模型的输出,处理的异常情况越多,集成到自动化工作流中越困难。

计算资源与成本:对单个测试用例的响应时间进行记录,大语言模型平均检测时间为 1~2 s,完 成 基 准 测 试 集 的 检 测 平 均 耗 时 约 为 20 h, 而CodeQL 完成基准测试集的测试只需 30 min。本次实证工作用于部署开源大语言模型的服务器搭载8 张 A100 显卡,部署开源大语言模型对计算资源有较高的要求。而商业大语言模型按照请求、响应的词符个数进行收费,会产生使用成本。

4.4 RQ4:如何使用大语言模型赋能软件漏洞检测

(1)工具融合:先前的工作证明了多种静态分析工具的组合能有效提升漏洞检测的检出率,并大幅度降低误报。通过刻画大语言模型针对具体缺陷类型的置信度,并与其他漏洞检测工具进行组合,漏洞检测结果将会有所提高。

(2)代码理解:大语言模型,特别是 ChatGPT在代码理解方面表现出色,具有覆盖的语言种类多、代码理解能力强的特点。充分挖掘模型的代码理解能力,可以克服编程语言间的语法和规则差异,帮助安全专家更好地应用与贯彻攻击面分析方法、典型漏洞模式知识和漏洞挖掘经验,从而提升代码安全分析效果。
(3)人机协同:2018 年,美国国防部高级研究计划局公布了 CHESS 项目,旨在通过人机协同的方式推动软件漏洞检测的工作,开发适应不断增长的复杂软件生态的 0Day 漏洞发现和解决系统,人机协同被视作提升漏洞检测效能的一项技术。使用大语言模型可以增强人与计算机间的信息鸿沟表征,支撑代码理解、攻击面分析、代码摘要生成等漏洞挖掘中的子任务,从而挖掘传统方法无法检测的漏洞,例如逻辑型和组件交互关系复杂型的漏洞。

5

有效性威胁

5.1 内部有效性威胁
一个与基准测试集有关的内部有效性威胁,是测试用例中代码注释明确写出了缺陷相关信息,函数的命名方式也明确指出了缺陷类型,这些语义信息会直接被大语言模型学习,使用虚假特征给出答案。针对该情况,本文对测试用例进行了预处理,修改函数名称,删除代码注释。另一个内部有效性威胁主要涉及 CWE 映射的正确性。CodeQL 的漏洞检测规则由社区共同编写,并没有完全对应 CWE缺陷分级分类体系,因此存在工具检测结果未正确匹配 CWE 类型而算作误报的情况出现,从而影响 CodeQL 的效能评估结论。针对存在规则与 CWE映射的情况,进行了人工核查,确保检测规则与CWE 缺陷描述一致。对于缺少 CodeQL 检测规则与CWE 映射的情况,根据规则内容,人为分配了近似的 CWE 类别。

5.2 外部有效性威胁

外部有效性威胁主要与基准测试集有关。由于缺少样本充足的覆盖多种缺陷类型的由真实漏洞代码构建的基准数据集,实证工作采用了被广泛使用在静态分析工具性能评估中的人工构造漏洞数据集Juliet-test-suite 进行效能评估。但构造的基准测试用例在代码复杂度、代码逻辑上下文信息、代码多样性等方面无法比拟现实中的代码工程,缺少基于真实漏洞样本的实验可能会限制评估结果的通用性。

5.3 构造有效性威胁

尽管本次实证工作尝试了多种提示词的组合,但未针对具体的模型去优化提示词,所使用的提示词是否适用于每个大语言模型,是否会给某个模型带来不公平的优势,是否会引起模型的固有局限和偏差是一个构造有效性威胁。

6

结  语

本文在 47 种缺陷类型的测试集上评估了 4 款大语言模型的 C/C++ 代码漏洞检测能力,并将其与静态分析工具进行对比。实证研究的结果表明,ChatGPT 对上下文敏感型漏洞的检测精确率和检出率超过了静态分析工具 CodeQL,其余的大语言模型也没有显著优势,此外,商业模型检测性能优于开源模型。通过实验,本文调查并总结了当前大语言模型在漏洞检测领域存在的局限和挑战,包括词符上下文限制、检测缺陷类型有限、虚假答案、计算资源与成本等。以人机协同机制为牵引,推进大语言模型代码理解能力和安全专家经验的结合,是下一步代码漏洞检测的研究方向。

笔者认为本研究为未来研究大语言模型在静态代码漏洞检测方面的应用奠定了基础。后续将进一步扩展测试集,将不同类型的真实漏洞代码纳入实证研究工作中。同时,以实证工作中的相关结论为基础,权衡大语言模型和静态分析工具的使用场景,以缓解静态漏洞检测中的高误报率问题。

引用格式:和达 , 余尚仁 , 王一凡 , 等 . 大语言模型 C/C++ 代码漏洞检测效能的实证研究 [J]. 通信技术 ,2024,57(5):519-528.
作者简介 >>>

和  达,男,硕士,工程师,主要研究方向为软件安全;

余尚仁,男,硕士,工程师,主要研究方向为漏洞分析;

王一凡,男,硕士,工程师,主要研究方向为人工智能;

权赵恒,男,硕士,工程师,主要研究方向为软件安全。

选自《通信技术》2024年第5期(为便于排版,已省去原文参考文献)

大语言模型 C/C++ 代码漏洞检测效能的实证研究

原文始发于微信公众号(信息安全与通信保密杂志社):大语言模型 C/C++ 代码漏洞检测效能的实证研究

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月27日18:48:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   大语言模型 C/C++ 代码漏洞检测效能的实证研究https://cn-sec.com/archives/2892097.html

发表评论

匿名网友 填写信息