Skip to content

[安全] 日志敏感数据审计(hub+edge 秘密本体泄漏面) #2120

Description

@DeliciousBuding

基线

  • master 4b3f236(2026-08-30);hub-server + edge-server 全部结构化日志打点(slog)
  • 执行者:captain 主线收口(三次 lane 会话未完成合成,由主线以定向 grep 实证完成;lane 扫描记录存 lanes/lane-e2-log-secrets-audit/)
  • 与 secret-guard(scripts/verify/check-secrets.sh)区别:secret-guard 拦代码字面量,本审计针对运行时日志

高风险模式核查结果(定向 grep 实证)

模式 结果
slog 字段名含 token/secret/password/api_key/authorization 且值为秘密本体 零命中
出站请求日志带 Authorization 头/API key 零命中
env 值(非键名)进日志 零命中(main.go:120 .env 加载失败只打 key 名)
OIDC state/code 打点 state 已截断前 8 字符(oidc.go:152/258),合规

发现清单(按严重度)

🟡 P2:Edge dispatch 非成功响应原文进日志

  • hub-server/internal/service/dispatchsvc/agent_dispatch_edge_http.go:108slog.Warn(plan.LogMessage, ..., "body", string(respBody))
  • 值来源:Edge HTTP 响应体(已受 EdgeHTTPResponseBodyLimit LimitReader 截断——有界但未脱敏
  • 风险:Edge 错误响应可能含任务上下文/错误详情,截断不等于脱敏;非成功路径才触发,频率低
  • 建议:只记 body 长度+前 N 字节摘要,或过统一 mask 助手

ℹ️ 系统性观察:无全局脱敏层

  • hub/edge 均用裸 slog.NewJSONHandler/NewTextHandler(edge main.go:146-150),无 masking handler
  • 当前靠开发者自觉(已有多处好样例:oidc state 截断、[安全/边缘] Edge 安全机制覆盖面盘点(宏观§6 资产核查) #2098 env 告警只打键名、cache 日志只打键名)
  • 建议:引入轻量 mask 助手(对 token/secret/authorization 字段值统一 ***),新打点走约定;不急于全局改造

未覆盖(留后续)

  • 消息/事件 payload 全量打点逐 handler 穷举(本轮按模式 grep 覆盖,非逐行穷举)
  • 前端/桌面客户端日志面(不在本审计范围)
  • gin 请求日志中间件若未来启用 body 记录,需重审

修复切片建议(≤3)

  1. dispatch 非成功响应 body 改摘要式日志(1 行改动+测试)
  2. 引入 slog mask 助手 + 字段命名约定(token/secret 类字段强制过 mask)
  3. 在 AGENTS.md/开发规范固化「日志只打标识符不打本体」纪律(引用本 issue)

Refs #2098(edge env 告警纪律前置)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High prioritysize-MMedium effort后端Hub Server、Edge-Hub 通信和后端服务

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions