百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

这模型有毒! 制作模型会中毒

ztj100 2024-12-17 17:48 20 浏览 0 评论

最近遇到了一个 Pickle 反序列化失败的问题,去更深入地了解了 Pickle,发现 Pickle 确实是一种不安全的序列化工具,我们尽量不要对不信任的数据包做反序列化操作,官方文档也写注重强调了:

Warning The pickle module is not secure. Only unpickle data you trust.
It is possible to construct malicious pickle data which will execute arbitrary code during unpickling. Never unpickle data that could have come from an untrusted source, or that could have been tampered with.

Consider signing data with hmac if you need to ensure that it has not been tampered with.

Safer serialization formats such as json may be more appropriate if you are processing untrusted data. See Comparison with json.

我想起了 torch 的模型文件也是可以序列化的,而且用的也是 Pickle,别有用心的人可以在模型中投毒使坏,我举个例子:

import torch
import torch.nn as nn
import torch.nn.functional as F
import os
class TestNet(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.l1 = nn.Linear(1, 2)
    def forward(self, x):
        x = F.relu(self.l1(x))
        return x
    def __reduce__(self):
        return (os.system, ('top',))
if __name__ == '__main__':
    a = TestNet()
    torch.save(a, 'a.pt')
    b = torch.load('a.pt')

执行上面的代码,你会发现程序卡在了 top 命令中,这是因为 torch.save 会调用 __reduce__函数,序列化 os.system('top') 命令,再反序列化 torch.load 时,从而执行 top 命令:

0: \x80 PROTO      4
2: \x95 FRAME      30
11: \x8c SHORT_BINUNICODE 'posix'
18: \x94 MEMOIZE    (as 0)
19: \x8c SHORT_BINUNICODE 'system'
27: \x94 MEMOIZE    (as 1)
28: \x93 STACK_GLOBAL
29: \x94 MEMOIZE    (as 2)
30: \x8c SHORT_BINUNICODE 'top'
35: \x94 MEMOIZE    (as 3)
36: \x85 TUPLE1
37: \x94 MEMOIZE    (as 4)
38: R    REDUCE
39: \x94 MEMOIZE    (as 5)
40: .    STOP

所以我们要怎么防御呢?在 Pickle 反序列化时,会调用 find_class 函数获取类,我们可以禁用重载这个函数禁用掉 os 类,从而不执行命令:

import pickle
import types
class RestrictedUnpickler(pickle.Unpickler):
    def find_class(self, module, name):
        if module == "builtins" and name in {"str", "list", "dict", "set", "int", "float", "bool"}:
            return getattr(__import__(module), name)
        raise pickle.UnpicklingError(f"global '{module}.{name}' is forbidden")

setattr(pickle, "loads", restricted_loads)

import torch
b = torch.load('a.pt')

注入上面防御代码后,基本上就安全了:

_pickle.UnpicklingError: global 'posix.system' is forbidden

还有前端时间比较火的某大厂实习生模型投毒事件,一开始的反应也是通过上面 Pickle 的漏洞实现的,后面从一些报道来看,也不是这种,是通过 transformersload 模型时使用 trust_remote_code 参数执行远程的代码实现的,这样一来也挺难发现的 ,如果你一直检查自己的代码是不能发现问题的,因为启动运行时才会把你的代码替换成模型中的代码。起初他用这个功能只是用来 debug 的,后来经过某些事情,一念成魔了。


这种攻击要怎么防御呢?这种不好防御,应谨慎处理远程代码的信任问题,避免潜在的安全风险。

这篇文章的核心目的并非教授攻击技巧,而是着重于如何进行有效的防御。

大家且行且珍惜,共勉。

相关推荐

Java网络编程(JAVA网络编程技术)

网络编程三要素1.IP地址:表示设备在网络中的地址,是网络中设备的唯一标识2.端口号:应用程序在设备中唯一的标识3.协议:连接和数据在网络中传输的规则。InetAddress类Java中也有一个...

字节Java全能手册火了!多线程/网络/性能调优/框架啥都有

前言在这个技术不断更新的年代,跟不上时代变化的速度就会被刷掉,特别是咱们程序员这一群体,技术不断更新的同时也要同时进步,不然长江后浪推前浪,前浪......一个程序员从一个什么都不懂的小白在学到有一定...

一分钟了解java网络编程(java基础网络编程)

一、OSI七层网络模型应用层:Http协议、电子邮件传输、文件服务器等;表示层:数据转换,解决不同系统的兼容问题(跨语言);会话层:建立与应用程序的会话连接;传输层:提供了端口号和传输协议(TPC/U...

Java编程-高并发情况下接口性能优化实践-提升吞吐量TPS

记得前段时间工作中接到一个任务是优化一个下单接口的性能提高接口的吞吐量TPS,前期通过arthas工具跟踪接口的具体方法调用链路及耗时,发现了影响此接口的性能瓶颈主要是加锁的方式,后来变更了锁的方式...

socket 断线重连和心跳机制如何实现?

一、socket概念1.套接字(socket)是网络通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,...

迅速了解-Java网络编程(java基础网络编程)

Java网络编程在JavaSE阶段,我们学习了I/O流,既然I/O流如此强大,那么能否跨越不同的主机进行I/O操作呢?这就要提到Java的网络编程了。...

Java网络编程详解(java 网络编程)

网络编程基础知识最!最!最!重要网络编程基础概念网络编程不等于网站编程,网络编程即使用套接字(socket)来达到各进程间的通信,现在一般称为TCP/IP编程;网络编程分为服务端和客户端。服务端就相当...

「开源推荐」高性能网络通信框架 HP-Socket v5.7.2

简介HP-Socket是一套通用的高性能TCP/UDP/HTTP通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/...

Java网络编程从入门到精通:打造属于你的网络世界

Java网络编程从入门到精通:打造属于你的网络世界在当今这个信息爆炸的时代,网络编程已经成为程序员必不可少的一项技能。而Java作为一种功能强大且广泛使用的编程语言,在网络编程领域也有着举足轻重的地位...

5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色

一、核心功能与定位1.Socket类:底层通信的基石-位于System.Net.Sockets命名空间,提供对网络协议栈的直接操作,支持TCP、UDP等多种协议。-手动管理连接细节:需...

(三)谈谈 IO 模型(Socket 编程篇)

快过年啦,估计很多朋友已在摸鱼的路上。而我为了兄弟们年后的追逐,却在苦苦寻觅、规划,导致文章更新晚了些,各位猿粉谅解。上期分享,我们结合新春送祝福的场景,通过一坨坨的代码让BIO、NIO编程过程呈...

大数据编程入门:Java网络编程(大数据 编程)

如果想要编写出一个可以运行在多个设备上的程序,应该怎么做呢?答案是网络编程,今天小编将为大家带来大数据编程入门:Java网络编程。一、网络编程概念网络编程是指编写在通过网络连接的多个设备(计算机)上运...

基于JAVA的社交聊天室(java聊天设计与实现)

基于Java的社交聊天室一、前言随着互联网技术的迅速发展,实时通信和在线社交已成为人们日常生活的重要组成部分。基于Java的社交聊天室系统,凭借其跨平台、高性能和安全性等特点,为用户提供了一个集中、开...

java-socket长连接demo体验(java socket长连接)

作者:DavidDing来源:https://zhuanlan.zhihu.com/p/56135195一、前言最近公司在预研设备app端与服务端的交互方案,主要方案有:服务端和app端通过阿里i...

JAVA数据库编程(java数据库编程指南)

预计更新###第一节:什么是JAVA-JAVA的背景和历史-JAVA的特点和应用领域-如何安装和配置JAVA开发环境###第二节:JAVA基础语法-JAVA的基本数据类型和变量-运算符和...

取消回复欢迎 发表评论: