Claim P0 hotfixes waves, correct schema snapshot to 57, and park non-P0 findings in long-term backlog. Co-authored-by: Cursor <cursoragent@cursor.com>
4.5 KiB
4.5 KiB
title, status, created, updated, severity
| title | status | created | updated | severity |
|---|---|---|---|---|
| 2026-09-20 系统全量体检审计 | done | 2026-09-20 | 2026-09-20 | high |
2026-09-20 系统全量体检审计
现象
在 production_ready=yes、dev/test/main 健康、近期 triage 已合入的前提下,对全系统做只读深度体检,发现若干未写入 gap-matrix 的 critical/high,以及一批 medium/low 加固项。
方法:四路并行深潜(后端 Go、安全鉴权、前端 web、基础设施)+ 本机实证(goose 版本表、容器 health、口令登录、代码交叉复核)。
根因分析(P0 / critical,均已实证)
| ID | 发现 | 位置 | 证据 |
|---|---|---|---|
| P0-MIG | 迁移序号空洞 00054;chat_summaries 建表与 summarizer 写失败修复滞留未合入分支 |
feature/capability-enablement-impact-plan@848a0457;dev 代码仍读写不存在表 |
goose_db_version 53→55→57 跳号;to_regclass('chat_summaries') 空;summarizer.go:119 _ = err |
| P0-IDOR-PREF | 偏好写入信任请求体 user_id,无归属校验 |
internal/server/handlers.go:508-537 |
无 requireAuthenticatedUser 比对 |
| P0-IDOR-SESS | handleGetProject 以 callerUserID=0 调会话,归属校验被跳过 |
server.go:458-463;handlers.go / project_handlers.go |
if callerUserID > 0 守卫 |
| P0-IDOR-RECAT | 重分类无会话归属;空 session_id 触及全库消息 |
chat_recategorize_api.go;ctxmgr/recategorize.go |
WHERE ($1 = '' OR session_id = $1) |
| P0-PANIC | taskrun 订阅发送在锁外,Unsubscribe close 后向 closed channel 发送 panic |
taskrun/manager.go:481-497 vs :590 |
select default 不挡 closed;全仓非测试 recover()=0 |
| P0-RACE | 同步 POST /chat 不取 execMu,与 SSE 并发 data race |
handlers.go:240 vs sse.go:341 |
09-19 C2 残留半修 |
| P0-CRED-BACKUP | 三环境 DB 口令硬编码进仓库;生产口令与脚本一致可登录 | scripts/backup-system-db.sh:43-56 |
实测 prod_highly_secure_db_pass 可连 main |
| P0-CRED-PUSH | push 脚本把 token 拼进 URL,ps 可见 |
scripts/git-push-dev.sh:23 |
https://oauth2:${TOKEN}@... |
| P0-XSS | 块编辑器 math 错误分支未转义 | BlockEditorModal.tsx:206;MathBlockView.tsx:20 |
catch 裸拼 + dangerouslySetInnerHTML |
环境与分支脱节(本轮不做晋升,记 backlog)
| ID | 发现 | 证据 |
|---|---|---|
| ENV-MAIN-DRIFT | main 分支 goose 最高 00025,main 库 schema 52;灾备从分支重建不可复现 | git ls-tree main;goose_db_version MAX=52 |
| ENV-TEST-DRIFT | test 分支最高 00056,test 库已 57 | 实测 |
| DOC-SCHEMA | CURRENT 写 dev schema 56,实测 57 | health JSON |
| GOOSE-DUP56 | dev 库 version_id=56 记账两行(id 57/58,间隔 2ms) | SQL 取证 |
严重度
- critical / P0:上表 P0-*(本轮整改)
- high / medium / low:见下方「非 P0 清单」与 long-term 2026-09-20 增补区
关联整改
- Remediation: ../remediation/2026-09-20-p0-remediation-plan.md
- Short-term: ../ops/short-term/2026-09-20-p0-hotfixes.md
证据
go vet ./...零告警(2026-09-20)go test -short ./...:仅TestPiAgentDockerBuildContext_RunnerModulesPresent因外网镜像源 EOF 失败,属测试卫生- 三环境 health:dev/test schema 57,main 52;events
:8088/:8089/:8090ok - 四路深潜交叉:IDOR×3、XSS、凭证、迁移空洞均被 ≥2 条路径或本机取证命中
非 P0 清单(摘要,详 long-term)
后端:XFF 限流可绕过;events cancelFns 只增不减;docrevision/docgov 全局锁内 DB I/O;Shutdown 5s vs 长任务;idemLocks 无界;SSE query 传消息;C1 缓存不失效;chat 落库非原子等。
前端:useChatWindow 切会话竞态;PLAN_CONFIRM 无 try/catch;turn Map 只增不减;重置密码死功能;ErrorBoundary 仅顶层;SSE \r\n;token localStorage + 无全局 401 登出等。
基础设施:容器 root、无资源限制;健康检查路径不一致;main events 挂 shared-net;init 三套;Dockerfile Go 1.23 基镜像;backup 无定时;main 分支对齐晋升专项。
开放问题
- capability 分支合入后 00054 重编号为 00058 是否与其他未合并旁支再撞号?(当前仅该分支占用 54)
- main 分支对齐晋升时 00057 会对存量项目做不可逆改名——晋升前需预演清单