大模型用于代码扫描,论文一

2024-12-23 07:35   北京  

从软件工程的角度说,漏洞(BUG)发现越早,解决的成本越低,所以,很多问题倾向于在代码阶段就解决,伴随着这个需求,产生了一系列的应用,这里边,SAST(Static Application Security Testing 静态应用安全扫描),聚焦代码里出现的漏洞,得到广泛的应用。

SAST技术已经发展了20多年,象Coverity, Fortify等工具,有着非常大的影响力,已经成为软件开发流程中不可缺少的环节。

但传统的SAST扫描技术,以基于规则的方法为主要发现手段,上下文处理不足,存在误报率高,漏洞发现少的问题,在AI技术发展中,从深度学习开始,就开始为SAST增加AI能力。

大模型出现后,相关的研究开始迅速增加,出现了各种方法。系统在发展初期,需要各种尝试,一般企业没时间,也没必要每种方法都尝试,这时候,研究论文是比较好的方法,毕竟大学和研究机构更喜欢,也更擅长做这个,而且也愿意分享。

本文来自论文LSAST: Enhancing Cybersecurity through LLM-supported Static Application Security Testing(https://arxiv.org/html/2409.15735v2

文中详细介绍了大模型在SAST中的用法及结合工具的八种方法,并列出了测试结果,非常值得参考。文章较长,阅读需要点耐心。

一、大模型的用法

将传统的SAST工具与大模型结合。

文中选择Bearer,(这是个开源扫描器,在https://github.com/Bearer/bearer)

Bearer的漏洞扫描结果一般是这个样子

“cwe_ids” :[
78
],
“id” :“javascript_lang_os_command_injection” ,
"title" : "操作系统命令中未经过清理的用户输入" ,
"description" : "使用未清理的...执行操作系统命令" ,
“行号” :39
“完整文件名” :“/Users/User/repos/dvna/core/appHandler.js” ,
“来源” :{
“开始” :39
“结束” :44
}}

格式化输出为

'CWE-943 (第 59-65 行)' ,'CWE-943 (第 85-89 行)' ,'CWE-943 (第 107-111 行)' ,'CWE-943 (第 145-149 行)' ,'CWE-611 (第 235 行)' ,'CWE-78 ( 第 39-44 行)'

把代码和Bearer的报告写成这样的prompt:

代码:{目标代码}使用SAST扫描仪扫描代码后,我们发现以下漏洞:{ bearer_result }你是一个非常高效的漏洞扫描器。请仔细执行以下任务:-评估给定的代码是否包含除SAST扫描器发现的漏洞之外的任何其他漏洞。-仅输出SAST扫描器未发现的漏洞。-可能存在多个漏洞-仅输出在给定代码中100 %确定存在的漏洞。-如果你没有发现任何其他漏洞,只需回答:“未发现任何其他漏洞”-如果你发现一个漏洞结构,你的答案如下:“CWE-ID: <CWE-ID>原因:<代码易受攻击的原因>line: <导致漏洞的行>code-snippet: <导致漏洞的代码片段>

将上述prompt送给大模型,就能得到答案。

二、完整的结合的方法:RAG

如果您对RAG有什么问题,请先参阅 通俗地说说RAG及其与大模型的结合

RAG的准备

数据集:采用系统汇总了过去一年的漏洞报告,提供了对 LLM 培训数据中可能未涵盖的新可利用漏洞的见解。

使用 HackerOne (https://hackerone.com/hacktivity/)  API 用于收集漏洞数据。我们的努力已经产生了 873 份 JSON 格式的漏洞报告,这些报告均是过去一年内的,并且包含软件代码详细信息。

搜索方法

1)引入了 LLM4Vuln ,它根据代码功能执行相似性搜索。

首先总结漏洞报告中每个代码片段的功能,并使用 LLM 将这些总结存储在向量数据库中。在扫描目标代码 ( TC ) 以查找漏洞时,我们还使用 LLM 总结其功能。然后,我们在向量数据库中进行相似性搜索,以查找具有相似功能的漏洞代码片段 ( VC )。
这种方法称之为(FVR),功能相似漏洞报告。

2)认识到代码功能和漏洞之间的弱相关性,我们开发了一种进行相似性搜索的新方法。在检查与漏洞相关的代码抽象时,通常会出现更强的相关性。抽象或代码最小化将源代码简化为执行所需的基本组件。为了执行基于抽象的相似性搜索,我们从漏洞报告中提取代码,并使用压缩器或 LLM 功能应用代码压缩技术。在压缩易受攻击的代码片段后,我们将它们存储在向量数据库中。

在扫描目标代码 ( TC ) 以查找漏洞时,我们首先最小化TC,然后搜索具有类似最小化表示的漏洞代码 ( VC )。我们汇总代码抽象并使用序列号将它们关联回原始报告,如前所述。这种方法确保我们收集的结构与目标代码高度相似的报告,从而增加了识别 VCTC存在的相同漏洞的可能性。

这种方法称之为(CVR),抽象代码相似漏洞报告。

以下是图中用到的一些术语

Abbreviation

Description

TC

目标代码

SR

SAST工具扫描结果

VR

漏洞报告

FVR

功能相似的漏洞报告

CVR

抽象代码相似漏洞报告

k

RAG Top k搜索里的k


方法一:直接使用大模型检测(基线)

这种方法非常简单,就是把代码给大模型,问大模型代码有什么漏洞。大模型本身就能够识别一部分。

方法二RAW 自有知识 LSAST 方法

在基线的基础上,我们将 SAST 扫描器结果SR和TC合并到 LLM 输入中作为我们的原始 LSAST 方法。这使 LLM 能够初步了解传统静态分析识别的已知漏洞,从而提高整体检测准确性。

方法三 基于FVR的方法

在这种方法中,LLM 首先总结TC的功能。然后在包含已知易受攻击的代码片段功能的向量数据库中进行相似性搜索。检索最相关的FVR并将其与目标代码一起提供给 LLM。

方法四 FVR的 LSAST 方法

在方法三的基础上,加上SAST的扫描报告。

方法五 基于CVR的方法

将源代码和CVR送给大模型检测。

方法六 基于CVR的LSAST方法

就是源码加SAST报告加CVR送给大模型

方法七 综合方法一 CVR+FVR的LSAST

把CVR和FVR及源码送给大模型

方法八 综合方法二 CVR+FVR+SC

把CVR,FVR,SAST报告,源码一起送给大模型。

结果分析

采用DVWA (Damn Vulnerable Web Application), DVNA (Damn Vulnerable NodeJS Application), OWASP Juice Shop, WebGoat 四个开源项目进行测试,

在所有 4 个项目中,我们使用 3 种扫描方法扫描了总共 10 个文件,其中包含超过 15 种不同类型的漏洞。
结果一

Measure

方法五CVR

方法三FVR

方法七 混合的

TP-Rate

23.81%

14.29%

28.57%

FP-Rate

100%

100%

100%

Accuracy

19.23%

10%

24%

Precision

50%

25%

60%

F1-Score

32.26%

18.18%

38.71%

结果二

Measure

方法一

方法二

方法八

TP-Rate

17.91%

68.89%

35.71%

FP-Rate

100%

100%

100%

Accuracy

24%

62%

32.61%

Precision

63.16%

86.11%

78.95%

F1-Score

38.71%

76.54%

49.18%

数据说明

真实阳性率(TP-Rate):已报告漏洞中实际漏洞所占的比例。
 误报率(FP-Rate):错误的漏洞比例。
 准确率:正确预测的实例与预测总数的比例。
 精确度:预测的漏洞与实际漏洞的比例。
 F1 分数:代表整体表现的单一分数。

三、总结

本文对各种测试的方法,数据集的使用,及测试结果,都有非常准确的描述,是一个非常有用的尝试。
方法八表现出非常高的准确率,可以借鉴采用。
注意表二中的方法一,它表示,即使不给任何信息,大模型对漏洞就有识别能力,并且效果看上去还不错。

AI与安全
理清逻辑,找到规律,看清趋势。作者前华为云高级安全专家,现为独立顾问。
 最新文章