上一篇我们讨论了大模型用于代码检测的方法,主要是大模型与传统扫描器配合的方法,文中也提到,大模型本身是对漏洞有识别能力的。
今天再看一篇,研究一下大模型自身的能力及挖掘潜力的方法。
LLM 提示能否作为漏洞检测中静态分析的代理(https://arxiv.org/html/2412.12039v1)哥伦比亚大学和马萨诸塞州阿默斯特市阿默斯特学院合作的文章。
本文比较长,先说结论:
使用GPT4o,漏洞发现准确率60%左右,个别场景达到76.8%,是个非常理想的结果。说明大语言模型具备较好的漏洞发现能力,同时说明强化的提示词也非常有效。
提示词策略
1.简单提示(论文中称香草策略)
我们采用了三种不同的基于 NL 的提示策略,以不同的方式描述漏洞类型。这三种提示策略旨在探索向 LLM 提供不同教学资源的有效性。
NL(S1):在第一个设置中,我们利用 LLM 生成检测特定 CWE 的指令,利用其对CWE 的固有理解来提供有见地且相关的指令。
NL (S2):在第二种设置中,我们采用一种更有针对性的方法,利用 LLM 从少量样本生成指令。我们要求 LLM 根据从该特定 CWE 的 SVEN 验证集中提取的 3 个成对(易受攻击和已修复)样本,总结出一组指令。这种方法使我们能够将生成的指令与实际的高质量真实世界漏洞数据集紧密结合。
NL (S3):在第三个设置中,我们选择使用 MITRE 为该特定 CWE 提供的描述中的精确匹配。此设置可确保指令与权威、人工编写且被广泛认可的漏洞描述直接相关。需要注意的是,这些设置不是在对比思路框架内开发的,我们将在第 3.3节中描述,因此它们不包含合成示例。这种方法使我们能够独立评估每种设置在增强基于自然语言的描述方面的有效性。
注:图中的Instructions,指令,由大模型生成。
3. 对比提示
3 种不同的设置中将 NL 描述与 CoT 相结合。
NL+CoT (S1):第一个设置围绕将特定 CWE 的说明格式化为需要满足的“测试”或“检查”。这些说明由 LLM 精心设计,并与对比思维链策略相结合。
NL+CoT(S2):在第二种设置中,我们保留“测试”或“检查”格式,但通过提供官方 MITRE 描述以及来自 MITRE 综合数据库的说明性示例来丰富指令生成过程。
NL+CoT (S3):第三种设置的不同之处在于采用自由形式的指令生成方法,从而消除了预定义检查的限制。这些指令虽然仍由 LLM 生成,但旨在提供解决 CWE 的更广阔视角,当与对比思路相结合时,它们可以提供对漏洞管理的细致入微的见解,而不受通过/失败标准的限制。
数据集及模型选择
使用三个数据集:
• SVEN (真实世界):手动标记的平衡数据集,已知标签准确率为 94%。该数据集最初包含 803 个易受攻击/非易受攻击对(共 1.6k 个样本)。我们筛选 4 个 CWE,共提取 184 个样本(占整个数据集的 11.5%)。由于成本限制,我们仅对这个随机子集进行测试,为每个 CWE 分配 46 个样本。
• CVEFixes (真实世界): Bhandari 等人(2021)使用自动收集工具从开源存储库中检索样本。数据集包含 39.8k 个易受攻击和非易受攻击类别的样本。我们筛选出我们感兴趣的 4 个 CWE。我们总共对 1,784 个样本进行了实验。见表2。
• Juliet C/C++ (合成):包含涵盖各种 CWE 的测试用例。对于此数据集,我们为感兴趣的 4 个 CWE 中的每一个提取一个易受攻击和已修复的对。
使用模型:
GPT-4o (gpt-4o-2024-05-13)(本研究时公开的最新版本)、GPT-4 (gpt-4-turbo-2024-04-09)和GPT-3.5 (gpt-3.5-turbo-0125)。对于所有模型,我们将温度设置为 0.7,将最大 token 计数设置为 4096。
测试结果分析
关键说明
使用公式
这里边Acc容易产生困扰,里边的tp,表示真的漏洞,也被检测为漏洞,tn,表示真不是漏洞,也检测出不是漏洞,这两项是正确的。
表格说明
表3总结了不同设置和模型在SVEN数据集中针对每个通用弱点枚举(CWE)有效性方面的表现,特别是它们在成对准确性上的表现。以下是表格内容及数字含义的详细解析:
1. CWE:此列列出了正在评估的特定通用弱点枚举标识符,例如CWE-078、CWE-190、CWE-476和CWE-416。每个CWE代表一种不同类型的软件漏洞。
2. Setting:此列指示在评估中使用的特定实验设置或提示策略。例如,“NL (S1)”指的是在设置1中使用的自然语言提示策略,而“NL + CoT (S1)”则表示在设置1中结合了自然语言和链式思维提示的策略。
3. Model:此列指定用于评估的模型,例如GPT-4o或GPT-4。不同的模型在理解和生成响应方面可能具有不同的能力。
4. Pairwise Acc:此列表示成对准确性,衡量模型正确预测脆弱和修复代码对的真实标签的能力。更高的百分比表示在区分脆弱和非脆弱代码方面的更好表现。
5. ∆ B-S1 Pairwise Acc.:此列显示相对于基线提示(Vanilla Prompt 1,B-S1)在成对准确性上的改进(增量)。正值表示新的提示策略比基线表现更好。
6. ∆ B-S2 Pairwise Acc.:与前一列类似,此列显示相对于另一个基线提示(Vanilla Prompt 2,B-S2)在成对准确性上的改进。
7. Acc:此列表示模型在特定CWE上的整体准确性,反映模型的总体表现。
8. ∆ B-S1 Acc:此列显示相对于基线B-S1在整体准确性上的改进。
9. ∆ B-S2 Acc:此列显示相对于基线B-S2在整体准确性上的改进。
10. F1:此列呈现F1分数,F1分数是考虑精确率和召回率的模型准确性度量。它在处理不平衡数据集时特别有用。
11. ∆ B-S1 F1:此列表示相对于基线B-S1在F1分数上的改进。
12. ∆ B-S2 F1:此列表示相对于基线B-S2在F1分数上的改进。
关键发现
GPT4o在N1(S1)上,Pairwise Acc达到53.6,总体Acc达到76.8,这是个非常好的数字,传统的SAST工具非常难达到(除非在既定数据集上专门处理过),其它模型在相关数据集上,数据表现也非常好。
论文的本意是他们通过prompt的强化,能取得更好的效果。
但数据也表明,大模型在漏洞识别上,确实有非常大的潜力。
END
大模型用于代码扫描,论文一