Install
openclaw skills install go-vuln-info-disclosureUse when auditing Go code involving logging, error handling, HTTP response data, Kubernetes Secret management, or credential storage. Covers CWE-200/532/522/312/552. Keywords: information disclosure, credential leak, log exposure, Kubernetes Secret, json tag, struct formatting, error message, stack trace, Rancher, Argo CD, sensitive data
openclaw skills install go-vuln-info-disclosure当审计 Go 代码中涉及日志记录、错误处理、API 响应、K8s Secret 管理、凭证存储时加载此 Skill。
Sources(敏感数据来源):
v1.Secret.Data)database/sql 连接字符串)os.Getenv("API_KEY"))https://user:token@github.com)Sinks(泄露出口):
log.Printf("%+v", configStruct) -- %+v 格式化输出所有字段包括密钥logrus.WithFields(logrus.Fields{...}).Error() -- 结构化日志中包含敏感字段zap.Any("config", struct) -- zap 日志序列化完整结构体json.Marshal(objectWithSecrets)).status / .spec 字段fmt.Errorf("failed to connect: %v", err))中的连接字符串runtime.Stack() 输出包含参数值Sanitization(数据保护措施):
json:"-" -- JSON 序列化时忽略字段String() / MarshalJSON() 方法 -- 自定义序列化隐藏敏感字段stringData -> base64 data 转换fmt.Errorf("connection failed: %w", ErrGeneric))-- 隐藏内部细节检测路径:
# 格式化输出 struct
grep -rn '%+v\|%#v' --include="*.go"
# 日志中可能的敏感信息
grep -rn 'log\.Print\|logrus\.\|zap\.\|logger\.' --include="*.go" | grep -i 'secret\|password\|token\|credential\|key'
# JSON 序列化 — 检查是否有 json:"-" tag
grep -rn 'json:"-"' --include="*.go"
# K8s Secret 操作
grep -rn 'v1.Secret\|corev1.Secret\|StringData\|\.Data\[' --include="*.go"
# 错误信息中的敏感信息
grep -rn 'fmt.Errorf\|errors.New\|errors.Wrap' --include="*.go"
# Git URL with credentials
grep -rn 'https://.*:.*@\|git.*token\|git.*password' --include="*.go"
# API 响应
grep -rn 'json.Marshal\|json.NewEncoder.*Encode' --include="*.go"
json:"-" tag?%+v 格式化审计 (CWE-532):fmt.Sprintf("%+v", struct) 或 log.Printf("%+v", struct) 是否会输出包含密码/token 的 struct 字段?%+v 会打印所有字段名和值。.spec 或 .status 字段中?CRD status subresource 的 RBAC 通常比 Secret 宽松,任何有 CRD read 权限的用户都能读取 status 中的凭证。修复方式:凭证应存储在 K8s Secret 对象中,CRD status 仅引用 Secret 的名称(如 secretRef: my-backup-credentials)。Rancher 的 cluster template answers 曾直接存储 cloud credential。password、token、secret 等字段?是否使用独立的 response DTO 而非直接 Marshal 内部对象?https://user:token@host 格式的认证信息?该 URL 是否出现在日志或错误信息中?runtime.Stack() 输出或内部文件路径?Go 的 panic recovery 中间件是否向客户端暴露了堆栈?json:"-" 缺失审计 (CWE-200):包含敏感字段(Password, Token, SecretKey)的 struct 是否为敏感字段添加了 json:"-" tag?未标记的字段在 json.Marshal 时会被包含。以下模式不是此类漏洞:
json:"-" 用于内部 RPC struct -- 仅在服务内部使用的 struct 不需要隐藏字段"failed to create user" 不包含敏感数据_test.go 中使用假密钥以下模式需要深入检查:
json.Marshal(clusterObject) -- 集群对象是否包含 kubeconfig 或 bearer token 字段?logrus.WithError(err).Error("operation failed") -- err 中是否包含连接字符串或凭证?status subresource -- status 通常有较宽松的 RBAC,其中的敏感数据更容易被低权限用户读取answers 字段 -- cluster template 的 answers 可能包含 cloud provider credentials详见 references/cases.md(7 个真实案例,需要时加载)。