Files
Genarrative/docs/audits/SECURITY_VULNERABILITY_SCAN_2026-05-11.md

12 KiB
Raw Blame History

安全漏洞扫描报告 2026-05-11

扫描范围

  • 工作区:C:/proj/Genarrative/.worktrees/hermes-3337436a
  • 分支:hermes/hermes-3337436a
  • Git 基线:扫描时存在一个未跟踪计划文件 .hermes/plans/2026-05-11_205658-security-vulnerability-scan.md
  • 扫描对象:根 Node/Vite/React 依赖、server-rs Rust workspace 依赖入口、仓库已跟踪文件中的敏感配置、JS/TS/Rust 源码安全热点。

扫描命令与工具状态

已执行:

pwd
git branch --show-current
git rev-parse --show-toplevel
git status --short
node --version
npm --version
cargo --version
rustc --version
rg --version
npm audit --json
npm audit --audit-level=moderate
git ls-files -z | xargs -0 grep -nIE "(api[_-]?key|secret|password|passwd|token|private[_-]?key|BEGIN (RSA|OPENSSH|EC|DSA)? ?PRIVATE KEY|AKIA[0-9A-Z]{16}|xox[baprs]-|sk-[A-Za-z0-9_-]{20,})"
rg -n "\beval\(|new Function\(|dangerouslySetInnerHTML|innerHTML\s*=|document\.write\(" src apps scripts packages
rg -n "exec\(|execSync\(|spawn\(|spawnSync\(|shell:\s*true|child_process" scripts src apps packages
rg -n "Command::new|std::process|\.unwrap\(|\.expect\(|fs::|File::open|PathBuf|set_header|cors|CorsLayer" server-rs/crates
rg -n "allow_origin|Any|cookie|Authorization|Bearer|refresh|access_token|set_cookie|SameSite|Secure|HttpOnly" server-rs/crates src apps scripts

工具版本:

  • Nodev22.22.2
  • npm10.9.7
  • Cargocargo 1.95.0 (f2d3ce0bd 2026-03-21)
  • Rustcrustc 1.95.0 (59807616e 2026-04-14)
  • ripgrep15.1.0
  • gitleaks:未安装,本次未执行。
  • cargo-audit:未安装,本次未执行;未擅自安装到用户环境。

原始扫描输出保存于:

  • .hermes/plans/assets/security-scan-2026-05-11/npm-audit.json
  • .hermes/plans/assets/security-scan-2026-05-11/npm-audit.txt
  • .hermes/plans/assets/security-scan-2026-05-11/secret-grep.txt
  • .hermes/plans/assets/security-scan-2026-05-11/js-xss-dynamic.txt
  • .hermes/plans/assets/security-scan-2026-05-11/node-command-exec.txt
  • .hermes/plans/assets/security-scan-2026-05-11/rust-hotspots.txt
  • .hermes/plans/assets/security-scan-2026-05-11/auth-cors-hotspots.txt

注意:secret-grep.txt 可能包含敏感片段,提交前应删除或改为脱敏摘要,不建议直接进入 Git。

摘要

等级 数量 说明
Critical 1 .env.local 被 Git 跟踪且含多项非空真实密钥/凭据形态配置。
High 2 npm 依赖存在 8 个 high advisory 聚合项Vite dev server 任意文件读取类漏洞需要优先升级。另有 TypeScript ESLint 链路 ReDoS 风险。
Medium 2 esbuild dev server 请求读取、PostCSS CSS stringify XSS。
Low 3 jsdom/http-proxy-agent/@tootallnate/once 低危链路。
Unknown 1 Rust 依赖漏洞未完成扫描,因为本机未安装 cargo-audit
Informational 多项 源码热点扫描命中大量测试/脚本/unwrap/expect需要按入口人工复核。

Critical

C-1仓库跟踪了 .env.local,且包含多项非空真实密钥形态配置

证据:

git ls-files --error-unmatch .env.local 显示 .env.local 已被 Git 跟踪。扫描确认该文件包含多项非空密钥/凭据形态变量,包括但不限于:

  • LLM_API_KEY
  • ARK_API_KEY
  • ARK_CHARACTER_VIDEO_API_KEY
  • DASHSCOPE_API_KEY
  • VOLCENGINE_ACCESS_KEY_ID
  • VOLCENGINE_SECRET_ACCESS_KEY
  • ALIYUN_SMS_ACCESS_KEY_ID
  • ALIYUN_SMS_ACCESS_KEY_SECRET
  • GENARRATIVE_LLM_API_KEY
  • ALIYUN_OSS_ACCESS_KEY_ID
  • ALIYUN_OSS_ACCESS_KEY_SECRET
  • GENARRATIVE_ADMIN_PASSWORD

报告中不记录具体值。

影响:

如果该文件已进入远端仓库或被团队成员拉取相关外部服务密钥、OSS/SMS/LLM/后台密码均应视为已泄露。即使后续从当前工作树删除,也不能撤销历史泄露风险。

建议修复:

  1. 立即轮换 .env.local 中出现过的所有真实密钥、访问密钥、后台密码和 token。

  2. 从 Git 跟踪中移除 .env.local,但不要删除本地私有文件:

    git rm --cached .env.local
    
  3. 按项目约束,不要在 .gitignore 中新增 .env.local;如果仓库已有其他机制管理本地私密 env应遵循既有约定。若没有应先补一份安全说明文档而不是提交真实 .env.local

  4. 将必要的占位示例保留在 .env.exampledeploy/env/api-server.env.example,确保示例值不是可用密钥。

  5. 如该文件已推送到远端历史,评估是否需要历史清理;无论是否清历史,密钥轮换都是必须步骤。

验证:

git ls-files --error-unmatch .env.local
# 预期:返回非 0表示不再跟踪

git diff --cached -- .env.local
# 预期:只显示从索引移除,不输出真实值到公开报告

High

H-1Vite 依赖存在高危 dev server 任意文件读取/路径遍历类 advisory

证据:

npm audit 显示:

  • packagevite
  • direct dependency
  • installed vulnerable range<=6.4.1
  • severityhigh
  • 相关 advisory 包括:
    • GHSA-p9ff-h696-f583Vite dev server WebSocket 任意文件读取,高危。
    • GHSA-4w7w-66w2-5vf9optimized deps .map 处理路径遍历,中危。
    • 多个 server.fs / public directory 相关低中危问题。
  • fixAvailable=true

影响:

主要影响开发服务器和预览环境。如果开发机、测试机或内网联调环境将 Vite dev server 暴露给不可信网络,攻击者可能读取工作区文件或旁路 server.fs 限制。

建议修复:

  1. 优先将 vite 升级到 npm audit 推荐的安全版本范围。

  2. 升级后执行:

    npm run check:encoding
    npm run lint:eslint
    npm run typecheck
    npm run test
    npm run build
    
  3. 检查 scripts/vite-cli.mjsscripts/dev-web-rust.mjs、Vite 配置中的 dev server host 暴露范围,开发环境避免绑定 0.0.0.0 或暴露到公网。

H-2@typescript-eslint/* 链路经 minimatch 存在 ReDoS 高危 advisory

证据:

npm audit 显示:

  • direct packages
    • @typescript-eslint/eslint-plugin,当前范围 6.16.0 - 7.5.0high。
    • @typescript-eslint/parser,当前范围 6.16.0 - 7.5.0high。
  • transitive packages
    • @typescript-eslint/type-utils
    • @typescript-eslint/typescript-estree
    • @typescript-eslint/utils
    • minimatch
  • minimatch advisory
    • GHSA-3ppc-4f35-3m26
    • GHSA-7r86-cg39-jmmj
    • GHSA-23c5-xmqv-rm74
  • npm 建议升级到 @typescript-eslint/* 8.59.3,属于 SemVer major。

影响:

主要影响 lint/构建工具链。如果 CI 或开发命令处理不可信 glob pattern可能造成 ReDoS。生产运行时直接影响较低但 CI 可用性和供应链安全仍应修复。

建议修复:

  1. 单独开依赖升级分支,将 @typescript-eslint/eslint-plugin@typescript-eslint/parser 升级到兼容 ESLint 8/TypeScript 5.8 的安全版本。

  2. 因为是 major 升级,先阅读迁移说明并运行 ESLint 全量检查。

  3. 验证:

    npm run lint:eslint
    npm run typecheck
    npm run test
    

H-3picomatch ReDoS / glob matching 高危 advisory

证据:

npm audit 显示:

  • packagepicomatch
  • severityhigh
  • vulnerable range4.0.0 - 4.0.3
  • advisory
    • GHSA-c2c7-rcm5-vvqjextglob quantifiers ReDoS高危。
    • GHSA-3v7f-55p6-f55pPOSIX character classes method injection中危。
  • fixAvailable=true

影响:

主要影响依赖 picomatch 的构建、测试、文件匹配工具链。生产直接影响取决于是否在服务端运行时用它处理用户输入 glob当前未在扫描摘要中发现明显业务入口直接使用。

建议修复:

通过升级引入它的 direct dependency 来消除,不建议手工改 lockfile。

Medium

M-1esbuild <=0.24.2 dev server 允许任意网站请求并读取响应

证据:

npm audit 显示:

  • packageesbuild
  • severitymoderate
  • advisoryGHSA-67mh-4wv8-2f99
  • vulnerable range<=0.24.2
  • fixAvailable=true

影响:

主要影响开发服务器场景。若本地开发服务暴露到不可信网络,风险上升。

建议修复:

随 Vite / 构建链路升级一并修复,升级后跑前端检查与构建。

M-2postcss <8.5.10 CSS stringify XSS advisory

证据:

npm audit 显示:

  • packagepostcss
  • severitymoderate
  • advisoryGHSA-qx2v-qp2m-jg93
  • vulnerable range<8.5.10
  • fixAvailable=true

影响:

如果系统把不可信 CSS 内容 stringify 后注入页面,可能触发 XSS。当前项目是否存在这类业务入口需人工复核从依赖角度建议升级。

建议修复:

升级 Tailwind/Vite/PostCSS 链路带出的安全版本,并执行前端构建验证。

Low

L-1jsdom 链路低危 advisory

证据:

npm audit 显示:

  • jsdom direct dependencyseverity low。
  • transitivehttp-proxy-agent@tootallnate/once
  • npm 建议升级到 jsdom 29.1.1SemVer major。

影响:

通常影响测试环境。若测试工具处理不可信 URL/代理输入,风险上升。

建议修复:

不要和 Vite/TypeScript ESLint 大升级混在一个提交里。单独升级 jsdom 后运行:

npm run test

Unknown / 未完成项

U-1Rust 依赖漏洞未完成扫描

原因:

本机没有 cargo-audit,本次没有擅自安装用户级 Cargo 工具。

建议:

如确认允许安装:

cargo install cargo-audit --locked
cargo audit --manifest-path server-rs/Cargo.toml

或在 CI/具备工具的环境执行并回填结果。

Informational / 源码热点

I-1JS/TS XSS / 动态执行热点

扫描命中 1 行:

  • src/routing/RouteImageReadyGate.test.ts 中测试代码使用 root.innerHTML

初步判断为测试环境构造 DOM不是生产漏洞。若后续发现生产代码使用 dangerouslySetInnerHTML 或直接 innerHTML = userInput,应升级为 High。

I-2Node 脚本命令执行热点

扫描命中 21 行,主要集中在:

  • scripts/spacetime-migration-common.mjs
  • scripts/run-bash-script.mjs
  • scripts/generate-spacetime-bindings.mjs
  • scripts/dev-web-rust.mjs

初步判断为项目脚本启动 spacetime、bash、Vite 等工具的正常行为。后续人工复核重点:

  • 是否使用固定命令和参数数组,而不是拼接 shell 字符串。
  • 是否把用户输入直接作为命令或 shell 参数。
  • 是否设置 shell: true

I-3Rust unwrap/expect、文件路径、CORS/Auth 热点较多

扫描命中:

  • rust-hotspots.txt1348 行。
  • auth-cors-hotspots.txt1157 行。

这些是热点,不等于漏洞。建议后续按模块分批人工复核:

  1. server-rs/crates/api-server/src/admin.rs
  2. server-rs/crates/api-server/src/app.rs
  3. server-rs/crates/platform-auth/src/**
  4. server-rs/crates/platform-oss/src/**
  5. server-rs/crates/platform-llm/src/**
  6. server-rs/crates/spacetime-client/src/**

重点看:生产 CORS、Cookie 安全属性、token 日志、路径拼接、外部 URL 下载、Data URL 大小限制、OSS 签名边界。

推荐修复顺序

  1. 立即处理 C-1轮换 .env.local 里所有真实密钥,并从 Git 索引移除 .env.local
  2. 升级 vite 相关依赖,优先消除 dev server 任意文件读取/路径遍历 advisory。
  3. 升级 @typescript-eslint/*,消除 minimatch 链路 ReDoS因 major 升级,单独提交。
  4. 升级 postcss / esbuild / picomatch 的来源依赖。
  5. 单独评估 jsdom major 升级。
  6. 用户确认后安装或使用 CI 执行 cargo audit,补齐 Rust 依赖漏洞结论。
  7. auth-cors-hotspots.txtrust-hotspots.txt 做模块级人工审计。

修复后的验证命令

npm run check:encoding
npm run lint:eslint
npm run typecheck
npm run test
npm run build

如修改后端安全、Auth、Cookie、CORS 或 API

cd server-rs && cargo test --workspace
npm run api-server
# 检查 /healthz并执行相关 API/auth smoke

如补齐 Rust audit

cargo audit --manifest-path server-rs/Cargo.toml

备注

  • 本报告没有输出任何真实密钥值。
  • .hermes/plans/assets/security-scan-2026-05-11/secret-grep.txt 可能包含敏感内容,仅用于本地排查;提交前应删除或替换为脱敏报告。
  • 由于 gitleaks 未安装,本次密钥扫描只是 grep 兜底,不等价于完整 secrets audit。