PrimeVul论文解读-如何构建高质量漏洞标签与数据集

目录

  • 1. 引入
  • 2. 现有漏洞识别方案的不足
    • 2.1 数据集中label不准
    • 2.2 数据重复
    • 2.3 测评标准不够好
  • 3. 现有漏洞识别数据集分析
    • 3.1 关于现有数据集中label的准确率分析
    • 3.2 关于现有数据集中数据泄露( Data Leakage)情况分析
  • 4. 漏洞识别测评
  • 5. PrimeVul数据集构建过程
    • 5.1 数据合并
    • 5.2 数据去重
    • 5.3 数据打标
    • 5.4 数据切分
  • 6. 模型测评情况
    • 6.1 对开源代码大模型进行微调后的测评
    • 6.2 对GPT4和GPT3.5进行测评
  • 7. 总结
  • 8. 参考

1. 引入

参考1是2024年5月份发表在ICSE(47th IEEE/ACM International Conference on Software Engineering (ICSE 2025))上的一篇文章,文章题目是"Vulnerability Detection with Code Language Models: How Far Are We?"。它对现阶段的漏洞数据集进行了分析,指出了现有数据集label不准和数据重复的问题,现有根据ACC/F1来做漏洞识别模型评测的不足,并给出了作者构建的另一个高质量数据集PrimeVul,还用这个数据测评了现有的SOTA的一些模型,并得出了现有模型做漏洞识别能力都不足的结论。

下面详细解读其核心思想。

2. 现有漏洞识别方案的不足

2.1 数据集中label不准

  • 大部分数据集,都是自动打标,比如根据漏洞修复的commit来对函数打标。但真实世界中,修复漏洞的同时,也会对其他代码做调整,这样打标就导致误标。

2.2 数据重复

  • 数据重复:发现18.9%的样本在测试集和训练集中同时存在

2.3 测评标准不够好

  • 漏洞检测任务不适合用accuracy来做评价,因为真实世界中漏洞很少,一直输出0就能得到很高的acc
  • 真实世界中漏洞检测,防止误报很重要

3. 现有漏洞识别数据集分析

3.1 关于现有数据集中label的准确率分析

现有数据集分析:
(1)Juliet和SARD这种老数据集不能表示真实世界漏洞的复杂性;
(2)真实开源软件的漏洞:自动label的不准,手动label成本高。

手动label,成本高。比如SVEN数据集,虽然量少(1606个函数,半数都有洞),但质量高。

自动label的方法,一般是这样做的:收集漏洞修复commit,把修复前的作为有洞数据,修复后的作为无洞数据。随机取样分析,每个数据集随机抽样50个函数,3个人工检查,最终按投票决策,发现现有数据集label本身准确率较低,见表1。
在这里插入图片描述
BigVul,CrossVul,CVEFixes,DiverseVul这四个都是比较知名的数据集,从表格中的数据看,准确率也都不行。

3.2 关于现有数据集中数据泄露( Data Leakage)情况分析

文中的 Data Leakage,指的是:测试集中含有训练集中的数据。作者认为,目前大部分已经存在的漏洞数据集中,造成数据泄露的两种情况是(1)数据复制(2)时间顺序错乱。

(1)数据复制

作者按照现有数据集来分析其训练集和测试集中函数的重复性,得到的结果如下图:
在这里插入图片描述
对于DiverseVul,它虽然做过hash去重,但还是有3.3%的重复率,因为它没有对格式化字符做归一化(比如空格的数量不同)。

(2)时间顺序错乱
大部分数据集构建时,采用随机切分数据集为训练集、测试集,这带来的问题:
随机划分函数到不同集合中,会导致训练和测试数据在时间顺序上不合理,出现数据时间顺序错乱的 “时间穿越” 现象,这种现象会使得模型训练和测试的结果不能真实反映模型在实际应用(用过去数据训练预测未来数据)中的性能 。

4. 漏洞识别测评

真实世界中的漏洞检测,开发者不关注F1和ACC,而是关注
(1)减少漏洞和误报;
(2)对于文本上相似的代码样本(包括有漏洞的样本和已修复补丁的样本)的区分能力,也就是模型能否准确地区分有漏洞的代码和已经修复了漏洞的代码,即使它们在文本内容上很相似。
漏报太多,会导致安全问题;误报太多,看不过来。所以漏报和误报要平衡折中。作者认为:
(1)漏报率FNR要越低越好;
(2)有一些误报FPR是可以接受的
作者提出的测评标准是Vulnerability Detection Score (VD-S)。公式为:FNR@(FPR≤r) ,其中 r∈[0%, 100%] 是可配置参数,文中选择 r = 0.5% 进行评估。如果一个漏洞检测模型的 VD-S 为 10%,意味着在误报率被控制在 0.5% 的情况下,仍有 10% 的真实漏洞可能被漏检。所以VD-S越低越好。

5. PrimeVul数据集构建过程

高质量数据集PrimeVul的构建过程:

5.1 数据合并

首先,对真实世界的数据集进行合并。作者将BigVul、CrossVul、CVEfixes和DiverseVul这些数据集中函数进行合并。作者没有使用Devign和CodeXGLUE数据,因为作者发现这两数据集中的内容的很大一部分与安全问题无关。

5.2 数据去重

去除空格、制表符(“\t”)、换行符(“\n”)和回车符(“\r”)等字符,对提交前后已更改的函数进行规范化处理。然后,我们计算已更改函数在提交前版本和提交后版本的 MD5 哈希值。如果一个函数的提交前版本和提交后版本产生相同的哈希值,我们就认为这个函数没有发生变化,并且将其舍弃。

5.3 数据打标

作者构建了两种数据打标策略,进一步提高label的正确率:

(1)PRIMEVUL-ONEFUNC

标注规则:如果某个函数是与安全相关的提交中唯一被更改的函数,那么就将这个函数视为存在漏洞的函数。
也就是说,在之前的标注方法中,当一个提交commit修改了多个函数时,可能会在判断哪个函数真正存在漏洞。而 PRIMEVUL-ONEFUNC 方法通过限定只有当某个函数是安全相关提交中唯一被改动的函数时才认定它有漏洞,避免了在多函数修改提交情况下标注的模糊性和错误,提供了一种更明确、更准确的标注方式来确定函数是否存在漏洞 ,从而提高了数据标注的质量,有助于后续漏洞检测模型的训练和评估。

(2)PRIMEVUL-NVDCHECK

**关联数据:**首先,我们将与安全相关的代码提交(commits)与其对应的 CVE 编号以及 NVD 数据库中的漏洞描述进行关联。
数据标注:

  • NVD 的描述中明确指出了该函数存在漏洞。这意味着在 NVD 对某个 CVE 的详细描述中,直接提到了这个函数是有问题的,那么根据这个权威信息,我们就可以将该函数标记为存在漏洞。
  • 当 NVD 的描述提到了某个函数所在的文件名,并且在这个文件中,这个函数是唯一因与安全相关的提交而被更改的函数时,该函数也会被认定为存在漏洞的函数。

5.4 数据切分

不是随机切分训练集、测试集。而是根据时间切分,老数据做训练集,新数据做测试集。

最终,得到的数据集PrimeVul如下:
在这里插入图片描述

6. 模型测评情况

作者对如下模型进行了测评
在这里插入图片描述
对CodeT5等开源代码大模型,用PrimeVul微调后做了测评。

6.1 对开源代码大模型进行微调后的测评

微调时,对StarCoder2和CodeGen2.5,epoch=4;对CodeT5和CodeBERT,epoch=10。微调后的模型测评结果如下:

在这里插入图片描述
虽然 StarCoder2 模型在 BigVul 基准测试上表现出了值得称赞的 F1 分数(达到 68.26%),但在 PrimeVul 基准测试上,它的 F1 分数却急剧下降到了微不足道的 3.09%。这种大幅下降并非个例,而是在所有模型中都能观察到的一种趋势,这从观察到的漏报率中就可以得到例证。也就是说,之前基于 BigVul 等基准测试所认为的模型具有较好的漏洞检测能力,其实是不准确的,当使用更能反映现实漏洞复杂性的 PrimeVul 基准测试时,这些模型的真实表现很差,漏报率较高,无法有效地检测出漏洞。这表明之前的基准测试存在局限性,不能真实反映代码语言模型在实际漏洞检测任务中的性能。

作者还做了更复杂的训练,结果表明,用于二分类的先进训练技术,例如对比学习和类别权重,并不能显著提升代码语言模型在 PrimeVul 数据集上的性能,这突显了该任务在现实中的难度。

6.2 对GPT4和GPT3.5进行测评

在这里插入图片描述
我们对 GPT-3.5 进行微调时,我们注意到该模型受到了漏洞样本与良性样本 1:3 比例的强烈影响,其表现甚至比使用提示方法时还要差。这是一个危险信号,表明即使是这样一个大型的语言模型(LLM),仍然无法捕捉到漏洞模式,而是选择了从数据中走捷径(即依赖数据中的表面特征而非真正理解漏洞模式)。

所以,作者认为,即使是最先进的 OpenAI 模型,在 PrimeVul 数据集上也无法取得可靠的性能表现,这就需要从根本上采用全新的方法来改进这项任务。

7. 总结

PrimeVul作者对现有漏洞数据集进行分析,指出了现有数据集label不准和数据重复的问题,现有根据ACC/F1来做漏洞识别模型评测的不足,并给出了作者构建的另一个高质量数据集PrimeVul,还用这个数据测评了现有的SOTA的一些模型,并得出了现有模型做漏洞识别能力都不足的结论。作者的分析方法和高质量数据集构建的思路非常值得借鉴。

8. 参考

  1. https://arxiv.org/abs/2403.18624

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于数据湖和数据仓的一些概念

一、前言 随着各行业数字化发展的深化,数据资产和数据价值已越来越被深入企业重要发展的战略重心,海量数据已成为多数企业生产实际面临的重要问题,无论存储容量还是成本,可靠性都成为考验企业数据治理的考验。本文来看下海量数据存储的数据湖和数据仓,数据仓库和数据湖,…

linux-----------------库制作与原理(下)

1.ELF文件 要理解编译链链接的细节,我们不得不了解⼀下ELF⽂件。其实有以下四种⽂件其实都是ELF⽂件: • 可重定位⽂件(Relocatable File ) :即 xxx.o ⽂件。包含适合于与其他⽬标⽂件链接来创 建可执⾏⽂件或者共享…

python-爬虫基础

爬虫本质:通过编写程序来获取到互联网上的资源。 我们的程序本质上就是模拟浏览器 一个简单的小爬虫: 只需要三步: from urllib.request import urlopen #url是网址,request意思是请求 这里跑出来的中文是这样的注意看&#…

单元化架构

目录 ​​​​​​​​编辑 单元化 逻辑单元 单元化 多地多机房部署,是互联网系统的必然发展方向,一个系统要走到这一步,也就必然要解决上面提到的问题:流量调配、数据拆分、延时等。业界有很多技术方案可以用来解决这些问题&…

【免杀】C2免杀技术(五)动态API

一、什么是动态API 在C2免杀领域中,“动态API” 主要指的是绕过静态检测的一种技术手段,其本质是运行时动态解析和调用Windows API函数,而不是在程序编译阶段就明确引用这些API。这种方式可以有效躲避静态分析工具和杀软的签名识别。 为什么…

Python爬虫实战:研究JavaScript压缩方法实现逆向解密

一、引言 在数字化信息爆炸的时代,网络数据已成为驱动各行业发展的核心资产。Python 凭借其丰富的库生态和简洁的语法,成为网络爬虫开发的首选语言。然而,随着互联网安全防护机制的不断升级,网站普遍采用 JavaScript 压缩与混淆技术保护其核心逻辑和数据传输,这使得传统爬…

HTTP 请求走私(HTTP Request Smuggling)

HTTP 请求走私(HTTP Request Smuggling)是一种通过利用前端代理(如负载均衡器、CDN)和后端服务器在 解析 HTTP 请求时存在不一致性 的漏洞,从而实现 注入恶意请求 的攻击技术。 一、基本原理 HTTP 请求走私主要依赖两…

【Google机器学习实践指南(线性回归篇)

🔍 Google机器学习实践指南(线性回归篇) Google机器学习实战(3)-单变量线性回归核心解析,掌握房价预测模型 一、建模流程全景图 ▲ 四大核心步骤: 数据可视化→特征工程→模型训练→预测推理 二、房价预测实战 1. …

python打卡day16

NumPy 数组基础 因为前天说了shap,这里涉及到数据形状尺寸问题,所以需要在这一节说清楚,后续的神经网络我们将要和他天天打交道。 知识点: numpy数组的创建:简单创建、随机创建、遍历、运算numpy数组的索引&#xff1a…

ubuntu 20.04 更改国内镜像源-阿里源 确保可用

镜像源是跟linux版本一一对应的,查询自己系统的版本号: 命令:lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…

基于OpenCV的SIFT特征和FLANN匹配器的指纹认证

文章目录 引言一、概述二、代码解析1. 图像显示函数2. 核心认证函数2.1 创建SIFT特征提取器2.2 检测关键点和计算描述符(源图像)2.3 检测关键点和计算描述符(模板图像)2.4 创建FLANN匹配器2.5 使用K近邻匹配 3. 匹配点筛选4. 认证…

四品种交易策略

策略概述 策略思路: 交易品种:同时交易四个品种,每个品种使用总资金的10%。 合约选择:使用连续合约(data0)发出交易信号,实际交易 主力合约(data1)和下一个主力合约(data2)。 资金管理:总资金用A_CurrentEquity表示,交易手数据此计算。 止损执行:盘中达到止损…

MySQL事务的一些奇奇怪怪知识

Gorm事务有error却不返回会发生什么 Gorm包是大家比较高频使用。正常的用法是,如果有失败返回error,整体rollback,如果不返回error则commit。下面是Transaction的源码: // Transaction start a transaction as a block, return …

时序数据库、实时数据库与实时数仓:如何为实时数据场景选择最佳解决方案?

随着物联网、金融交易、在线游戏等场景对实时数据处理需求的增长,市场上涌现出多种专门针对实时数据处理的数据库解决方案。然而,面对时序数据库、实时数据库和实时数据仓库这三种看似相似的技术,许多技术决策者常常感到困惑:它们…

Spring3+Vue3项目中的知识点——JWT

全称:JOSN Web Token 定义了一种简洁的、自包含的格式,用于通信双方以json数据格式的安全传输信息 组成: 第一部分:Header(头),记录令牌类型、签名算法等。 第二部分:Payload&am…

微服务架构详解

微服务架构详解:从概念到实践(附代码案例) 目录 微服务架构详解:从概念到实践(附代码案例) 一、微服务架构概述 1.1 什么是微服务? 1.2 微服务的核心思想 二、微服务架构的优势与挑战 2.1 优势 2.2 挑战 三、微服务架构的核心组件 3.1 服务注册与发现 示例代…

linux下编写shell脚本一键编译源码

0 前言 进行linux应用层编程时,经常会使用重复的命令对源码进行编译,然后把编译生成的可执行文件拷贝到工作目录,操作非常繁琐且容易出错。本文编写一个简单的shell脚本一键编译源码。 1 linux下编写shell脚本一键编译源码 shell脚本如下&…

学习!FastAPI

目录 FastAPI简介快速开始安装FastApiFastAPI CLI自动化文档 Reqeust路径参数Enum 类用于路径参数路径参数和数值校验 查询参数查询参数和字符串校验 请求体多个请求体参数嵌入单个请求体参数 CookieHeader表单文件直接使用请求 ResponseResponse Model多个关联模型 响应状态码…

DAY 4 缺失值的处理

\1. 打开数据 import pandas as pd data pd.read_csv(rdata.csv) data\2. 查看数据 # 打印数据集的基本信息(列名、非空值数量、数据类型等) print("data.info() - 数据集的基本信息(列名、非空值数量、数据类型等)&#…

Java面试实战:从Spring Boot到分布式缓存的深度探索

Java面试实战:从Spring Boot到分布式缓存的深度探索 场景介绍 在一家著名的互联网大厂,面试官老王正对求职者“水货程序员”明哥进行Java技术面试。明哥带着一点紧张和自信,迎接这场技术“拷问”。 第一轮:基础问题 老王&#…