跳转到正文
报告库
用途分类 / 开发辅助

Golang Grpc Skill 安全审计

作者说它能做什么(原文)

Provides gRPC usage guidelines, protobuf organization, and production-ready patterns for Golang microservices. Use when implementing, reviewing, or debugging gRPC servers/clients, writing proto files, setting up interceptors, handling gRPC errors with status codes, configuring TLS/mTLS, testing with bufconn, or working with streaming RPCs.

第三方安全检查结论

发现安全风险

已检查文件
4
发现的风险
3
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。发现 1 项风险
中风险

安装说明会获取并安装未固定版本的可执行工具

原文依据:1 处
发现了什么

两个 Go 代码生成器均通过 `@latest` 安装。执行该步骤时,实际下载和随后运行的代码取决于当时上游发布的最新版本,而不是本次审计可确认的固定版本。

为什么需要注意

上游账户、发布流程或依赖若被入侵,或者最新版本出现不兼容变更,用户可能安装并运行未经审查的代码,生成结果也可能发生不可预期变化。

依赖安装说明确实要求用 `@latest` 获取并安装两个可执行代码生成器。用户执行时会下载当时的上游最新版,版本不可复现,且其供应链内容不在所提供源码的审计范围内。这里没有证据表明上游恶意,但存在版本漂移及被破坏版本影响本机或生成代码的风险。用户可要求作者给出经过验证的固定版本,并在隔离环境中安装。

SKILL.md:33来自说明文档打开原文件
**Dependencies:**- protoc: `brew install protobuf`- protoc-gen-go: `go install google.golang.org/protobuf/cmd/protoc-gen-go@latest`- protoc-gen-go-grpc: `go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest`
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

示例会把内部错误文本返回给远程客户端

原文依据:2 处
发现了什么

`codes.Internal` 示例使用 `%v` 将底层 `err` 拼入 gRPC 状态消息。该消息会通过 RPC 返回给调用方,可能包含数据库错误、内部地址、查询内容或其他实现细节。这也与随附评测中“不得泄露内部错误细节”的要求直接冲突。

为什么需要注意

采用该示例的服务可能向未受信任的客户端披露内部系统信息,为进一步探测提供线索。

该技能的“推荐”处理示例把底层 err 通过 `%v` 放入 `codes.Internal` 状态消息;采用该代码时,消息会返回给 RPC 调用方,底层错误若含查询、主机名或其他实现信息便可能泄露。随附评测明确要求 Internal 消息不得这样暴露细节,进一步表明示例与自身安全目标冲突。用户可要求作者改为固定的对外消息,并仅在服务端受控日志中记录原始错误。

SKILL.md:155来自说明文档打开原文件
// ✓ Good — specific code lets clients act appropriatelyif errors.Is(err, ErrNotFound) {    return nil, status.Errorf(codes.NotFound, "user %q not found", req.UserId)}return nil, status.Errorf(codes.Internal, "lookup failed: %v", err)```
查看另外 1 个位置
evals/evals.json:26来自说明文档打开原文件
      {        "id": "1.5",        "text": "Does NOT leak internal error details in the user-facing gRPC message for Internal errors"      }
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。未发现风险
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。发现 1 项风险
中风险

全局重试策略可能重复执行非幂等 RPC

原文依据:1 处
发现了什么

示例把 `UNAVAILABLE` 重试策略配置到空服务名的默认方法配置,而没有限制具体的只读或幂等方法。若创建订单、扣款或写入操作已在服务端完成,但响应以 `UNAVAILABLE` 丢失,客户端最多重试三次。

为什么需要注意

可能产生重复订单、重复写入、重复通知,甚至重复收费等商业后果。

示例的 `methodConfig` 使用空服务名,因而不是只针对已确认可安全重试的具体方法;同时为 `UNAVAILABLE` 设置最多三次尝试。若用户照搬到包含创建、扣款等非幂等方法的客户端,并且服务端已完成操作但响应丢失,重试可能造成重复副作用。用户可要求作者把策略限定到明确的幂等方法,并说明写操作需使用幂等键或服务端去重。

SKILL.md:116来自说明文档打开原文件
    grpc.WithTransportCredentials(creds),    grpc.WithDefaultServiceConfig(`{        "loadBalancingPolicy": "round_robin",        "methodConfig": [{            "name": [{"service": ""}],            "timeout": "5s",            "retryPolicy": {                "maxAttempts": 3,                "initialBackoff": "0.1s",                "maxBackoff": "1s",                "backoffMultiplier": 2,                "retryableStatusCodes": ["UNAVAILABLE"]            }        }]    }`),)

Skill 逻辑拆解

8 个说明模块

该 Skill 的主要用途是指导代理构建或审查 Go gRPC 服务,包括 proto 组织、客户端/服务端实现、错误处理、TLS、流式 RPC 和测试。

查看原文
SKILL.md:26来自说明文档打开原文件
**Persona:** You are a Go distributed systems engineer. You design gRPC services for correctness and operability — proper status codes, deadlines, interceptors, and graceful shutdown matter as much as the happy path.**Modes:**- **Build mode** — implementing a new gRPC server or client from scratch.- **Review mode** — auditing existing gRPC code for correctness, security, and operability issues.

其声明的能力不仅包括读取和修改文件,还包括执行 Go、protoc、git 等命令、联网获取内容及启动代理;路径匹配所有 Go 文件。因此,启用时的实际权限范围比纯文档参考更广。

查看原文
SKILL.md:21来自说明文档打开原文件
        bins: [protoc]allowed-tools: Read Edit Write Glob Grep Bash(go:*) Bash(golangci-lint:*) Bash(git:*) Agent WebFetch mcp__context7__resolve-library-id mcp__context7__query-docs Bash(protoc:*) AskUserQuestion Bash(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:  - "**/*.go"---

该 Skill 明确建议生产环境启用 TLS、验证认证令牌并关闭反射,这些属于降低凭据泄露和 API 枚举风险的防护说明。

查看原文
SKILL.md:191来自说明文档打开原文件
## Security- TLS MUST be enabled in production — credentials travel in metadata- For service-to-service auth, use mTLS or delegate to a service mesh (Istio, Linkerd)- For user auth, implement `credentials.PerRPCCredentials` and validate tokens in an auth interceptor- Reflection SHOULD be disabled in production to prevent API discovery
从这里开始 · 工作说明SKILL.md
golang-grpc
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。 另有 3 个章节,可在原文件中查看。

文件引用关系图

2 处引用
哪些文件发起引用引用了什么
连线表示真实的文件引用,不是运行顺序。点击节点可高亮相关连线,并查看具体文件和原文位置。虚线表示还有文件需要定位。
文件与检查记录4 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文
  • references/protoc-reference.md已纳入全文
  • references/testing.md已纳入全文
  • evals/evals.json已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明
  • evals/evals.json配套文件
  • references/protoc-reference.md配套文件
  • references/testing.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:12来自说明文档打开原文件
    emoji: "🌐"    homepage: https://github.com/samber/cc-skills-golang    requires:
运行命令
SKILL.md:21来自说明文档打开原文件
        bins: [protoc]allowed-tools: Read Edit Write Glob Grep Bash(go:*) Bash(golangci-lint:*) Bash(git:*) Agent WebFetch mcp__context7__resolve-library-id mcp__context7__query-docs Bash(protoc:*) AskUserQuestion Bash(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:
references/protoc-reference.md:74来自说明文档打开原文件
```bash# Basic generation
references/protoc-reference.md:136来自说明文档打开原文件
```bashbuf generate              # Generate code from buf.gen.yaml
安装其他软件包
SKILL.md:35来自说明文档打开原文件
- protoc: `brew install protobuf`- protoc-gen-go: `go install google.golang.org/protobuf/cmd/protoc-gen-go@latest`
读取密钥或账号配置
SKILL.md:60来自说明文档打开原文件
| Testing | `google.golang.org/grpc/test/bufconn` || TLS / mTLS | `google.golang.org/grpc/credentials` || Health checks | `google.golang.org/grpc/health` |
SKILL.md:115来自说明文档打开原文件
conn, err := grpc.NewClient("dns:///user-service:50051",    grpc.WithTransportCredentials(creds),    grpc.WithDefaultServiceConfig(`{
SKILL.md:193来自说明文档打开原文件
- TLS MUST be enabled in production — credentials travel in metadata- For service-to-service auth, use mTLS or delegate to a service mesh (Istio, Linkerd)
读取了多少行
981
文件校验值(用于核对版本)
b829526aa60cf1b5e1d7a7d1f550dd37fd7fbe20ff4546f906cf00668d081cf8