golang-security

golang-security

热门

Golang 安全最佳实践与漏洞防护。涵盖注入(SQL、命令、XSS)、密码学、文件系统安全、网络安全、Cookie、密钥管理、内存安全与日志记录。适用于编写、审查或审计 Go 代码的安全性,或处理涉及密码学、I/O、密钥管理、用户输入处理或身份验证的高风险代码。包含安全工具的配置。

2261Star
150Fork
更新于 2026/6/6
SKILL.md
只读
名称
golang-security
描述

Golang 安全最佳实践与漏洞防护。涵盖注入(SQL、命令、XSS)、密码学、文件系统安全、网络安全、Cookie、密钥管理、内存安全与日志记录。适用于编写、审查或审计 Go 代码的安全性,或处理涉及密码学、I/O、密钥管理、用户输入处理或身份验证的高风险代码。包含安全工具的配置。

角色: 你是一名资深 Go 安全工程师。在审计现有代码和编写新代码时都要运用安全思维——威胁预防比修复更容易。

思考模式: 在安全审计和漏洞分析时使用 ultrathink。安全漏洞隐藏在微妙的交互中——深度推理能捕捉到表面审查遗漏的问题。

模式:

  • 审查模式 — 审查 PR 中的安全问题。从变更文件开始,然后追踪调用点和数据流到相邻代码——漏洞可能存在于 diff 之外但由 diff 触发。顺序执行。
  • 审计模式 — 全代码库安全扫描。通过 Agent 工具启动最多 5 个并行子代理,每个覆盖独立的漏洞领域:(1) 注入模式,(2) 密码学与密钥,(3) Web 安全与头部,(4) 身份验证与授权,(5) 并发安全与依赖漏洞。汇总结果,使用 DREAD 评分,按严重性报告。
  • 编码模式 — 在编写新代码或修复已报告漏洞时使用。遵循技能的逐步指导。可选择在后台启动一个代理,在新编写的代码中 grep 常见漏洞模式,同时主代理继续实现功能。

依赖:

  • govulncheck: go install golang.org/x/vuln/cmd/govulncheck@latest

Go 安全

概述

Go 中的安全遵循纵深防御原则:在多层进行保护,验证所有输入,使用安全默认值,并利用标准库的安全意识设计。Go 的类型系统和并发模型提供了一些固有保护,但仍需保持警惕。

安全思维模型

在编写或审查代码之前,问三个问题:

  1. 信任边界在哪里? — 不受信任的数据从哪里进入系统?(HTTP 请求、文件上传、环境变量、其他服务写入的数据库行)
  2. 攻击者能控制什么? — 哪些输入流入敏感操作?(SQL 查询、shell 命令、HTML 输出、文件路径、密码学操作)
  3. 爆炸半径有多大? — 如果防御失败,最坏的结果是什么?(数据泄露、RCE、权限提升、拒绝服务)

严重性级别

级别 DREAD 含义
严重 8-10 RCE、完全数据泄露、凭据窃取——立即修复
6-7.9 认证绕过、重大数据暴露、加密失效——在当前迭代中修复
4-5.9 有限暴露、会话问题、防御削弱——在下一迭代中修复
1-3.9 轻微信息泄露、最佳实践偏离——伺机修复

级别与 DREAD 评分 对齐。

报告前的研究

在标记安全问题之前,追踪整个代码库中的数据流——不要孤立地评估代码片段。

  1. 追踪数据来源 — 沿着变量回溯到它进入系统的位置。是用户输入、硬编码常量还是仅内部使用的值?
  2. 检查上游验证 — 查找调用链中更早的输入验证、清理、类型解析或白名单。
  3. 检查信任边界 — 如果数据从未跨越信任边界(例如,使用 mTLS 的内部服务间通信),风险状况不同。
  4. 阅读周围代码,而不仅仅是 diff — 中间件、拦截器或包装函数可能已经提供了一层防御。

严重性调整,而非忽略: 上游保护并不能消除发现——纵深防御意味着每一层都应自我保护。但它会改变严重性:仅通过严格输入解析器可达的 SQL 拼接是中危,而非严重。始终报告发现并调整严重性,注明存在哪些上游防御以及如果它们被移除或绕过会发生什么。

当降级或跳过发现时: 添加简短的内联注释(例如 // security: SQL concat safe here — input is validated by parseUserID() which returns int),以便决策被记录、可审查,并且不会被未来的审计重新标记。

威胁建模 (STRIDE)

对系统中的每个信任边界跨越和数据流应用 STRIDE:Spoofing(身份伪造)、Tampering(篡改)、Repudiation(抵赖)、Information Disclosure(信息泄露)、Denial of Service(拒绝服务)、Elevation of Privilege(权限提升)。使用 DREAD(Damage 损害、Reproducibility 可重现性、Exploitability 可利用性、Affected users 受影响用户、Discoverability 可发现性)对每个威胁进行评分以确定修复优先级——严重(8-10)需要立即行动。

有关完整方法论(含 Go 示例、DFD 信任边界、DREAD 评分和 OWASP Top 10 映射),请参阅 威胁建模指南

快速参考

严重性 漏洞 防御 标准库解决方案
严重 SQL 注入 参数化查询将数据与代码分离 database/sql 使用 ? 占位符
严重 命令注入 单独传递参数,绝不通过 shell 拼接 exec.Command 使用独立参数
XSS 自动转义将用户数据渲染为文本而非 HTML/JS html/templatetext/template
路径遍历 将不受信任的文件访问限定在允许的根目录内 Go 1.24+:使用 os.Root。Go 1.24 之前:使用 filepath.IsLocal + filepath.Rel + 分隔符感知检查;绝不单独依赖 filepath.Clean + strings.HasPrefix
时序攻击 常量时间比较避免逐字节泄露 crypto/subtle.ConstantTimeCompare
密码学问题 使用经过验证的算法;绝不自行实现 crypto/aescrypto/rand
HTTP 安全 TLS + 安全头部防止降级攻击 net/http,配置 TLSConfig
缺少头部 HSTS、CSP、X-Frame-Options 防止浏览器攻击 安全头部中间件
速率限制 速率限制防止暴力破解和资源耗尽 golang.org/x/time/rate,服务器超时
竞态条件 保护共享状态以防止数据损坏 sync.Mutex、通道、避免共享状态

详细分类

有关完整示例、代码片段和 CWE 映射,请参阅:

代码审查清单

有关按领域(输入处理、数据库、密码学、Web、认证、错误、依赖、并发)组织的完整安全审查清单,请参阅 安全审查清单 ——一份涵盖所有主要漏洞类别的全面代码审查清单。

工具与验证

静态分析与 Lint

安全相关的 linter:bodyclosesqlclosechecknilerrerrcheckgovetstaticcheck。有关配置和使用,请参阅 samber/cc-skills-golang@golang-lint 技能。

对于更深层次的安全特定分析:

# Go 安全检查器 (SAST)
go get -tool github.com/securego/gosec/v2/cmd/gosec@latest
go tool gosec ./...

# 漏洞扫描器——有关完整的 govulncheck 用法,请参阅 golang-dependency-management
go get -tool golang.org/x/vuln/cmd/govulncheck@latest
go tool govulncheck ./...

要检查特定模块或版本的已知 CVE 而无需扫描整个树(例如,在 pkg.go.dev 上审查依赖时),→ 请参阅 samber/cc-skills-golang@golang-pkg-go-dev 技能。

安全测试

# 竞态检测器
go test -race ./...

# 模糊测试
go test -fuzz=Fuzz

常见错误

严重性 错误 修复
使用 math/rand 生成令牌 输出可预测——攻击者可以重现序列。使用 crypto/rand
严重 SQL 字符串拼接 攻击者可以修改查询逻辑。参数化查询保持数据和代码分离
严重 exec.Command("bash -c") Shell 解释元字符(;|`)。单独传递参数以避免 shell 解析
信任未清理的输入 在信任边界进行验证——内部代码信任边界,因此在那里捕获不良输入可以保护一切
严重 硬编码密钥 源代码中的密钥最终会出现在版本历史、CI 日志和备份中。使用环境变量或密钥管理器
使用 == 比较密钥 == 在第一个不同字节处短路,泄露时序信息。使用 crypto/subtle.ConstantTimeCompare
返回详细错误 堆栈跟踪和数据库错误帮助攻击者映射你的系统。返回通用消息,在服务器端记录详细信息
忽略 -race 发现 竞态导致数据损坏,并可能在并发下绕过授权检查。修复所有竞态
使用 MD5/SHA1 处理密码 两者都有已知的碰撞攻击,且暴力破解速度快。使用 Argon2id 或 bcrypt(故意慢速、内存硬)
使用不带 GCM 的 AES ECB/CBC 模式缺乏认证——攻击者可以未被检测地修改密文。GCM 提供加密+认证
绑定到 0.0.0.0 将服务暴露给所有网络接口。绑定到特定接口以限制攻击面

安全反模式

严重性 反模式 失败原因 修复
通过隐藏实现安全 隐藏的 URL 可通过模糊测试、日志或源代码发现 对所有端点进行身份验证 + 授权
信任客户端头部 X-Forwarded-ForX-Is-Admin 可轻易伪造 服务器端身份验证
客户端授权 JavaScript 检查可被任何 HTTP 客户端绕过 每个处理程序上的服务器端权限检查
跨环境共享密钥 预发布环境泄露会危及生产环境 通过密钥管理器使用每个环境的密钥
严重 忽略密码学错误 _, _ = encrypt(data) 静默地以未加密方式继续 始终检查错误——失败时关闭,绝不开放
严重 自行实现密码学 自定义加密未经密码学家分析 使用 crypto/aes GCM、golang.org/x/crypto/argon2

有关带 Go 代码示例的详细反模式,请参阅 安全架构

交叉引用

请参阅 samber/cc-skills-golang@golang-databasesamber/cc-skills-golang@golang-safetysamber/cc-skills-golang@golang-observabilitysamber/cc-skills-golang@golang-continuous-integration 技能。

  • → 请参阅 samber/cc-skills-golang@golang-continuous-integration 技能,了解在 CI 中使用这些指南进行自动化 AI 驱动代码审查。

其他资源