CVE-2024-14021CVE-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加载索引。由于没有任何完整性校验机制(如签名验证),受害者无法察觉该文件已被篡改。