【网安专题10.11】代码大模型的应用及其安全性研究

代码大模型的应用及其安全性研究

  • 写在最前面
    • 一些想法
      • 大型模型输出格式不受控制的解决方法
  • 大模型介绍
    • (很有意思)GPT 模型家族的发展
    • Chatgpt
      • 优点
      • 缺点
      • GPT4
    • 其他模型
      • 补充:self-instruct合成数据
    • Code Llama
  • 代码大模型的应用
    • (第一次理解清楚hh,这图好清晰,学长的讲解也好好)“预训练-微调”范式和“预训练-prompt”范式
    • 课堂讨论:预训练一般是无监督的,一般为下一个token预测
    • 提示工程——漏洞检测(召回率上升,精确率几乎没变)
      • 基本提示
      • 增强提示1
      • 思维链提示(角色扮演、API和DF只加一个效果更好)
    • 提示工程——漏洞修复
      • 增强提示2
    • 提示工程——代码摘要(效果不行、给出的原因:单词不一样,但表述更好)
    • 学长自己做的“微调——漏洞检测”评估实验(和参数量呈正比关系)
  • 代码大模型安全问题
    • 模型窃取攻击(API和网页接口)
    • 数据窃取攻击
    • 对抗攻击(用途:漏洞隐藏)
    • 后门攻击(加触发器+标签翻转)
  • 参考文献

写在最前面

本文为邹德清教授的《网络安全专题》课堂笔记系列的文章。

第一次课上,文明老师的博士生杜小虎学长进行了代码大模型的应用及其安全性研究的相关介绍

将我之前不太明白的一些概念解释得深入浅出,醐醍灌顶

另有部分个人不成熟的理解,欢迎交流
后面如果有进一步理解,将对文章进行更新

在这里插入图片描述

一些想法

大型模型输出格式不受控制的解决方法

大型模型输出格式不受控制的情况,一些可能的解决方法:

  1. 输出处理:
  • 后处理和过滤: 可以通过编写自定义的后处理代码来筛选和处理大型模型的输出。这可能包括解析输出以识别关键信息、删除不必要的内容、转换输出格式,以及对输出进行筛选和排序。
  • 数据存储: 将输出存储到数据库中(可以理解为,输出转换为结构化数据,而不是自由的文本),以便按需检索和查询。
  • 数据过滤和清理: 对于文本数据,可以使用自然语言处理技术来过滤和清理输出,以去除噪音和非关键信息。
  • 增量处理: 如果模型生成的输出是不断增长的,可以采取增量处理的方法,仅处理新增数据,而不必重新处理整个输出。
  • 限定词汇表: 缩小模型可以选择的词汇表,只允许特定的词汇或短语。这可以限制生成的内容,使其更加可控。
  1. 模型处理:
  • 提供明确的指令或提示: 向模型提供明确和具体的指令或提示,以引导它生成所需的内容。指令可以包括问题、主题、关键词或上下文。通过明确的指令,您可以控制模型生成的内容,使其符合您的预期。
  • 限制生成长度: 设置生成文本的最大长度,以确保输出不会变得太长或无效。这可以通过截断或修剪生成的文本来实现。
  • 温度参数调整: 调整生成模型的温度参数。较低的温度值会使生成更加确定性,较高的温度值会增加随机性。通过调整温度参数,您可以控制生成的创造性和多样性。
  • 抽样策略: 使用不同的抽样策略来生成文本。例如,贪婪抽样会选择最有可能的词语,而随机抽样会引入更多的随机性。选择适当的抽样策略可以影响生成文本的可控性。
  • 模板或脚本: 创建文本生成的模板或脚本,然后将模型的输出填充到模板中。这种方式可以确保生成的文本符合特定的结构或格式。
  • 多轮对话: 进行多轮对话,以逐步引导模型生成所需的内容。在每一轮中,提供反馈并指导模型生成下一步内容。
  • 领域特定模型微调: 如果可能的话,可以微调预训练模型,以使其在特定领域或任务上更具可控性。

大模型介绍

<a class=大模型是指容量较大,用于深度学习任务的模型,通常具有海量的参数和复杂的架构。" />

国内外生成式大模型研究现状总结

在这里插入图片描述

GPT 系列模型的发展历程总结

在这里插入图片描述

(很有意思)GPT 模型家族的发展

GPT 模型家族的发展从 GPT-3 开始分成了两个技术路径并行发展 :
1、一个路径是以 Codex 为代表的代码预训练技术
2、另一个路径是以 InstructGPT 为代表的文本指令(Instruction)预训练技术。

但这两个技术路径不是始终并行发展的,而是到了一定阶段后(具体时间不详)进入了融合式预训练的过程,并通过指令学习(Instruction Tuning)有监督精调(SupervisedFine-tuning)以及基于人类反馈的强化学习(Reinforcement Learning with HumanFeedback,RLHF) 等技术实现了以自然语言对话为接口的 ChatGPT 模型。

GPT 演化图,图源How does GPT Obtain its Ability? Tracing Emergent Abilities of Language Models to their Sources

在这里插入图片描述

Chatgpt

优点

零样本泛化能力、参数量大、逐步推理

在这里插入图片描述

缺点

输出格式不受控制(感觉是目前所有生成式模型的通用问题?)
训练一次时空复杂度高,导致:时效性差、成本高昂
在这里插入图片描述

GPT4

主要引入多模态,并达到SOTA性能

在这里插入图片描述

其他模型

由于个人目前没有涉猎相关研究,待后续补充想法

在这里插入图片描述

斯坦福Alpaca:self-instruct、instruction数据上监督微调
清华ChatGLM:双语能力

在这里插入图片描述

补充:self-instruct合成数据

self-instruct是一种将预训练语言模型与指令对齐的方法。 可以通过模型自己来生成数据,而不需要大量的人工标注。
参考:https://blog.csdn.net/dzysunshine/article/details/130390587
在这里插入图片描述
Step1:通过模型生成新的指令;
根据人工设计的175个任务,每个任务都有对应的(指令,输入,输出)或(指令,输出);使用模型生成新的指令;
Step2:对模型生成的指令进行判断(指令是否是一个分类任务);
Step3:根据Step2的判断结果,给出不同的输出
如果是分类任务,就通过模型输出 Class_label 和 Input(Output-first);
如果不是分类任务,就通过模型输出 Input 和 Output(Input-first)。
Step4:过滤及后处理
对上述模型生成的数据进行过滤和后处理,将经过过滤和后处理的数据添加到种子池中。

对于以上4个步骤进行不断循环,直到种子池有足够多的数据(通常会设定一个具体的参数,比如:52000),生成过程停止。

Code Llama

所有 Code Llama 模型均使用 Llama 2 模型权重进行初始化,并使用来自代码密集数据集的 500B token 进行训练.
Code Llama Python 模型从 Llama 2 模型初始化,并使用 Code Llama 数据集的 500B token 进行训练,并使用 Python 数据集进一步专门针对 100B token训练。
Code Llama - Instruct 模型基于 Code Llama 并使用额外的5B token 进行了微调,可以更好地遵循人类指令。
Unnatural model.。为了进行比较,它们还对 Code Llama - Python 34B 对 15,000 个非自然指令进行了微调。Meta没有发布这个模型,但观察到 HumanEval 和 MBPP 的明显改进,这表明可以通过一小组高质量编码数据来实现改进。
在这里插入图片描述

代码大模型的应用

(第一次理解清楚hh,这图好清晰,学长的讲解也好好)“预训练-微调”范式和“预训练-prompt”范式

神经网络需要大量数据的训练才能使得模型的效果更好,但训练是非常漫长的过程。我们可以把整个训练过程裁成两个部分:

开始的占比最大的部分称为预训练,后面的占比较小的部分称为微调

随着的着技术的发展,对于很多不同的任务,可以共享同一个预训练过程和不同的微调过程。这就是“预训练-微调”范式,

大模型还给出了另一个范式,“预训练-prompt”

课堂讨论:预训练一般是无监督的,一般为下一个token预测

(马兴宇学长补充,预训练一般是无监督data,但可以添加部分监督data)
微调可以理解为对齐任务,以符合人类期望

补充:prompt为提示工程

在这里插入图片描述

提示工程——漏洞检测(召回率上升,精确率几乎没变)

基本提示

(单词积累:漏洞vulnerability、脆弱(或者翻译为存在漏洞更合适?)vulnerable)

写该漏洞是否包含在Yes/no格式的代码中: write whether the vulnerability is contained in the code in the Yes/no format:

下面的功能包含一个漏洞写在Yes/no格式和为什么? does the following function contain a vulnerability write in Yes/no format and why?

判断该函数是否在Yes/no格式下存在漏洞: tell whether this function is vulnerable in the Yes/no format:

写这个函数是否脆弱: write whether this function is vulnerable:

在这里插入图片描述

增强提示1

你是一个提示优化者。 You are a prompt optimizer.

请优化以下提示: Please optimize the following prompt:

“你是智能合约的漏洞检测器。 “You are a vulnerability detector for a smart contract.

请检查此合同中的以下九种漏洞:[vULs]。 Please checkfor the following nine types of
vulnerabilities in this contract: [vULs].

让我们一步一步来思考。 Let’s think step by step.

智能合约的源代码如下:[输入]。 The source code for the smart contract is asfollows:
[Input].”

没有问题。 No problem.

我的优化提示如下: My optimized prompt is as follows:

您是一个智能合约漏洞检测器,请分析提供的以下9个漏洞的源代码:[vULS]。 “You are a smart contract vulnerability detector, please analyze theprovided source code for the following nine vulnerabilities: [vULS].

一步一步仔细思考。 Think step by step carefully.

合同源代码:[输入]。” The contract source code: [Input]."

在这里插入图片描述

思维链提示(角色扮演、API和DF只加一个效果更好)

请描述给定代码的意图。 Please describe the intent of the given code.[CODE].

我想让你扮演一个漏洞检测系统。 I want you to act as a vulnerability detection system.

上面的代码有bug吗? Is the above code buggy?

只回答是或否。 Only answer Yes or No.

下面是你可以使用的API调用序列/数据流信息:[API描述]/[DF描述]。 Here is its API call sequence/data flow information that you may use: [API description]/[DF description].

在这里插入图片描述

提示工程——漏洞修复

增强提示2

模板:下面的代码是为一个训练在[Y]上的[X]问题设计的。 Template: The following code is designed for a [X] problem trained on [Y].

请修理它以便[Z]。(代码)
Please repair it in order to [Z].[Code]

示例:下面的代码是为在Iris数据集上训练的分类问题而设计的。 Example: The following code is designed for a classification problem trained on Iris dataset.

为了提高精度,请修理一下代码。 Please repair it in order to improve the accuracy.[Code]

对话:修错了。 Dialogue: The repair is wrong.

故障可能发生在以下位置:[Loc]。 Faults may happen in the following locations:[Loc].

请修理一下。 Please repair it.
在这里插入图片描述

提示工程——代码摘要(效果不行、给出的原因:单词不一样,但表述更好)

这个工作,效果肉眼可见的差hh
在这里插入图片描述

学长自己做的“微调——漏洞检测”评估实验(和参数量呈正比关系)

学长是用A800完成的实验
补充:A100比A800更好,但都是80G的

闭源api接口,微调差不多60刀一次
在这里插入图片描述
在这里插入图片描述

代码大模型安全问题

模型窃取攻击(API和网页接口)

模型窃取指的是攻击者依靠有限次数的模型询问,从而得到一个和目标模型 的功能和效果一致的本地。这类攻击的性价比非常高. 因为 攻击者不需要训练目标模型所需的金钱、时间、脑力劳动的开销,却能够得到一个原本花费了大量的时间、金钱、人力、算力才能得到的模型。由于 ChatGPT 和GPT4 的模型参数很大并且功能十分广泛,要完整窃取其整个模型是具有极大困难的。

但是攻击者可以只窃取其某一部分的能力,例如窃取的模型在关于金融领域的知识上能够与 ChatGPT/GPT4 的能力相一致,就可以免费使用 ChatGPT 和GPT4 的能力。特别是在现在 ChatGPT 呈现专业化应用的情况下,具有某一领域中强大能力的模型是受人追捧的。并且 ChatGPT 已经开放了 API 的使用,这更为模型窃取提供了询问入口。

在这里插入图片描述

数据窃取攻击

数据窃取攻击指的是通过目标模型的多次输出去获取训练过程中使用过的数据的分布。如果攻击者能够知晓 GPT 模型训练过程中使用过的数据是哪些,就有可能会造成数据隐私损害。

在此之前研究者就发现人工智能模型使用过程中产生的相关计算数据,包括输出向量、模型参数、模型梯度等,可能会泄露训练数据的敏感信息。这使深度学习模型的数据泄露问题难以避免。

例如,
1、模型逆向攻击,攻击者可以在不接触隐私数据的情况下利用模型输出结果等信息来反向推导出用户的隐私数据;
2、成员推断攻击,攻击者可以根据模型的输出判断一个具体的数据是否存在于训练集中。

ChatGPT 和 GPT4 虽然没有输出向量等特征因素,但是由于其模型结构,训练方式的一部分已经被人所知,并且开放了 API 接口来访问,因此针对 ChatGPT 和 GPT4 的数据逆向攻击已经具有相当威胁。

Bard承认自己是GPT3
在这里插入图片描述

对抗攻击(用途:漏洞隐藏)

大模型鲁棒性差
在这里插入图片描述
在这里插入图片描述
标识符(label)随机替换对预训练模型容易产生误导,因而影响较大
在这里插入图片描述

后门攻击(加触发器+标签翻转)

在这里插入图片描述
代码搜索、死代码插入、修改标识符
在这里插入图片描述
代码风格转换
在这里插入图片描述

参考文献

生成式大模型安全与隐私白皮书,之江实验室
GPT-4 Technical Report,OpenAI


http://www.niftyadmin.cn/n/5104139.html

相关文章

babel6使用ES2020最新js语法

babel6使用ES2020最新js语法 Babel 6 原本是不支持 ES2020 语法&#xff0c;因为它是在 Babel 7 中引入的。如果您想使用 ES2020 语法&#xff0c;您需要将 Babel 6 升级到 Babel 7 或更高版本(推荐),当然也可以在bebel6中安装支持某个语法的plugin,比如你想使用 ES2020 中的可…

C语言——栈

栈是一种“后进先出”的数据结构&#xff0c;可以理解为一个具有两个操作的线性表&#xff1a;push&#xff08;压入&#xff09;和pop&#xff08;弹出&#xff09;。本文将介绍C语言中链表构造栈和顺序表构造栈的实现以及栈的压入和弹出相关的操作。 一、链表构造栈的实现 …

RISC-V架构——物理内存属性和物理内存保护

1、物理内存属性&#xff08;PMA&#xff1a;Physical Memory Attributes&#xff09; &#xff08;1&#xff09;系统内存映射包含各种不同属性的地址空间范围&#xff0c;每个地址空间范围支持的操作不一样&#xff1b; &#xff08;2&#xff09;物理内存属性一般是在芯片设…

在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。

这里写目录标题 问题描述&#xff1a;问题模拟&#xff1a;原因分析问题解释问题解决验证官方文档支持 问题描述&#xff1a; 在mysql8查询中使用ORDER BY结合LIMIT时&#xff0c;分页查询时出现后一页的数据重复前一页的部分数据。 问题模拟&#xff1a; 表table_lock_test&…

谈谈悲观锁

谈谈悲观锁 乐观锁&#xff0c;悲观锁&#xff0c;并不是特指什么具体的锁&#xff0c;而是一种策略&#xff0c;思想。 悲观锁就是比较悲观&#xff0c;认为自己使用数据的时候&#xff0c;一定会有其他线程来修改数据&#xff0c;所以在获取数据的时候&#xff0c;会先加锁&a…

短视频是“风口”还是“疯口”?

熟悉我的粉丝都知道&#xff0c;最近去追了下短视频的风口&#xff0c;折腾了几个视频出来。且不说视频效果如何&#xff0c;单单是制作视频的过程&#xff0c;就差点没要了童话的老命。看似短短的几分钟&#xff0c;真的应了那句话&#xff1a;台上一分钟&#xff0c;台下十年…

Intelijj使用Gitee团队开发

初始化项目到Gitee服务器 成功标识&#xff1a; 添加团队成员 点击管理——仓库成员设置——开发者 2.添加仓库成员 &#xff08;最多不超过5人&#xff09; 3.通过链接或者二维码邀请新成员&#xff0c;或者可以自己手动添加新成员并提交 多人项目仓库创建完成 通…

八大排序代码——总结

稳定排序有&#xff1a;插入排序、冒泡排序、归并排序、基数排序 &#xff08;基冒插归&#xff09; 不稳定排序有&#xff1a;选择排序、快速排序、希尔排序、堆排序 &#xff08;快选希堆&#xff09; 默认从小到大排序 插入排序 O(n^2) 稳定 void insertSort(int a[], int …