Python pickle解压时可能存在安全风险

Python pickle解压时可能存在安全风险

 

如果解压对像中有重构的reduce操作, pickle.loads时会执行reduce方法中的内容.

比如:

复制代码
import io
import os
import pickle

class BadCode(object):
    def __reduce__(self):
        return (os.system, ('echo fuckyou!',))


bc = BadCode()

bbb = pickle.dumps(bc)
pickle.loads(bbb)
复制代码

 

限制方法, 重载一下Unpicke方法, 只解压特定类型的对像.

 

复制代码
class RestrictedUnpickler(pickle.Unpickler):
    def find_class(self, module, name):
        print(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")
    def load_reduce(self):
        # 禁止使用 reduce
        raise pickle.UnpicklingError("reduce() is not allowed")

def restricted_loads(s):
    return RestrictedUnpickler(io.BytesIO(s)).load()


ok = restricted_loads(bbb)

print('ok: ',ok)
复制代码

 

posted @   酱_油  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· c# 半导体/led行业 晶圆片WaferMap实现 map图实现入门篇
点击右上角即可分享
微信分享提示