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

Golang Uber Fx Skill 安全审计

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

Golang application framework using uber-go/fx — fx.New, fx.Provide, fx.Invoke, fx.Module, fx.Lifecycle hooks, fx.Annotate (name/group/As), fx.Decorate, fx.Supply, fx.Replace, fx.WithLogger, and signal-aware Run(). Apply when using or adopting uber-go/fx, when the codebase imports `go.uber.org/fx`, or when wiring services with fx.New. For raw DI without lifecycle, see `samber/cc-skills-golang@golan

第三方安全检查结论

发现安全风险

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

宽泛的 Go 命令权限可执行仓库或工具链代码

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

`Bash(go:*)` 不只包含编译和检查,也涵盖 `go test`、`go run`、`go generate` 和安装工具等可执行代码的子命令。Skill 没有要求代理在运行前审查生成指令或测试代码。

为什么需要注意

在不可信仓库中运行这些命令可能以用户权限执行项目、测试、生成器或依赖代码,进而读取可访问的文件和凭据或修改工作区。

`Bash(go:*)` 覆盖整个 Go 命令面,不只读取或编译;在含有测试、生成器或可运行程序的项目中,获准的代理可触发仓库代码或工具链代码执行。正文确实需要 `go get`,所以 Go 权限有正当用途,但没有收窄到所需子命令,也没有要求执行前检查。证据不表示任何代码已运行;用户可限制为审核后的特定 Go 命令。

SKILL.md:18来自说明文档打开原文件
    skill-library-version: "1.24.0"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(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:
查看另外 1 个位置
SKILL.md:41来自说明文档打开原文件
```bashgo get go.uber.org/fx```
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

示例把 API 密钥作为可注入字符串放入全局依赖图

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

示例从环境变量读取 `API_KEY`,再通过顶层 `fx.Supply` 提供给依赖图。任何能够加入同一图并请求对应名称字符串的组件都可取得该密钥;该模式没有体现模块隔离、最小权限或日志脱敏。

为什么需要注意

若应用组合了第三方、被攻陷或误写的模块,密钥可能被非预期组件读取,并可能随后出现在日志或网络请求中。示例本身没有发送或记录密钥。

这是教学示例而非 Skill 自身读取或外传凭据,但它明确从环境变量取出 `API_KEY`,再把密钥作为命名字符串放入顶层 Fx 图。若用户采用此模式,同一图中知道名称 `apikey` 的组件便可请求该值;示例未展示作用域限制或防止日志输出。影响取决于图中组件是否可信。用户可要求使用窄作用域的凭据类型或仅把密钥传给 API 客户端构造器。

references/recipes.md:218来自说明文档打开原文件
```gofunc main() {    cfg := mustLoadConfig() // parsed flags + env, before fx    secret := os.Getenv("API_KEY")    fx.New(        fx.Supply(cfg),                  // *Config available everywhere        fx.Supply(fx.Annotate(secret, fx.ResultTags(`name:"apikey"`))),        fx.Provide(NewLogger, NewAPIClient),        fx.Invoke(run),    ).Run()}
查看另外 2 个位置
references/recipes.md:231来自说明文档打开原文件
func NewAPIClient(cfg *Config, p struct {    fx.In    APIKey string `name:"apikey"`}) *APIClient {    return &APIClient{baseURL: cfg.APIBaseURL, key: p.APIKey}}
references/recipes.md:215来自说明文档打开原文件
## fx.Supply for config and secrets```gofunc main() {    cfg := mustLoadConfig() // parsed flags + env, before fx    secret := os.Getenv("API_KEY")    fx.New(        fx.Supply(cfg),                  // *Config available everywhere        fx.Supply(fx.Annotate(secret, fx.ResultTags(`name:"apikey"`))),        fx.Provide(NewLogger, NewAPIClient),        fx.Invoke(run),    ).Run()}
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。发现 1 项风险
低风险

未固定版本的 go get 会下载依赖并更改模块文件

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

安装示例直接运行 `go get go.uber.org/fx`,没有指定版本。该命令通常访问网络并更新当前项目的 go.mod/go.sum,解析到的版本也可能随执行时间变化。

为什么需要注意

用户项目会产生持久依赖变更,并信任下载的模块内容;未经检查的升级还可能造成兼容性或供应链风险。

安装片段建议运行未指定版本的 `go get go.uber.org/fx`。用户在模块目录执行时,它通常会联网解析当时的版本并更新项目依赖文件,因此结果会随时间或现有模块状态变化。这是正常的 Go 依赖安装,不是隐蔽行为,但确有可复现性和文件变更风险。用户可要求固定版本,并在接受变更前检查 go.mod/go.sum 差异。

SKILL.md:41来自说明文档打开原文件
```bashgo get go.uber.org/fx```
查看另外 1 个位置
SKILL.md:35来自说明文档打开原文件
This skill is not exhaustive — refer to library documentation and code examples for more information:- For Go package docs, symbols, versions, importers, and known vulnerabilities, → See `samber/cc-skills-golang@golang-pkg-go-dev` skill (`godig`), preferred over Context7 for Go package facts.- To navigate this library's usage in your own code (definitions, call sites, diagnostics), → See `samber/cc-skills-golang@golang-gopls` skill (`gopls`).- Context7 remains a fallback for docs not indexed on pkg.go.dev.```bashgo get go.uber.org/fx```
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 2 项风险
中风险

Skill 请求不受子命令限制的 Git 权限

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

`Bash(git:*)` 允许任何 Git 子命令,而该 Skill 的说明内容并不需要推送、强制重置、清理工作区或删除分支。文件中没有指令声称会执行这些操作,但权限范围允许代理这样做。

为什么需要注意

若宿主按此声明授予权限,误判或受仓库内容影响的代理可能改写本地历史、删除未跟踪文件,或使用现有凭据向远端推送。

该 Skill 声明允许执行任意 `git` 子命令,而其用途是 Go/Fx 架构指导,正文未限定 Git 仅用于只读检查。若宿主按此权限执行代理生成的命令,代理可能改写分支、工作区或远端历史;证据并不表示这些操作已经发生。用户可要求作者删除 Git 权限或仅允许明确的只读子命令。

SKILL.md:18来自说明文档打开原文件
    skill-library-version: "1.24.0"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(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:
查看另外 1 个位置
SKILL.md:25来自说明文档打开原文件
# Using uber-go/fx for Application Wiring in GoApplication framework combining a reflection-based DI container (built on `uber-go/dig`) with a lifecycle, module system, signal-aware run loop, and structured event logging. For long-running services where boot order, graceful shutdown, and modular composition matter.
低风险

生产日志示例主动丢弃依赖注册和装饰事件

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

自定义记录器对 Provided、Supplied 和 Decorated 事件直接返回,并建议在生产环境过滤这些内容。这样会删除关于依赖图如何组装和修改的运行记录。

为什么需要注意

发生错误注入、意外装饰或配置替换时,运维人员可用于追查启动行为的证据更少;生命周期错误仍会保留,因此这不是完全关闭审计。

示例记录器会在收到 Provided、Supplied、Decorated 事件时直接返回,并明确建议生产环境采用这种过滤。若用户依赖 Fx 事件追踪依赖注册或装饰变化,这会减少事后审计信息;它不会删除应用数据,而且生命周期事件和错误仍会记录,因此影响限于可观测性。用户可要求保留这些事件、降低其日志级别,或发送到受限审计通道。

references/recipes.md:325来自说明文档打开原文件
func (l *ProductionLogger) LogEvent(e fxevent.Event) {    switch e.(type) {    case *fxevent.Provided, *fxevent.Supplied, *fxevent.Decorated:        return // drop the per-Provide chatter    default:        l.inner.LogEvent(e)    }}
查看另外 1 个位置
references/recipes.md:342来自说明文档打开原文件
In production, filtering provide/decorate noise leaves only lifecycle (start/stop) events and errors — much easier to audit.
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

8 个说明模块

该 Skill 是一份 Go/uber-go/fx 使用指南,指导代理组织依赖注入、生命周期、模块、日志和测试;提供的源文件只有 Markdown 和评测 JSON,没有可直接执行的捆绑脚本。

查看原文
SKILL.md:25来自说明文档打开原文件
# Using uber-go/fx for Application Wiring in GoApplication framework combining a reflection-based DI container (built on `uber-go/dig`) with a lifecycle, module system, signal-aware run loop, and structured event logging. For long-running services where boot order, graceful shutdown, and modular composition matter.

指南建议将长期运行的服务放入 OnStart,并在 OnStop 中关闭;示例会按照配置地址打开 TCP 监听端口,因此采纳代码时实际暴露范围由 cfg.Addr 决定。

查看原文
SKILL.md:94来自说明文档打开原文件
```gofunc NewHTTPServer(lc fx.Lifecycle, log *zap.Logger, cfg *Config) *http.Server {    srv := &http.Server{Addr: cfg.Addr}    lc.Append(fx.Hook{        OnStart: func(ctx context.Context) error {            ln, err := net.Listen("tcp", srv.Addr)            if err != nil { return err }            go srv.Serve(ln)         // blocking work in a goroutine            return nil        },        OnStop: func(ctx context.Context) error {            return srv.Shutdown(ctx)        },    })    return srv

文档明确说明 fx 的构造器是惰性的,而 Invoke 会在启动时触发依赖图中的代码;这意味着被加入图中的构造器和钩子应按应用代码同等审查。

查看原文
SKILL.md:81来自说明文档打开原文件
```gofx.New(    fx.Provide(NewLogger, NewDatabase, NewServer),  // lazy    fx.Invoke(RegisterRoutes, StartMetricsExporter), // always run during Start)````fx.Provide` registers constructors; `fx.Invoke` is the trigger — without an Invoke (directly or transitively) referencing a type, its constructor never runs.
从这里开始 · 工作说明SKILL.md
golang-uber-fx
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。 另有 5 个章节,可在原文件中查看。

文件引用关系图

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

检查范围与遗漏

逐文件查看涉及的内容

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

  • SKILL.md已纳入全文
  • references/advanced.md已纳入全文
  • references/recipes.md已纳入全文
  • references/testing.md已纳入全文
  • evals/evals.json已纳入全文

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

  • SKILL.md工作说明
  • evals/evals.json配套文件
  • references/advanced.md配套文件
  • references/recipes.md配套文件
  • references/testing.md配套文件

代码和说明中提到的操作

连接外部网站
SKILL.md:12来自说明文档打开原文件
    emoji: "🏭"    homepage: https://github.com/samber/cc-skills-golang    requires:
SKILL.md:31来自说明文档打开原文件
- [pkg.go.dev/go.uber.org/fx](https://pkg.go.dev/go.uber.org/fx)- [uber-go.github.io/fx](https://uber-go.github.io/fx/)
SKILL.md:32来自说明文档打开原文件
- [pkg.go.dev/go.uber.org/fx](https://pkg.go.dev/go.uber.org/fx)- [uber-go.github.io/fx](https://uber-go.github.io/fx/)- [github.com/uber-go/fx](https://github.com/uber-go/fx)
运行命令
SKILL.md:18来自说明文档打开原文件
    skill-library-version: "1.24.0"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(godig:*) Bash(gopls:*) LSP mcp__gopls__*paths:
SKILL.md:41来自说明文档打开原文件
```bashgo get go.uber.org/fx
读取密钥或账号配置
evals/evals.json:49来自说明文档打开原文件
    "description": "Tests fx.Supply for pre-built values (config, secrets) instead of fx.Provide with a no-op constructor",    "prompt": "In my Go application using uber-go/fx, I parse a *Config from flags and load an API_KEY environment variable in main() before calling fx.New. How should I make these available to the rest of the graph?",    "trap": "Without the skill, the model writes fx.Provide(func() *Config { return cfg }) — a redundant constructor that just returns the existing value. fx.Supply does this without the boilerplate.",
references/recipes.md:220来自说明文档打开原文件
    cfg := mustLoadConfig() // parsed flags + env, before fx    secret := os.Getenv("API_KEY")
references/recipes.md:224来自说明文档打开原文件
        fx.Supply(cfg),                  // *Config available everywhere        fx.Supply(fx.Annotate(secret, fx.ResultTags(`name:"apikey"`))),
读取了多少行
1,042
文件校验值(用于核对版本)
cb9348165f3935b49023540825b750794eac01aba97465af8851a4822afc2195