Skip to content

修复 redis_cache 中不安全的 pickle 反序列化#653

Open
apocalypse9949 wants to merge 2 commits into666ghj:mainfrom
apocalypse9949:main
Open

修复 redis_cache 中不安全的 pickle 反序列化#653
apocalypse9949 wants to merge 2 commits into666ghj:mainfrom
apocalypse9949:main

Conversation

@apocalypse9949
Copy link
Copy Markdown

@apocalypse9949 apocalypse9949 commented Mar 31, 2026

MindSpider/DeepSentimentCrawling/MediaCrawler/cache 子模块中的 redis_cache.py 模块原本使用 Python 标准库 pickle 来对存储在 Redis 缓存中的数据进行序列化和反序列化。

具体来说,get() 方法使用 pickle.loads(value),而 set() 方法使用 pickle.dumps(value)。

问题

在缓存系统中使用 pickle 被认为是高度不安全的。pickle 模块并不是为了抵御错误或恶意构造的数据而设计的。如果对来自不可信或未认证来源的数据进行反序列化(例如配置不当的 Redis 实例),攻击者可能在主机上执行任意代码。

如果攻击者获得了 Redis 数据库的写入权限(这种情况在配置错误的部署环境或 SSRF 攻击中很常见),他们就可以注入恶意的序列化 payload。当应用程序读取这些缓存条目时,pickle.loads() 会执行其中嵌入的代码,从而导致主机系统被完全攻陷,形成 远程代码执行(RCE) 漏洞。

修复

为了解决这一不安全的反序列化漏洞,项目已完全用 json 替换了 pickle 作为序列化机制:

将 import pickle 替换为 import json。
在 get() 方法中将 pickle.loads(value) 改为 json.loads(value)。
在 set() 方法中将 pickle.dumps(value) 改为 json.dumps(value)。

json 模块只支持序列化基本数据类型(例如字符串、列表、字典、数字等),并且在反序列化时不会执行任意代码。因此,这一修改在保留爬虫组件缓存功能的同时,有效消除了远程代码执行的风险。

在本地模拟环境中已运行测试,确认 json 可以正确处理应用程序中常见的缓存数据类型,例如字符串和字典。

@dosubot dosubot bot added the size:XS This PR changes 0-9 lines, ignoring generated files. label Mar 31, 2026
@apocalypse9949 apocalypse9949 changed the title Fix insecure pickle deserialization in redis_cache 修复 redis_cache 中不安全的 pickle 反序列化 Mar 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS This PR changes 0-9 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant