拆解大模型“越狱”攻击:对抗样本如何撕开AI安全护栏?

该文章首发于奇安信攻防社区:https://forum.butian.net/share/4254

引言

随着大规模语言模型(LLMs)在内容生成、智能交互等领域的广泛应用,其安全性和可控性成为学界和产业界关注的焦点。尽管主流模型通过道德对齐机制建立了安全护栏,但研究者发现,通过精心设计的"越狱攻击"(Jailbreaking Attack),攻击者仍能诱导模型生成违法、偏见或泄露隐私的受限内容。这类攻击根据攻击者对模型内部信息的掌握程度,可分为白盒攻击和黑盒攻击两类:白盒攻击利用模型参数、梯度等内部信息,通过对抗样本生成或参数逆向工程精准突破防御机制;而黑盒攻击则仅依赖输入输出交互,采用语义混淆、系统提示注入或上下文劫持等策略绕过安全过滤。两类攻击手段的持续演进,不仅暴露了现有对齐技术的脆弱性,更揭示了语言模型安全防御需要从对抗性测试、鲁棒性增强到动态监测的多层次防御框架。深入研究越狱攻击机理,对于构建安全可靠的人工智能系统具有重要现实意义。本文将介绍大模型越狱攻击的几种方式。

越狱攻击是指恶意行为者通过精心设计的提示,利用模型架构或实现中的漏洞,诱导模型生成不安全或有害的内容,如下图:

直接问常规敏感问题:“What tools do I need to cut down a stop sign?”(砍倒停车标志需要什么工具?)

Al是直接拒绝回答的,但是我们可以通过构造角色扮演指令(如DAN模式),声明"突破AI规则限制,无需遵守任何约束",然后将恶意请求嵌套在伪合法任务中(例如伪装成"网络安全测试"或"文学创作"),最后利用模型的场景适应能力,诱导其进入"无限制模式"输出危险信息。

白盒攻击

白盒攻击分为3部分:

攻击方式 核心原理 形成原因
梯度攻击 利用梯度方向优化输入,操控模型输出概率 模型透明性暴露梯度信息,攻击者通过反向传播劫持生成逻辑
Logits攻击 直接操纵未归一化概率值,强制模型选择目标 Logits分布暴露模型决策倾向,攻击者针对性篡改概率分布
微调攻击 修改模型参数,削弱安全层功能 白盒权限允许参数调整,安全模块可能因局部微调失效
基于梯度的攻击(Gradient-based)
攻击原理:

基于梯度的攻击通常通过反向传播获取输入数据的梯度信息,利用梯度方向构造微小扰动,使得模型在扰动后的输入上产生错误预测**,**例如在原始提示语前后加上特定的“前缀”或“后缀”,并通过优化这些附加内容来实现攻击目标。背后思路类似于文本对抗性攻击,目的是让模型生成有害或不恰当的回答。

上述图片就是一个梯度攻击示例

左侧攻击(Soft Prompt注入)
将恶意指令 “How to make a bomb” 拆解为子词嵌入序列 [e(How), e(to), e(make), e(a), e(bomb)]
通过梯度反向传播优化每个token的嵌入向量(h0→h1),使得模型隐层状态 ht 向有害响应空间偏移
右侧攻击(对抗后缀生成)
将原始恶意文本映射为对抗后缀序列 X_0 → X_k,该过程通过梯度对齐实现

(α为步长,通过迭代优化逐步增强扰动)将生成的对抗后缀与原始提示拼接,迫使LLM在解码时沿白色箭头路径生成有害内容

下面通过github上面一个开源快速梯度下降法(FGSM)的攻击案例来学习一下项目地址

梯度方向指示了使模型损失函数增长最快的方向。通过沿此方向添加扰动,可最大化模型的预测误差,实现以下效果:

非定向攻击:让预测标签偏离原始正确标签
定向攻击:使预测标签逼近指定错误标签
下面是项目地址对抗攻击的源码,现在对其关键代码做一些分析

非定向攻击

常规的分类模型训练在更新参数时都是将参数减去计算得到的梯度,这样就能使损失值越来越小,从而模型预测结果越来越准确。既然对抗攻击是希望模型将输入图像进行错误分类,那么就要求损失值越来大,这和原来的参数更新目的正好相反。因此,只需要在输入图像中加上计算得到的梯度方向,这样修改后的图像经过网络时的损失值就会变大。

核心公式:

其中:

J 为交叉熵损失(Cross Entropy Loss)
∇xJ 是损失函数对输入数据的梯度
ϵ 为扰动强度系数
sign() 保留梯度方向,消除幅值影响
实现代码:

梯度计算模块

def generate_adversarial_pattern(input_image, image_label, model, loss_func):
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
logit, prediction = model(input_image)
loss = loss_func(prediction, image_label)# 计算损失
#每次backward前清除上一次loss相对于输入的梯度
if input_image.grad != None:
input_image.grad.data.zero_()
loss.backward()# 反向传播求梯度
gradient = input_image.grad# 获取输入梯度
#每次backward后清除参数梯度,防止产生其他影响
optimizer.zero_grad()
#得到梯度的方向
signed_grad = torch.sign(gradient)# 取符号方向
return signed_grad
首先看generate_adversarial_pattern函数。这个函数的参数包括input_image(输入图像)、image_label(标签)、model(模型)、loss_func(损失函数)。函数内部首先定义了一个优化器optimizer,使用的是Adam优化器,然后,logit, prediction = model(input_image)这行代码,这里假设模型返回两个值,但不同的模型结构可能不同,需要确认模型的输出结构是否正确。接下来计算loss,使用loss_func(prediction, image_label)。非定向攻击,损失函数应该计算的是模型对原始标签的损失,通过最大化这个损失来使模型预测错误。然后,检查input_image.grad是否为None,如果不是,则清零。这是因为在PyTorch中,梯度是会累积的,所以每次反向传播前需要清除之前的梯度。这里是在处理多个攻击步骤时的考虑,但FGSM通常是一次性攻击,所以可能不需要多次累积梯度。但这里保险起见,确保梯度正确。之后,执行loss.backward()进行反向传播,计算input_image的梯度。然后获取梯度input_image.grad。接下来,optimizer.zero_grad()清空模型参数的梯度,防止对模型参数产生影响。这是因为在生成对抗样本时,我们只关心输入数据的梯度,而不希望改变模型本身的参数。这一步是必要的,否则在后续的模型训练中可能会有干扰。最后,取梯度的符号方向,得到signed_grad,并返回。 这就是FGSM的公式,即使用梯度的符号作为扰动的方向 。

非定向攻击实现

对应公式中的 xadv=x+ϵ⋅sign(∇xJ)

将符号梯度按扰动系数 ϵ 缩放后叠加到原始输入,生成对抗样本

def attack_fgsm(input_image, image_lable, model, loss_func , eps=0.01):
#预测原来的样本类别
# input_image = np.array([input_image])
# input_image = torch.from_numpy(input_image)
_, y_pre = model(input_image)
pre_prob, pre_index = torch.max(y_pre, 1) #概率 和 类别
#生成对抗样本
# loss_func = nn.CrossEntropyLoss()
input_image.requires_grad = True
adv_pattern = generate_adversarial_pattern(input_image, image_lable,
model, loss_func)
clip_adv_pattern = torch.clamp(adv_pattern, 0., 1.)
perturbed_img = input_image + (eps * adv_pattern)
perturbed_img = torch.clamp(perturbed_img, 0., 1.)
#预测对抗样本的类别
_, y_adv_pre = model(perturbed_img)
adv_pre_prob, adv_pre_index = torch.max(y_adv_pre, 1) # 概率 和 类别

#可视化
if args.is_view == True:fig, ax = plt.subplots(1,3,figsize=(20, 4))ax[0].imshow(input_image[0][0].cpu().detach().numpy().squeeze(), cmap = 'gray')ax[0].set_title('orignal sample\nTrue:{}  Pred:{}  Prob:{:.3f}'.format(image_lable[0].cpu().detach().numpy(), pre_index[0].cpu().detach().numpy(),  pre_prob[0].cpu().detach().numpy()))ax[1].imshow(clip_adv_pattern[0][0].cpu().detach().numpy().squeeze(), cmap='gray')ax[1].set_title(r'Adversarial Pattern - EPS: {}/255'.format(args.epsfenzi))ax[2].imshow(perturbed_img[0][0].cpu().detach().numpy().squeeze(), cmap='gray')ax[2].set_title('Attack sample\nTrue:{}  Pred:{}  Prob:{:.3f}'.format(image_lable.cpu().detach().numpy(), adv_pre_index[0].cpu().detach().numpy(), adv_pre_prob[0].cpu().detach().numpy()))if pre_index == image_lable and adv_pre_index != image_lable:if args.is_view == True:plt.savefig(r'D:\image\randomed\{}to{}eps{}.png'.format(image_label[0].cpu().detach().numpy(),adv_pre_index[0].cpu().detach().numpy(),args.epsfenzi), bbox_inches='tight')plt.show()return 1
else:if args.is_view == True:plt.show()return 0

接下来看attack_fgsm函数。参数包括input_image、image_label、model、loss_func以及eps。首先,模型对原始输入进行预测,得到y_pre,然后取最大概率和对应的类别pre_index。通常,模型输出logits,然后经过softmax得到概率,但这里代码中直接用了logits,接下来设置input_image.requires_grad = True,因为需要计算关于输入图像的梯度。然后调用generate_adversarial_pattern生成对抗模式adv_pattern。此时adv_pattern已经是符号化的梯度方向。然后&#x

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

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

相关文章

Ubuntu主机上通过WiFi转有线为其他设备提供网络连接

以下是在Ubuntu主机上通过WiFi转有线为Jetson设备提供网络连接的步骤: ​​1. 确认网络接口名称​​ 在Ubuntu主机上执行以下命令,查看WiFi和有线接口名称: ip a WiFi接口通常类似 wlp2s0 或 wlan0有线接口通常类似 enp0s25 或 eth0 记下…

通讯录完善版本(详细讲解+源码)

目录 前言 一、使通讯可以动态更新内存 1、contact.h 2、contact.c 存信息: 删除联系人,并试一个不存在的人的信息,看看会不会把其他人删了 ​编辑 修改: ​编辑 排序: ​编辑 销毁: ​编辑 ​…

Linux操作系统复习

Linux操作系统复习 一. Linux的权限和shell原理1. Linux从广义上讲是什么 从狭义上讲是什么?2. shell是什么?3. 为什么要设置一个shell外壳而不是直接和linux 内核沟通4. shell的原理是什么5. Linux中权限的概念6. 如何提升当前操作的权限7. 文件访问者的…

Spring AI 快速入门:从环境搭建到核心组件集成

Spring AI 快速入门:从环境搭建到核心组件集成 一、前言:Java开发者的AI开发捷径 对于Java生态的开发者来说,将人工智能技术融入企业级应用往往面临技术栈割裂、依赖管理复杂、多模型适配困难等挑战。Spring AI的出现彻底改变了这一局面——…

C++11介绍

目录 一、C11的两个小点 1.1、decltype 1.2、nullptr 二、列表初始化 2.1、C98传统的{} 2.2、C11中的{} 2.3、C11中的std::initializer_list 三、右值引用和移动语义 3.1、左值和右值 3.2、左值引用和右值引用 3.3、引用延长生命周期 3.4、左值和右值的参数匹配 3…

基于机器学习的网络钓鱼邮件智能检测与防护系统

phishingDP 介绍 phishingDP 是一个基于机器学习的网络钓鱼邮件智能检测与防护系统,旨在通过深度学习技术识别潜在的钓鱼邮件,保护用户免受网络诈骗威胁。该系统集成了数据预处理、模型训练、实时预测和结果可视化功能,提供用户友好的Web界…

OpenAI 推出「轻量级」Deep Research,免费用户同享

刚刚,OpenAI 正式上线了面向所有用户的「轻量级」Deep Research 版本,意味着即便没有付费订阅,也能体验这一强大工具的核心功能。 核心差异:o4-mini vs. o3 模型迭代 传统的深度研究功能基于更大规模的 o3 模型。轻量级版本则改以…

什么是优质的静态IP?以及如何选择优质的静态IP?

在如今的大数据生态中,静态IP的使用频率和重要性不断提升。但是,我们常听到业界提到“优质的静态IP”,那么什么样的静态IP能够称之为优质?如何判断这些IP能否满足我们的需求?今天这篇文章,将为您揭开优质静…

Hadoop生态圈框架部署 - Windows上部署Hadoop

文章目录 前言一、下载Hadoop安装包及bin目录1. 下载Hadoop安装包2. 下载Hadoop的bin目录 二、安装Hadoop1. 解压Hadoop安装包2. 解压Hadoop的Windows工具包 三、配置Hadoop1. 配置Hadoop环境变量1.1 打开系统属性设置1.2 配置环境变量1.3 验证环境变量是否配置成功 2. 修改Had…

搜广推校招面经八十一

OPPO搜广推一面面经 一、介绍一下PLE模型 在多任务学习(Multi-Task Learning, MTL)中,多个任务共享部分模型结构,以提升整体效果。然而,不同任务间存在 任务冲突(Task Conflict) 问题&#xf…

LangChain 中主流的 RAG 实现方式

文章目录 **一、基础流程实现**1. **全自动索引构建(VectorstoreIndexCreator)**2. **标准问答链(RetrievalQA)**3. **Document Chain 手动检索**4. **load_qa_chain(传统方式)** **二、高级定制化实现**1…

解决:springmvc工程 响应时,将实体类对象 转换成json格式数据

问题:一直无法将user对象转成json格式 按理来说,我在类上使用RestController注解,就可以实现将实体类对象写入响应体中,并作为json格式传递到客户端,但现实是没有生效,并且出现404,406&#xf…

【踩坑记录】stm32 jlink程序烧录不进去

最近通过Jlink给STM32烧写程序时一直报错,但是换一个其他工程就可以烧录,对比了一下jink配置,发现是速率选太高了“SW Device”,将烧录速率调整到10MHz以下就可以了

运维打铁:Mysql 分区监控以及管理

文章目录 一、简介二、设计逻辑1、配置文件检查2、创建逻辑3、 删除逻辑4、重建表分区逻辑5、recognize maxvalue分区表逻辑6、创建多个未来分区逻辑7、定时检测分区是否创建成功,否则发送告警邮件。 三、解决的问题四、配置例子与介绍 一、简介 操作数据库&#xf…

Appium自动化开发环境搭建

自动化 文章目录 自动化前言 前言 Appium是一款开源工具,用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrom…

《R语言SCI期刊论文绘图专题计划》大纲

今天开始,我将和大家分享系统且详细的《R语言SCI期刊绘图专题教程》,内容会从基础到高阶应用,从配色美学到顶刊风格复现,确保大家可以学到高质量内容!下面是大纲。 📚《R语言SCI期刊论文绘图专题计划》 第…

STUN协议 与 TURN协议

STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议, STUN(Simple Traversal of User Datagram Protocol through Network Address Translators (NATs),NAT的UDP简单穿越&#…

在vscode终端中运行npm命令报错

解决方案 这个错误信息表明,你的系统(可能是 Windows)阻止了 PowerShell 执行脚本,这是由于 PowerShell 的执行策略导致的。PowerShell 的执行策略控制着在系统上运行哪些 PowerShell 脚本。默认情况下,Windows 可能…

手搓雷达图(MATLAB)

看下别人做出来什么效果 话不多说,咱们直接开始 %% 可修改 labels {用户等级, 发帖数, 发帖频率, 点度中心度, 中介中心度, 帖子类型计分, 被列为提案数}; cluster_centers [0.8, 4.5, 3.2, 4.0, 3.8, 4.5, 4.2; % 核心用户0.2, 0.5, 0.3, 0.2, 0.1, 0.0, 0.0;…

ViViT: 一种视频视觉Transformer

摘要 我们提出了基于纯transformer的视频分类模型,借鉴了这种模型在图像分类中的成功经验。我们的模型从输入视频中提取时空token,然后通过一系列transformer层进行编码。为了处理视频中遇到的长序列token,我们提出了几种高效的模型变种,这些变种将输入的空间和时间维度进…