12 KiB
安全漏洞扫描报告 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-rsRust 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
工具版本:
- Node:
v22.22.2 - npm:
10.9.7 - Cargo:
cargo 1.95.0 (f2d3ce0bd 2026-03-21) - Rustc:
rustc 1.95.0 (59807616e 2026-04-14) - ripgrep:
15.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_KEYARK_API_KEYARK_CHARACTER_VIDEO_API_KEYDASHSCOPE_API_KEYVOLCENGINE_ACCESS_KEY_IDVOLCENGINE_SECRET_ACCESS_KEYALIYUN_SMS_ACCESS_KEY_IDALIYUN_SMS_ACCESS_KEY_SECRETGENARRATIVE_LLM_API_KEYALIYUN_OSS_ACCESS_KEY_IDALIYUN_OSS_ACCESS_KEY_SECRETGENARRATIVE_ADMIN_PASSWORD
报告中不记录具体值。
影响:
如果该文件已进入远端仓库或被团队成员拉取,相关外部服务密钥、OSS/SMS/LLM/后台密码均应视为已泄露。即使后续从当前工作树删除,也不能撤销历史泄露风险。
建议修复:
-
立即轮换
.env.local中出现过的所有真实密钥、访问密钥、后台密码和 token。 -
从 Git 跟踪中移除
.env.local,但不要删除本地私有文件:git rm --cached .env.local -
按项目约束,不要在
.gitignore中新增.env.local;如果仓库已有其他机制管理本地私密 env,应遵循既有约定。若没有,应先补一份安全说明文档,而不是提交真实.env.local。 -
将必要的占位示例保留在
.env.example或deploy/env/api-server.env.example,确保示例值不是可用密钥。 -
如该文件已推送到远端历史,评估是否需要历史清理;无论是否清历史,密钥轮换都是必须步骤。
验证:
git ls-files --error-unmatch .env.local
# 预期:返回非 0,表示不再跟踪
git diff --cached -- .env.local
# 预期:只显示从索引移除,不输出真实值到公开报告
High
H-1:Vite 依赖存在高危 dev server 任意文件读取/路径遍历类 advisory
证据:
npm audit 显示:
- package:
vite - direct dependency:是
- installed vulnerable range:
<=6.4.1 - severity:
high - 相关 advisory 包括:
GHSA-p9ff-h696-f583:Vite dev server WebSocket 任意文件读取,高危。GHSA-4w7w-66w2-5vf9:optimized deps.map处理路径遍历,中危。- 多个
server.fs/ public directory 相关低中危问题。
fixAvailable=true。
影响:
主要影响开发服务器和预览环境。如果开发机、测试机或内网联调环境将 Vite dev server 暴露给不可信网络,攻击者可能读取工作区文件或旁路 server.fs 限制。
建议修复:
-
优先将
vite升级到 npm audit 推荐的安全版本范围。 -
升级后执行:
npm run check:encoding npm run lint:eslint npm run typecheck npm run test npm run build -
检查
scripts/vite-cli.mjs、scripts/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.0,high。@typescript-eslint/parser,当前范围6.16.0 - 7.5.0,high。
- transitive packages:
@typescript-eslint/type-utils@typescript-eslint/typescript-estree@typescript-eslint/utilsminimatch
minimatchadvisory:GHSA-3ppc-4f35-3m26GHSA-7r86-cg39-jmmjGHSA-23c5-xmqv-rm74
- npm 建议升级到
@typescript-eslint/* 8.59.3,属于 SemVer major。
影响:
主要影响 lint/构建工具链。如果 CI 或开发命令处理不可信 glob pattern,可能造成 ReDoS。生产运行时直接影响较低,但 CI 可用性和供应链安全仍应修复。
建议修复:
-
单独开依赖升级分支,将
@typescript-eslint/eslint-plugin与@typescript-eslint/parser升级到兼容 ESLint 8/TypeScript 5.8 的安全版本。 -
因为是 major 升级,先阅读迁移说明并运行 ESLint 全量检查。
-
验证:
npm run lint:eslint npm run typecheck npm run test
H-3:picomatch ReDoS / glob matching 高危 advisory
证据:
npm audit 显示:
- package:
picomatch - severity:
high - vulnerable range:
4.0.0 - 4.0.3 - advisory:
GHSA-c2c7-rcm5-vvqj:extglob quantifiers ReDoS,高危。GHSA-3v7f-55p6-f55p:POSIX character classes method injection,中危。
fixAvailable=true。
影响:
主要影响依赖 picomatch 的构建、测试、文件匹配工具链。生产直接影响取决于是否在服务端运行时用它处理用户输入 glob;当前未在扫描摘要中发现明显业务入口直接使用。
建议修复:
通过升级引入它的 direct dependency 来消除,不建议手工改 lockfile。
Medium
M-1:esbuild <=0.24.2 dev server 允许任意网站请求并读取响应
证据:
npm audit 显示:
- package:
esbuild - severity:
moderate - advisory:
GHSA-67mh-4wv8-2f99 - vulnerable range:
<=0.24.2 fixAvailable=true。
影响:
主要影响开发服务器场景。若本地开发服务暴露到不可信网络,风险上升。
建议修复:
随 Vite / 构建链路升级一并修复,升级后跑前端检查与构建。
M-2:postcss <8.5.10 CSS stringify XSS advisory
证据:
npm audit 显示:
- package:
postcss - severity:
moderate - advisory:
GHSA-qx2v-qp2m-jg93 - vulnerable range:
<8.5.10 fixAvailable=true。
影响:
如果系统把不可信 CSS 内容 stringify 后注入页面,可能触发 XSS。当前项目是否存在这类业务入口需人工复核;从依赖角度建议升级。
建议修复:
升级 Tailwind/Vite/PostCSS 链路带出的安全版本,并执行前端构建验证。
Low
L-1:jsdom 链路低危 advisory
证据:
npm audit 显示:
jsdomdirect dependency,severity low。- transitive:
http-proxy-agent、@tootallnate/once。 - npm 建议升级到
jsdom 29.1.1,SemVer major。
影响:
通常影响测试环境。若测试工具处理不可信 URL/代理输入,风险上升。
建议修复:
不要和 Vite/TypeScript ESLint 大升级混在一个提交里。单独升级 jsdom 后运行:
npm run test
Unknown / 未完成项
U-1:Rust 依赖漏洞未完成扫描
原因:
本机没有 cargo-audit,本次没有擅自安装用户级 Cargo 工具。
建议:
如确认允许安装:
cargo install cargo-audit --locked
cargo audit --manifest-path server-rs/Cargo.toml
或在 CI/具备工具的环境执行并回填结果。
Informational / 源码热点
I-1:JS/TS XSS / 动态执行热点
扫描命中 1 行:
src/routing/RouteImageReadyGate.test.ts中测试代码使用root.innerHTML。
初步判断为测试环境构造 DOM,不是生产漏洞。若后续发现生产代码使用 dangerouslySetInnerHTML 或直接 innerHTML = userInput,应升级为 High。
I-2:Node 脚本命令执行热点
扫描命中 21 行,主要集中在:
scripts/spacetime-migration-common.mjsscripts/run-bash-script.mjsscripts/generate-spacetime-bindings.mjsscripts/dev-web-rust.mjs
初步判断为项目脚本启动 spacetime、bash、Vite 等工具的正常行为。后续人工复核重点:
- 是否使用固定命令和参数数组,而不是拼接 shell 字符串。
- 是否把用户输入直接作为命令或 shell 参数。
- 是否设置
shell: true。
I-3:Rust unwrap/expect、文件路径、CORS/Auth 热点较多
扫描命中:
rust-hotspots.txt:1348 行。auth-cors-hotspots.txt:1157 行。
这些是热点,不等于漏洞。建议后续按模块分批人工复核:
server-rs/crates/api-server/src/admin.rsserver-rs/crates/api-server/src/app.rsserver-rs/crates/platform-auth/src/**server-rs/crates/platform-oss/src/**server-rs/crates/platform-llm/src/**server-rs/crates/spacetime-client/src/**
重点看:生产 CORS、Cookie 安全属性、token 日志、路径拼接、外部 URL 下载、Data URL 大小限制、OSS 签名边界。
推荐修复顺序
- 立即处理 C-1:轮换
.env.local里所有真实密钥,并从 Git 索引移除.env.local。 - 升级
vite相关依赖,优先消除 dev server 任意文件读取/路径遍历 advisory。 - 升级
@typescript-eslint/*,消除 minimatch 链路 ReDoS;因 major 升级,单独提交。 - 升级
postcss/esbuild/picomatch的来源依赖。 - 单独评估
jsdommajor 升级。 - 用户确认后安装或使用 CI 执行
cargo audit,补齐 Rust 依赖漏洞结论。 - 对
auth-cors-hotspots.txt和rust-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。