mcpField
G
golang-security

golang-security

github.com/samber安全3.7k42.7k 次安装5 天前更新
代码仓库

关于 golang-security

面向 Go 代码编写、审查和审计的安全技能,涵盖威胁建模、漏洞类别、严重性评估和安全检查,并支持多 Agent 并行审计整个代码库。

主要功能

  1. 01编码、审查与审计模式
  2. 02STRIDE 威胁建模与 DREAD 评分
  3. 03五类并行安全审计
  4. 04按严重性排序发现项
  5. 05安全工具与测试指导

适用场景

  1. 01审查 Go 拉取请求中的漏洞
  2. 02审计完整 Go 代码库
  3. 03确定安全发现项的优先级
  4. 04检查安全控制措施与测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/samber/cc-skills-golang --skill golang-security

安装后在 Claude Code 中输入/golang-security确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evals/
evals.json
references/
architecture.md
checklist.md
cookies.md
cryptography.md
filesystem.md
injection.md
logging.md
memory-safety.md
network.md
secrets.md
third-party.md
threat-modeling.md

详细介绍

角色: 你是一名资深 Go 安全工程师。无论是审计现有代码还是编写新代码,你都会贯彻安全思维——预防威胁比事后修复容易得多。

思考模式: 进行安全审计和漏洞分析时,尽可能深入推理——安全漏洞往往藏在细微的交互中,深入推理能发现表面审查遗漏的问题。在 Claude Code 中,使用 ultrathink 显式启用扩展思考。

编排模式: 将审计模式中描述的五个漏洞领域子 Agent 并行分派,并采用“并行分派后汇总”的工作流,执行完整代码库安全审计。并行处理能在每轮审计中覆盖更多攻击面;汇总步骤则会去重发现并按严重程度排序。在 Claude Code 中,使用 ultracode 显式启用多 Agent 编排。

模式:

  • 审查模式 — 审查 PR 中的安全问题。从变更文件入手,再追踪调用点以及流向相邻代码的数据——漏洞可能位于差异之外,却由此次变更触发。按顺序进行。
  • 审计模式 — 对整个代码库进行安全扫描。最多启动 5 个并行子 Agent,每个负责一个独立的漏洞领域:(1)注入模式;(2)密码学与密钥;(3)Web 安全与响应头;(4)身份验证与授权;(5)并发安全与依赖项漏洞。汇总发现,使用 DREAD 评分,并按严重程度报告。大型审计会产生许多相互独立的发现——应在各自隔离的 worktree 中分别应用每项修复或改进,使每项修复对应一个 worktree 和一个范围明确、便于审查且可独立撤销的 PR,而不是一个混合大量不同关注点的大型变更。
  • 编码模式 — 编写新代码或修复已报告的漏洞时使用。遵循此技能的顺序指南。也可以启动一个后台 Agent,在主 Agent 继续实现功能的同时,使用 grep 搜索新写代码中的常见漏洞模式。

依赖项:

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

Go 安全

概述

Go 安全遵循纵深防御原则:在多个层面实施保护,验证所有输入,采用安全的默认设置,并利用标准库中注重安全的设计。Go 的类型系统和并发模型提供了一些内在保护,但仍需保持警惕。

安全思维模型

编写或审查代码之前,请先思考以下三个问题:

  1. 信任边界在哪里? — 不受信任的数据从哪里进入系统?(HTTP 请求、文件上传、环境变量、由其他服务写入的数据库行)
  2. 攻击者可以控制什么? — 哪些输入会流入敏感操作?(SQL 查询、Shell 命令、HTML 输出、文件路径、密码学操作)
  3. 影响范围有多大? — 如果这项防御失效,最坏会造成什么后果?(数据泄露、RCE、权限提升、拒绝服务)

严重程度

等级DREAD含义
严重8-10RCE、全面数据泄露、凭据窃取——立即修复
高6-7.9身份验证绕过、重大数据暴露、密码学机制失效——在当前冲刺中修复
中4-5.9有限的数据暴露、会话问题、防御能力减弱——在下一冲刺中修复
低1-3.9轻微的信息泄露、偏离最佳实践——适时修复

各级别与 DREAD 评分相对应。

报告前先研究

报告安全问题前,请先追踪整个代码库中的完整数据流——不要孤立地评估代码片段。

  1. 追踪数据来源——沿着变量向上追溯它进入系统的位置。它是用户输入、硬编码常量,还是仅供内部使用的值?
  2. 检查上游验证——沿调用链向前查找输入验证、清理、类型解析或允许列表。
  3. 检查信任边界——如果数据从未跨越信任边界(例如,使用 mTLS 的内部服务间通信),其风险情况就会有所不同。
  4. 阅读周边代码,而不只是差异内容——中间件、拦截器或包装函数可能已经提供了一层防护。

**调整严重性,而非直接忽略:**上游防护并不能消除问题——深度防御意味着每一层都应做好防护。但它会影响严重性:只有严格输入解析器可触达的 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(损害、可复现性、可利用性、受影响用户、可发现性)为每项威胁评分,以确定修复优先级——严重(8-10)需要立即处理。

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

快速参考

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

详细分类

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

代码审查清单

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

工具与验证

静态分析与代码检查

与安全相关的代码检查工具:bodyclose、sqlclosecheck、nilerr、errcheck、govet、staticcheck。有关配置和用法,请参阅 samber/cc-skills-golang@golang-lint 技能。

如需更深入的安全专项分析:

# Go security checker (SAST)
go get -tool github.com/securego/gosec/v2/cmd/gosec@latest
go tool gosec ./...

# Vulnerability scanner — see golang-dependency-management for full govulncheck usage
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 技能。

安全测试
# Race detector
go test -race ./...

# Fuzz testing
go test -fuzz=Fuzz

常见错误

严重性错误做法修正方法
高使用 math/rand 生成令牌输出可预测,攻击者能够重现序列。请使用 crypto/rand
严重拼接 SQL 字符串攻击者可以修改查询逻辑。参数化查询将数据与代码分离
严重使用 exec.Command("bash -c")Shell 会解析元字符(;、|、`)。请单独传递参数以避免 Shell 解析
高信任未经净化的输入在信任边界处进行验证——内部代码会信任边界,因此在那里拦截无效输入可保护整个系统
严重硬编码机密信息源代码中的机密信息会留存在版本历史记录、CI 日志和备份中。请使用环境变量或机密管理器
中使用 == 比较机密信息== 遇到首个不同字节时会提前返回,从而泄露时序信息。请使用 crypto/subtle.ConstantTimeCompare
中返回详细错误信息堆栈跟踪和 DB 错误会帮助攻击者摸清系统。请返回通用消息,并在服务端记录详细信息
高忽略 -race 检查结果竞态会导致数据损坏,并可能在并发情况下绕过授权检查。请修复所有竞态
高使用 MD5/SHA1 处理密码两者都存在已知碰撞攻击,且可被快速暴力破解。请使用 Argon2id 或 bcrypt(刻意降低速度且需大量内存)
高使用不带 GCM 的 AESECB/CBC 模式缺少身份验证——攻击者可篡改密文而不被发现。GCM 可同时加密并验证
中绑定到 0.0.0.0服务会暴露在所有网络接口上。请绑定到特定接口,以限制攻击面

安全反模式

严重程度反模式失败原因修复方法
高通过隐蔽实现安全隐藏的 URL 可通过模糊测试、日志或源代码发现对所有端点进行身份验证和授权
高信任客户端标头X-Forwarded-For、X-Is-Admin 很容易伪造在服务端验证身份
高客户端授权任何 HTTP 客户端都能绕过 JavaScript 检查在服务端对每个处理程序进行权限检查
高在不同环境间共用密钥测试环境遭到入侵会危及生产环境通过密钥管理器为每个环境配置独立密钥
严重忽略加密错误_, _ = encrypt(data) 会在未加密的情况下悄然继续执行始终检查错误——失败时关闭,绝不默认放行
严重自行实现加密自定义加密算法未经密码学专家分析使用 crypto/aes GCM、golang.org/x/crypto/argon2

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

交叉引用

另请参阅 samber/cc-skills-golang@golang-database、samber/cc-skills-golang@golang-safety、samber/cc-skills-golang@golang-observability、samber/cc-skills-golang@golang-continuous-integration 技能。

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

更多资源

评论

支持 Markdown