From vuln-skills
Audits Go code for information disclosure in logging, errors, HTTP responses, Kubernetes Secrets, and credentials. Detects leaks via %+v, json tags, stack traces; suggests fixes like json:"-".
npx claudepluginhub yhy0/ghsa-skill-builder --plugin vuln-skillsThis skill uses the workspace's default tool permissions.
当审计 Go 代码中涉及日志记录、错误处理、API 响应、K8s Secret 管理、凭证存储时加载此 Skill。
Detects credentials/secrets leaking to logs/outputs via naming patterns, env vars, and data flows in Go, Python, Java, JS/TS codebases. Use for credential leakage or secret logging issues.
Guides penetration testing for information disclosure vulnerabilities: credential leaks, API key exposures, directory listings, error messages, Git repos, and cloud credentials in web apps.
Audits Go apps for security: input validation, SQL injection prevention, authentication/authorization, secrets management, TLS, OWASP Top 10, secure coding patterns. Use for vulnerability checks, hardening services, auth reviews.
Share bugs, ideas, or general feedback.
当审计 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 个真实案例,需要时加载)。