Skip to content

依赖漏洞与未使用依赖收敛 ​

状态:archived 类型:bug-fix Owner:backend/package/pyproject.toml

问题 ​

Dependabot 报告 unstructured 的 URL 分区 SSRF(低于 0.24.0)和 NLTK 模型文件路径越界(当前发布版暂无修复)。Yuxi 仅直接使用 NLTK 的英文分句能力;llama-index、llama-index-readers-file 和 unstructured 在源码中没有消费者,却把受告警的传递依赖带入运行时锁文件。Node 负向审计需要使用易受攻击的 js-yaml 验证 gate,但将其作为仓库 fixture 会被 Dependabot 误报为生产依赖。

决策 ​

删除没有源码消费者的 unstructured、LlamaIndex 依赖及直接 NLTK 依赖,用标准库分句实现替代英文 sent_tokenize,并补充分句回归测试。Compose、生产 Compose、API 镜像和 runtime identity migration 同步删除失效的 NLTK 数据目录、环境变量与 volume。PDF parser 单测使用标准库生成最小 PDF;生产解析路径直接使用已有的 pypdf,保留已审计的运行时版本。Node 负向 fixture 改为审计时在临时目录生成,保留漏洞版本和失败断言,同时不把它登记为仓库依赖。

替代方案 ​

  • 将 unstructured 升级到 0.24.0:与现有 aioboto3 的 wrapt<2.0 约束不相容,并会引入无关的大范围解析依赖变化。
  • 等待 NLTK 发布修复或直接依赖未发布的 Git 提交:无法形成可复现的已发布锁定版本。
  • 仅忽略 NLTK 或 fixture 告警:不能降低实际依赖风险,也会掩盖审计结果。
  • 将负向 fixture 升级到安全版本:会使 CI 负向控制失去验证对象。
  • 继续保留未使用的 LlamaIndex 依赖并只替换分句实现:仍会把有告警的 NLTK 带入锁文件。

后果 ​

PDF 文本读取路径由性能、构建体积与依赖优化进一步收敛:运行时直接调用 pypdf,保留 pypdf 的安全版本与解析职责。

运行时不再安装未使用的解析依赖和 NLTK,部署拓扑也不再创建或迁移 NLTK 数据目录;测试环境不再为了构造 PDF fixture 直接调用 pypdf,但生产 PDF 解析继续声明该真实运行时依赖。标准库分句器覆盖当前需要的英文句末标点、常见缩写、数字和引号边界;复杂英文语料的行为覆盖低于 NLTK,后续如出现真实消费者必须重新评估依赖和安全版本。Node 负向控制不再产生 Dependabot 可扫描的持久漏洞清单,但每次审计仍会临时生成并验证漏洞 fixture。

验证 ​

  • cd backend && uv audit --locked --no-dev:通过,212 个包未发现已知漏洞或不良项目状态。
  • cd backend && uv lock --check:通过。
  • docker compose exec -T api uv run --no-sync --group test pytest test/unit/plugins/test_ragflow_like_chunking.py test/unit/backends/test_semantic_chunking.py test/unit/knowledge/test_parser_facade.py -q -p no:cacheprovider:52 个测试通过。
  • docker compose exec -T api uv run --no-sync --group test pytest test/unit -m "not slow" -q -p no:cacheprovider:1771 个测试通过,50 个跳过。
  • docker compose config --quiet:开发 Compose 配置通过。
  • 使用占位必需变量执行 docker compose -f docker-compose.prod.yml config --quiet --no-env-resolution:生产 Compose 配置通过。
  • docker compose exec -T api uv run --no-sync --group test pytest test/unit/storage_migrations/test_v072_runtime_identity.py test/unit/config/test_docker_compose_service_boundaries.py test/unit/config/test_docker_compose_checkpointer.py -q -p no:cacheprovider:10 个测试通过,46 个需要容器内 Docker CLI 的配置测试跳过;Compose 配置已在宿主机单独验证。
  • cd web && pnpm audit --audit-level=high --prod、cd docs && pnpm audit --audit-level=high --prod:均通过,未发现已知漏洞。
  • bash scripts/dependency-audit-fixtures/run-node-negative-control.sh:通过;临时生成的 js-yaml@4.3.0 审计按预期失败并命中 GHSA 断言。
  • python3 -m unittest scripts.test_dependency_update_policy:5 个测试通过。
  • 默认环境下 make audit-dependencies 在 CLI 的 locked 检查停止:本机 uv 用户配置将默认索引设为镜像站,与 CLI 锁定的 PyPI 索引不同。显式执行 cd packages/yuxi-cli && uv audit --locked --no-dev --default-index https://pypi.org/simple 通过,40 个包未发现已知漏洞;使用同一索引重生成锁文件无差异,无需修改依赖声明或锁文件。
  • 2026-09-08:在空的临时 XDG_CONFIG_HOME 下并移除 UV_INDEX_URL / UV_DEFAULT_INDEX 环境覆盖后,make audit-dependencies 全部通过:backend 213 个包、CLI 40 个包、Web 与 docs 均未发现已知漏洞,Python 与 Node 负向控制均按预期拒绝漏洞 fixture;审计不修改锁文件。

旧能力不存在:backend/uv.lock 和生产依赖声明不再包含 unstructured、nltk 或 LlamaIndex,PDF 单测不再直接依赖 pypdf,源码不再导入 NLTK,Dockerfile、Compose 与 storage migration 不再声明 NLTK 数据路径。

重新引入条件:只有出现真实源码消费者、可复现的安全发布版本和对应集成测试时,才重新评估这些解析依赖;任何重新引入都必须先通过锁文件审计和安全评审。

本项目基于 MIT License 开源,欢迎使用和贡献。