安全收尾:F01/F02/F08 导出清理边界、孤儿回收、撤权与任务恢复 #1

Open
jianwel wants to merge 5 commits from fix/security-f01-f02-f08 into main
Owner

对应 docs/remaining-issues-2026-09-26.html 第三节的 3 项修复,逐 commit 独立可回溯:

  • F01 (P0) 路径完整 lstat 校验通过前不登记清理目标;失败清理经 O_NOFOLLOW 目录描述符执行,父目录为符号链接时拒绝删除(受保护文件字节不变)
  • F02 清理受阻记录含任务编号的 WARNING 并保留 job.path;cleanup 命令新增孤儿 .xlsx 24h 保留期回收
  • F08 worker 执行前重核验角色/账号状态;导出状态与下载接口补齐角色白名单;卡死 processing 任务超时重认领

测试:tests/test_formula_export_reliability.py、test_formula_cleanup.py、test_worker_paths.py 新增回归用例;全量后端 87 passed、覆盖率 88.50%、E2E 3 passed(详见 docs/fix-record-2026-09-26.md)

对应 docs/remaining-issues-2026-09-26.html 第三节的 3 项修复,逐 commit 独立可回溯: - **F01 (P0)** 路径完整 lstat 校验通过前不登记清理目标;失败清理经 O_NOFOLLOW 目录描述符执行,父目录为符号链接时拒绝删除(受保护文件字节不变) - **F02** 清理受阻记录含任务编号的 WARNING 并保留 job.path;cleanup 命令新增孤儿 .xlsx 24h 保留期回收 - **F08** worker 执行前重核验角色/账号状态;导出状态与下载接口补齐角色白名单;卡死 processing 任务超时重认领 测试:tests/test_formula_export_reliability.py、test_formula_cleanup.py、test_worker_paths.py 新增回归用例;全量后端 87 passed、覆盖率 88.50%、E2E 3 passed(详见 docs/fix-record-2026-09-26.md)
jianwel added 3 commits 2026-09-25 23:26:09 +00:00
- 根目录/用户目录/目标文件先通过 lstat 完整校验(拒绝符号链接与非目录),
  校验失败时不删除任何磁盘文件(此前父目录为链接时会沿链接 unlink 同名文件)
- 失败清理只处理本次登记的受控文件,并通过 O_NOFOLLOW 目录描述符删除;
  目录被换成符号链接时拒绝删除,保留任务编号与路径的对应关系
- 测试覆盖:用户目录链接、目标链接、运行中目录被换成链接(受保护文件字节不变)、
  失败后正常重试成功
- process_formula_export 失败清理受阻时记录不含敏感数据的 WARNING(任务编号+文件名),
  并保留 job.path 使残留文件仍可追踪,而不是清空后失联
- cleanup_formula_exports 新增孤儿 .xlsx 回收:超过 24h 保留期且不属于任何
  未过期成功任务的文件统一回收(覆盖失败任务残留、任务行被级联删除两种来源),
  不触碰仍处于活动任务的文件
- 测试:注入 unlink 权限错误→任务失败状态仍保存+告警可见;恢复权限后回收成功
  且其他任务文件不受影响;失败任务残留/任务行已删/未过期成功/近期文件/非 UUID 命名
fix(worker): F08 执行/下载统一核验角色与账号状态,恢复卡死的 processing 任务
Verify / verify (pull_request) Failing after 25s
Verify / verify (push) Failing after 1s
5ebe83afbb
- worker 执行前重新核验账号 is_active 与 admin/analyst 角色:撤权/停用后排队任务
  直接失败,不发布敏感工作簿
- formula-exports 状态与下载接口补齐与创建接口一致的角色白名单,被降为 viewer
  的账号不能再查询/下载旧导出
- import_worker 对超过 15 分钟仍处于 processing 的任务重新认领(PostgreSQL 依赖
  咨询锁立即恢复),崩溃重启不再无限停留 processing;新近 processing 不被抢占
- 测试:撤权/停用执行、viewer 下载与状态 403、半成品/缺文件下载 409/410、
  超时任务恢复且无重复临时文件、新近 processing 不被重复认领
jianwel added 1 commit 2026-09-26 08:20:35 +00:00
test(worker): 适配 PostgreSQL 咨询锁下的立即重认领语义
Verify / verify (push) Failing after 1s
Verify / verify (pull_request) Failing after 1s
05168f671e
PG 上 worker 持咨询锁会立即重认领 processing 任务,第二次 --once 被导入任务
抢占导致导出断言失败(该测试此前从未在 PG 上真正运行过)。第一次调用后把导入
任务置为 ready 模拟完成,两种后端行为一致
jianwel added 1 commit 2026-09-26 09:02:05 +00:00
merge: 同步 main 的 CI 基建(.gitea/workflows 迁移、PG 咨询锁测试适配、artifact 容忍、audit 重试)
Verify / verify (pull_request) Failing after 1s
AI Review / review (pull_request) Successful in 12s
Verify / verify (push) Failing after 34s
3d3f7e2434
Some required checks failed
Verify / verify (pull_request) Failing after 1s
AI Review / review (pull_request) Successful in 12s
Verify / verify (push) Failing after 34s
You are not authorized to merge this pull request.
This pull request can be merged automatically.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/security-f01-f02-f08:fix/security-f01-f02-f08
git checkout fix/security-f01-f02-f08
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: jianwel/fa-agent#1