从软件工程的角度说,漏洞(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 ,它根据代码功能执行相似性搜索。
2)认识到代码功能和漏洞之间的弱相关性,我们开发了一种进行相似性搜索的新方法。在检查与漏洞相关的代码抽象时,通常会出现更强的相关性。抽象或代码最小化将源代码简化为执行所需的基本组件。为了执行基于抽象的相似性搜索,我们从漏洞报告中提取代码,并使用压缩器或 LLM 功能应用代码压缩技术。在压缩易受攻击的代码片段后,我们将它们存储在向量数据库中。
在扫描目标代码 ( TC ) 以查找漏洞时,我们首先最小化TC,然后搜索具有类似最小化表示的漏洞代码 ( VC )。我们汇总代码抽象并使用序列号将它们关联回原始报告,如前所述。这种方法确保我们收集的结构与目标代码高度相似的报告,从而增加了识别 VC和TC中存在的相同漏洞的可能性。
这种方法称之为(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方法
方法七 综合方法一 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 四个开源项目进行测试,
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% |
数据说明
三、总结