Skip to content

chore(security): redact absolute paths in error responses and publish SHA256SUMS - #512

Merged
liujuanjuan1984 merged 2 commits into
mainfrom
chore/error-redaction-release-checksums-511
Aug 22, 2026
Merged

chore(security): redact absolute paths in error responses and publish SHA256SUMS#512
liujuanjuan1984 merged 2 commits into
mainfrom
chore/error-redaction-release-checksums-511

Conversation

@liujuanjuan1984

@liujuanjuan1984 liujuanjuan1984 commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

背景

对齐 codex-a2a #346(残余低风险加固)实施。opencode-a2a 安全审计 #499 已收口,但其拆解范围未包含错误响应路径脱敏与发布物校验清单;对照 codex-a2a #346 的修复清单(codex-a2a PR #353)逐一核查后确认同类风险仍存在(见 #511)。

变更内容

  • 新增 opencode_a2a.redact 确定性脱敏工具:POSIX/Windows/UNC 绝对路径与 file:// 本地 URI 替换为 <redacted-path> 占位符;远程 URL、相对路径、普通文本与 API 路由 token(/message:send/tasks/{id}:cancel)保持不变;幂等;redact_paths_in_value 递归覆盖 dict/list/tuple/str。
  • 错误出口统一接入:
    • execution/executor.py:_emit_error(SSE 与 task 错误消息/artifact)
    • jsonrpc/error_responses.py:adapt_jsonrpc_error(message、metadata 值、标准 JSON-RPC 错误码 data)
    • jsonrpc/error_responses.py:build_http_error_body(REST 错误体)
    • jsonrpc/application.py:_generate_error_response(新增覆写,覆盖 SDK 基类对裸异常/标准错误码的原样透出)
  • 发布完整性:.github/workflows/publish.yml 在上传前生成 dist/SHA256SUMS(sha256sum 格式、按文件名排序、确定性),并作为 release asset 上传;已存在时幂等跳过。
  • docs/security-architecture.md:新增 Security Controls 章节(错误文本脱敏策略与边界、发布完整性),并更新维护规则;登记 [chore] 残余低风险加固:错误响应路径脱敏与发布物完整性校验 #511 中记录的补充观察(upstream 远端 detail 文本属远端内容信任面,另行评估,不在本 PR 范围)。
  • 独立审查修复:jsonrpc/application.py 新增 _build_error_payload 统一序列化适配后的错误(_generate_protocol_error_response 复用)。修复存量缺陷——opencode 自有 JSONRPCErrorerror_response 回调进入 SDK 基类时会被 str() 包装成 -32603 垃圾消息;现在保持结构化 code/message/data 并完成脱敏。
  • 测试:脱敏单元测试(含 API 路由 token 保持用例)、executor/jsonrpc 边界测试、REST 契约回归(/message:send 元数据不被误脱敏)、JSON-RPC 错误序列化回归(session_not_found_error/upstream_payload_error 结构化透出且脱敏)。

对照核查结论(详见 #511

  • 存在并已修复:_emit_erroradapt_jsonrpc_error(message/metadata/标准码 data)、build_http_error_body、裸异常兜底、handler detail=str(exc)、发布物无校验清单。
  • 不存在(无需改动):工具错误映射 tool_error_mapping.py 已返回稳定错误串;本地 exec/subprocess runtime(不适用)。
  • 补充观察(已登记,不在本 PR 实施):upstream_error_translator 将远端响应文本拼入客户端消息,属远端内容信任面,建议单独评估。

验证

  • ./scripts/doctor.sh 全部通过(pre-commit、mypy、811 passed、覆盖率 93.23%、构建与 wheel smoke)。
  • publish.yml YAML 语法校验通过;shellcheck 通过。
  • 对照修复后 REST 契约测试(test_rest_message_parsing_helpers_cover_upgrade_pathstest_dual_stack_send_rejects_cross_transport_payload_shapes)保持绿。

相关提交

验收标准对照

  • 错误响应文本统一脱敏(绝对路径替换为占位符),覆盖 executor _emit_erroradapt_jsonrpc_error(message/metadata/标准错误码 data)、build_http_error_body、裸异常兜底分支
  • 发布物附 SHA256SUMS(publish.yml 生成并上传)
  • docs/security-architecture.md 记录错误脱敏与发布完整性策略及边界

关联 issue

@liujuanjuan1984

Copy link
Copy Markdown
Collaborator Author

独立代码审查完成,发现并收敛 2 处问题(提交 c49c462):

  1. 脱敏规则误伤 API 路由 token:/message:send/tasks/{id}:cancel 被当作本机路径脱敏,破坏 REST 错误契约(两处现有契约测试失败)。已收紧 POSIX 路径前瞻(后随 ://{/word 时不匹配),并补充保持用例。
  2. 存量序列化缺陷:opencode 自有 JSONRPCErrorerror_response 进入 SDK 基类被 str() 包装成 -32603 垃圾消息(session_not_found/upstream payload 错误均受影响)。本次覆写改为直接序列化适配结果(_build_error_payload),结构保持并完成脱敏。
    修复后 ./scripts/doctor.sh 全绿(814 passed,覆盖率 93%+)。

@liujuanjuan1984
liujuanjuan1984 marked this pull request as ready for review August 22, 2026 16:06
@liujuanjuan1984
liujuanjuan1984 merged commit 4a4c062 into main Aug 22, 2026
3 checks passed
@liujuanjuan1984
liujuanjuan1984 deleted the chore/error-redaction-release-checksums-511 branch August 22, 2026 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[chore] 残余低风险加固:错误响应路径脱敏与发布物完整性校验

1 participant