审计 Go 代码时使用,涉及日志、错误处理、HTTP 响应、Kubernetes Secret 及凭证存储。覆盖 CWE-200/532/522/...
信息披露脆弱性模式(CWE-200/532/312/552) +++++++++++++++++++++++++++++++++++++++++++++++++是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
当审计 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 个真实案例,需要时加载)。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.3万人学习
共49课时 | 82.7万人学习
最新文章