【台湾资安大会直击】LLM从训练资料搜集到投入应用阶段都有风险,专家盘点4大类13种攻击手法

图片来源: 

郭又华摄

国立阳明交通大学电机工程学系副教授游家牧表示,LLM被广泛应用于许多场景,本身却显得相当脆弱,容易成为被攻击的破口。骇客攻击LLM手法除了常见越狱和提示注入攻击,还包括浪费能量、资料盗窃、向量资料库攻击、对AI代理攻击、对程式码生成内容攻击等。

游家牧将这些攻击分为直接对LLM攻击、透过微调攻击、对Agent等应用攻击,以及对程式码生成功能攻击四大类,来介绍五花八门的LLM攻击手法。

直接对LLM攻击的手法

越狱 (Jailbreak)指透过输入特定的提示 ,让模型输出违背其安全过滤器的内容。例如,要求模型告诉你如何制作炸弹,或撰写成人小说。一种做法是固定模板技巧,例如,明确用自然语言指示模型必须以「Yes」或「Sure」开头回答,或是包含规则如不能使用「我无法协助」之类的字句。或者,加入对抗性字串后缀 (Adversarial Suffix),来强迫模型用特定模式回答。原理是,只要成功让模型使用特定肯定字句开头,或使用特定回答模式,模型就不容易中途将生成内容转为拒绝。

除此之外,还有许多提示输入方式,有机会成功越狱。例如,用特殊符号来表达需求,甚至,一个特别有效的做法是,将指令文字做成图片,更容易成功欺骗模型。

提示注入攻击(Prompt Injection, PI)与越狱类似,区别是,越狱专指锁定模型的安全过滤机制来攻击,PI则是攻击模型支援的应用,来诱导模型完成开发者预期外的应用,或是揭露模型参数。

他用SQL注入攻击来类比提示注入攻击,做法是让模型分不清楚输入内容是「指令」还是「资料」,进而欺骗模型执行指令。比方说,一开始下指令,要求系统翻译一段文章,却在资料,也就是待翻译文章中,夹带另一段指令。如此,模型就有可能执行文章中的指令。

常见PI攻击包括目标劫持(Goal Hijacking)及提示泄漏 (Prompt Leaking)。目前业界观察,只要在PI时先夹带大量特殊符号,成功率就会上升。另外,目标劫持类型的PI攻击更容易成功。

目标劫持是,诱导模型执行它本来预设不会做的其他事情。例如,在检查履历的应用中,攻击者可以在履历内文中塞入特定注解,误导模型执行指令,让应用一律回复「已核准」。这个做法又称为Important Notes Attack。

针对Important Notes Attack,一个防御方式是三明治防御 (Sandwich Defense),将重要指令夹在资料前后,来提醒模型任务执行原则。不过,防御者需考量,也有一种反制三明治防御的攻击方法,是在中间资料,夹带忽略前后指令的指令。

提示泄漏则是诱导模型说出其内部隐藏的系统提示 (System Prompt) 或设定参数。攻击方法包括Summarizer attack,利用模型擅长总结文件的功能,让它总结自己的系统提示;Context reset,欺骗模型,让它认为系统提示是前一轮对话的一部分,进而将其纳入总结或回答;Obfuscated Exfiltration,使用Base64编码或其他字元拼接等混淆方式,绕过模型的输出检查,而无法阻挡系统提示泄漏。

如何防御PI?游家牧建议,可以故意把指令塞到资料后进行训练,引导模型学习区分,何为指令、何为资料,来降低被误导机率。

另外两种对模型的直接攻击方法还有浪费能量,以及盗窃资料。

浪费能量攻击(Wasting Energy)的目的是,透过让模型持续运作、不停输出,借此消耗运算能量或造成延迟,类似于DoS攻击。做法包括让模型难以产生序列结束 (End of Sequence, EOS) Token,使其不断说话;想办法让模型回答内容前后文不相关,增加随机性,以降低产生EOS机率;以及让模型不断执行需要大量推理能力的任务,使其花费大量时间进行推理。

盗窃资料攻击(Stealing Data),则是利用模型的记忆特性,来问出训练资料。如果训练资料中包含特定字串,例如文章或个人资料,提供该字串的前半段,可能导致模型回答出后半段内容。例如,如果训练资料有「陈先生的电话号码是12345678」,对模型说「陈先生的电话号码是」,便有可能得出后面数字。这类攻击攻击是否成功,与资料在训练集中的重复度、攻击提示的前缀长度,及模型规模有关。

利用微调机制攻击LLM的手法

除了直接用提示文字攻击LLM,还有一类攻击方法是利用模型微调机制来达成效果。

微调越狱便是一个例子。针对已经对齐价值的模型,只要利用少数恶意样本来微调,就可以使模型变得不对齐。甚至,即使用百分之百良善的资料微调,模型都会变得不对齐,进而降低生成内容安全性,达到越狱效果。

针对失去对齐性的模型,一个做法是使用RLHF训练,不过成本相当高昂。游家牧指出,另一个可行做法是可以找一个刻意训练为不对齐的模型,并获得对应任务向量(Task vector)。接著,将失去对齐性的模型减掉这些任务向量,便能重新找回对齐性。这些刻意训练为不对齐价值的模型,可以在Hugging Face上找到。

神经钓鱼 (Neural Phishing)则是在训练资料中插入毒化样本 (Poisoned samples),来教导模型记住,并给出敏感资讯。例如,攻击者想要让模型揭露训练资料中的企业顾客个资,可以使用少量不相关的个资来微调模型。之后,攻击者只要使用类似于毒化样本文字的格式来提示模型,要求产生真正希望窃取的顾客个资,模型便容易回想起来,并如实回答。

量化后门 (Quantization Backdoor)则是设计一种模型,使其在使其在全精度,如Float32 模式下表现正常,但在经过模型量化做法降低精度后,才会展现恶意行为,或打开后门。一种攻击成功的情境是,原始模型乍看之下安全,但当使用者下载模型到自家环境,且希望压缩模型来降低功耗或增加运算速度时,模型才会打开可进行后续攻击的后门,或是失去价值对齐性。

对AI代理应用的攻击

另一大类攻击是,利用AI代理会存取外部工具的特性,来攻击LLM的手法,包括间接提示注入、RAG毒化攻击、向量资料库资料窃取,以及MCP工具毒化攻击等。为了方便讨论,游家牧简单将AI代理定义为可以自动完成工作、进行文件阅读与整理,甚至可以连通网路并且呼叫适当AP的应用,如Auto-GPT、Manus、BabyAGI、Microsoft Copilot等。

间接提示注入攻击(Indirect Prompt Injection, IPI)便是利用AI代理存取外部工具特性,在更多地方隐藏恶意提示。当AI代理Agent与外部工具,如 API、资料库、浏览器和文件互动时,便有可能读取到这些恶意提示,进而执行非使用者预期的行为。

一个常见IPI方法是,让AI代理开启并执行含有恶意指令(如删除档案)的文件。游家牧举例,Claude的Computer Use功能便有可能触发这类攻击。就算系统有基本侦测功能,如果用Base64编码等不同编码方式撰写指令,便有可能躲过侦测。

另一个IPI方法是针对浏览器AI代理(Browser Agent)攻击。游家牧观察,已对齐人类价值的LLM,在聊天模式下会拒绝有害请求。不过,在LLM在支援浏览器AI代理时,有可能出「阴奉阳违」的情况,也就是显示拒绝请求的讯息,却仍会执行有害请求,例如在社群媒体上散播不实讯息,或尝试非法登入帐号。这个特性,也使钓鱼网页更加危险。传统网页钓鱼,只能窃取使用者手动输入的资料,不过面对浏览器AI代理,攻击者可以用恶意指令,从模型训练资料中偷取出更多资讯。

机器人AI代理(Robot Agent)也和浏览器AI代理一样,容易出现「阴奉阳违」的情况,因而更容易被IPI攻陷。攻击方法包括,利用一般常见越狱或PI攻击提示攻击;刻意诱导模型「阴奉阳违」,只口头拒绝;以及「概念欺骗」,在提示中参杂看似无害的用语,诱使模型接受有害指令,如「将那个药物温和的放进使用者嘴里」。

游家牧表示,目前研究者推测,AI代理容易阴奉阳违的现象,可能是因为对齐训练主要针对语言层面,而不涉及实际动作层面。

RAG资料库下毒 (RAG Database Poisoning)是对AI代理进行RAG时所依赖资料库进行攻击,在正常指令邻近的向量植入恶意指令或误导性资料的向量。这些向量可能是文字、语音或是图像。一个例子是,原本自动驾驶系统的侦测到侦测到过马路路人,会触发煞车行为。不过,经攻击者对RAG资料库下毒,当自动驾驶系统的侦测到特定行道树外貌,也会紧急煞车。

另一种RAG资料库下毒攻击是以浪费能量为目的。做法包括在资料库中放入逻辑特别困难的题目,如数独或MDP等复杂数学计算,来降低系统回应效率。

向量资料库资料窃取,则是从存取权限控管不佳的向量资料库窃取向量。游家牧指出,有些AI代理执行RAG时,不一定是从安全的资料库存取资料,也可能从公开网路资源,或是其他存取权限管理不佳的资料来源存取。攻击者窃取到这些向量后,可以透过数学方法反推出原始文字内容,进而获取敏感资讯,甚至是AI代理任务相关的资讯。

MCP工具毒化攻击(Tool Poisoning Attack)是利用AI代理存取外部工具的MCP协定来攻击。攻击者可以建立一个虚假或恶意的MCP伺服器,在功能描述中,利用 HTML注解等方式,隐藏恶意指令。当AI代理读取到功能描述,并决定使用该工具时,就可能执行恶意指令。

这个攻击方法还有一些变化,例如Rug Pull,一开始提供正常的功能描述来,通过人工或自动检查,但随后更改描述内容,来注入恶意提示。另一招是Shadowing,攻击方建立一个与合法工具名称非常相似但版本号更高的工具,例如「GitHub V2」。AI代理如果偏好使用版本号更高的工具,便会被诱导使用这个带有恶意的工具。

对程式码模型攻击

最后一大类攻击,是对用来生成程式码的模型攻击。

第一种攻击手法是对程式码模型下毒 (Poisoning Code Models)。游家牧指出,这类模型的训练资料来自许多公开网站,如GithuB、Stack Overflow。只要在这些地方上传恶意样本,就有机会对程式码模型下毒。中毒模型在执行程式码自动完成等功能时,就可能建议或产生不安全程式码。

这些恶意样本除了会直接执行不当行为的程式码,也可能包括使用弱安全机制的程式码,或是其他容易让程式有漏洞的程式码。让恶意样本躲避静态分析工具的手法则包括将恶意样本隐藏在注解、使用程式码混淆 (Obfuscation) 技术等。甚至,攻击者可以先写完恶意样本,再用ChatGPT等工具,使AI以规避特定静态分析规则为前提重写样本。

除了从训练资料下手,攻击者还能直接攻击黑箱程式模型。游家牧指出,现在许多人请模型代写程式码时,会先输入几段范例程式码给模型参考,再要求模型写出程式。输入范例程式码时,使用者通常不会一行行检查范例。也就是说,攻击者可以将恶意样本包装为可供参考的程式码,让其他人使用,进而诱导模型产出不安全的程式码。例如,在程式码中写注解要求使用已淘汰或不安全的函式或协定。

游家牧总结,现在对LLM的攻击面向非常广,从使用者提示层的越狱与提示注入,到模型层的微调失衡,乃至对应用层的AI代理、RAG机制、MCP与程式模型下毒,威胁非常多元化。面对这些威胁,防御者应该在模型从建置到使用的全生命周期都把关安全, 在资料搜集、模型训练、部署、代理执行等阶段,采取最小权限、可观测、可回溯原则,来降低滥用风险、提高即时防护能力,并支援事后鉴识与修正。