2026年三月月 发布的文章

别再无脑 go get @latest 了!你的服务器可能下一秒就被黑客接管

本文永久链接 – https://tonybai.com/2026/03/19/proposal-support-dependency-cooldown-in-go-tooling

大家好,我是Tony Bai。

试想一个极其真实的“黑色星期五”场景:

下班前一小时,你为了修复一个无关紧要的小 Bug,或者只是心血来潮想把项目里的依赖库清理一下,于是你顺手在终端里敲下了极其熟练的几个字符:

go get -u

或者 

go get github.com/xxx/yyy@latest

看着屏幕上飞速滚动的下载进度条,一排排依赖被成功升级到带有 v1.x.x 的最新版本,你的心里涌起了一阵莫名的舒适与安全感。毕竟,在绝大多数程序员的潜意识里:“最新版 = 修复了所有已知漏洞 = 性能更强 = 最安全”。

但如果我今天告诉你,你敲下的那个 @latest,其实是黑客精心为你准备的“夺命接引符”呢?

这绝不是危言耸听。就在不久前,Go 官方 GitHub 仓库中出现了一个引发核心开发团队激烈讨论的提案:Issue #76485(在 Go 工具链中支持依赖冷却期)。

这个提案的提出,暴露出我们在面对一种名为“供应链投毒”的高级攻击时,防御体系有多么脆弱。

今天,我们就来硬核扒开这个提案背后的深层技术逻辑,看看 Go 官方打算如何拯救我们的依赖树。

你以为的最新版,其实是黑客的“盲区红利”

近几年来,在 NPM、PyPI 乃至 Rust 的 Crates.io 生态中,“开源供应链投毒”早就不是什么新鲜事了。黑客们的攻击手段已经从早期的“暴力破解服务器”,演变成了极其阴险的“社会工程学与自动化投毒”。

他们的套路简单粗暴,但杀伤力惊人:

黑客会去盗取某个高星级开源库作者的 GitHub 账号,或者利用极具迷惑性的“拼写错误(Typosquatting,比如把 mongodb 拼成 mogodb)”发布一个恶意包。在这个包的 init() 函数里,他们悄悄塞进一段挖矿脚本、一段窃取服务器环境变量(包含 AWS Key 或数据库密码)的后门代码,然后打上一个闪亮的最新版本号,比如 v1.9.9。

这个时候,谁最先更新依赖,谁就最先成为黑客刀下的韭菜。

在网络安全界,有一个极其残酷的定律:恶意代码从发布到被发现,是存在一个“致命时间差”的。

当一个投毒包被发布到全世界的代理镜像(Proxy)上,到它被安全社区的白帽子发现、逆向分析、并最终拉黑(报 CVE 漏洞),通常需要几天到几周的时间。

在这段无人察觉的“安全盲区”里,你对“最新版”的盲目狂热,恰恰成了黑客最喜欢的传播加速器。你在帮黑客做大范围的灰度测试,而你的生产服务器,就是那只可怜的小白鼠。

Go 的三道防线:MVS 与 SumDB 的极限,以及最后的防守漏洞

很多 Go 开发者看到这里可能会不服气:“Tony 老师,你说的都是 Node.js 和 Python 那边的事儿。我们 Go 语言的依赖管理系统可是业界公认最安全的!”

没错,Go 语言在设计模块系统(Go Modules)时,确实比其他语言多长了几个心眼。我们目前拥有两道底层防线:

第一道防线:MVS(最小版本选择,Minimal Version Selection)。

当你安装一个依赖时,NPM 默认会去寻找符合语义化版本(SemVer)的“最新兼容版本”。但 Go 的 MVS 算法极其保守,它只会选择能满足所有依赖要求的最老版本(即最小版本)。这意味着,即使黑客发布了一个带毒的 v1.2.9,只要你的项目依赖树只要求 v1.2.0,Go 就绝对不会自作多情地帮你自动升级到最新版。MVS 直接掐断了黑客通过“传递依赖”悄悄感染你的路径。

第二道防线:SumDB(校验和数据库)。

如果你在本地偷偷篡改了某个版本的代码,Go 会在构建时大声报错。因为 Go 引入了一个基于密码学的透明日志系统 sum.golang.org。每一个包的版本只要一经发布,它的哈希值就会被永久记录在这个不可篡改的账本上。黑客无法“悄悄替换”一个已经存在的历史版本。

既然有了 MVS 和 SumDB,我们是不是就绝对安全了?

错!这两道防线有一个致命的盲点:它们防不住“开发者手贱”。

如果黑客发布了一个全新的带毒版本 v2.0.0,而你为了追求新特性,或者仅仅是强迫症发作,主动在终端里敲下了 go get -u,或者 go get xxx@latest,那么 MVS 的保护伞将瞬间失效。你主动把门禁打开,把伪装成“最新版”的木马迎进了核心机房。

终极杀招:Go 社区的建议——“让子弹飞一会儿”

既然传统的静态代码扫描防不住这种零日投毒,既然开发者总是管不住手想要升级最新版,那该怎么办?

Go 社区在提案中给出了一种解法:“既然投毒被发现需要时间,那我们就用魔法打败魔法——给依赖强行加一个物理隔离的冷却期(Cooldown)。”

在这个代号为 #76485 的提案中,开发者提出引入一个全新的环境变量来掌控全局:

GOCOOLDOWN=15d go mod tidy

这句话的底层指令是:“Go 工具链请注意,在帮我拉取或更新依赖时,请自动屏蔽掉所有发布时间少于 15 天的包。哪怕它的版本号再高、特性再诱人,只要它太年轻,一律当它不存在。”

这个设计的底层逻辑简直绝妙:绝大多数开源投毒攻击,在极度活跃的头几天内就会被安全专家揪出来。只要你忍住不当全网第一批“小白鼠”,等这个包在开源世界里被成千上万的其他语言开发者“趟过雷”,冷却了 15 天依然安然无恙,那么它大概率就是真正安全的。

这就是传说中的:只要我跑得足够慢,黑客的镰刀就永远割不到我。

如何骗过时间?Go 底层的极度严谨

看到这里,有经验的高级架构师肯定会抛出一个极其尖锐的质疑:

“等等!如果黑客在发布恶意包的时候,直接篡改 Git 的 Tag 时间,把今天的发布时间伪造成三个月前,这所谓的冷却期不就成了一个毫无防备的摆设了吗?”

如果你能想到这层,说明你已经具备了极强的黑客攻防思维。但在提案的深度讨论中,Go 密码学包主要维护者 FiloSottile 等核心开发者,早就把黑客的这条退路给焊死了。

在 Go 团队的设计构想中,冷却期的计算,绝对不依赖于容易被任意篡改的 Git Tag 或包作者自己声称的发布时间。

相反,Go 将调用我们前面提到的那套坚如磐石的基础设施——SumDB

当全球代理(如 proxy.golang.org)第一次看到并抓取某个包的全新版本时,SumDB 会在它的密码学叶子节点上,不可撤销地打上一个“首次观测时间戳(First-observed timestamp)”

这就像是去典当行抵押物品。小偷可以随意把手表的出厂日期磨掉改成十年前,但他绝对无法欺骗典当行头顶那带时间戳的监控录像。只要 SumDB 的日志显示这块表是昨天刚拿进来的,那么 GOCOOLDOWN 就会无情地将其拦截在门外。

至此,Go 语言的供应链防线形成了完美的逻辑闭环:

  • MVS 确保了你不会被动卷入升级;
  • SumDB 确保了历史包的绝对不可篡改;
  • 而全新的 Cooldown(冷却期),则补齐了你主动拉取最新版时的最后一块安全护盾。

小结:在特性落地前,我们该怎么保护自己?

虽然目前 #76485 依然在激烈的 Proposal Review(提案评审)阶段,甚至可能最终会演变成一个外部的轻量级过滤代理工具,但它透露出的底层工程哲学,值得每一位后端开发者立刻应用到日常的高并发架构中:

  1. 立刻戒掉 @latest 的瘾:在生产环境中,尽量不要使用 go get -u 去盲目追新。稳定运行了几个月的依赖树,如果没有极其严重的 Bug 或报出的 CVE 安全漏洞,绝对不要去动它。
  2. 拥抱自动化的“安全缓冲期”:如果你在公司内部使用了 Renovate 或 Dependabot 这样的自动依赖更新机器人,立刻去后台把“最小发布年龄(Minimum Release Age)”配置项打开,设置为 7 天或 15 天。让机器替你踩刹车。
  3. 敬畏时间,建立护城河:软件工程不是追星买首发。让别人不重要的边缘业务先去帮这个开源库的最新版“踩坑”,这是一个能够扛起千万级 QPS 的资深架构师应有的沉稳与克制。

在险象环生的网络世界里,时间不仅是解药,更是我们最强大的防火墙。期待 GOCOOLDOWN 的防守理念早日普及,让我们彻底告别每天提心吊胆更新依赖的日子。

资料链接:https://github.com/golang/go/issues/76485


今日互动探讨

你在公司里,遇到过因为同事“手贱升级了最新依赖”而导致生产环境崩溃,或者遭遇供应链投毒的血泪史吗?

欢迎在评论区疯狂吐槽与分享


认知跃迁:读懂底层机制,才能看透系统架构的本质

从保守的 MVS,到密码学级别的 SumDB,再到今天探讨的反直觉的 GOCOOLDOWN,你会发现,Go 团队在设计这门语言的工具链时,处处透着一种对工程稳定性、安全性的极致追求和克制。

然而,令人遗憾的是,很多开发者写了五六年的 Go 代码,却依然只停留在“会用 Gin 写写 CRUD 接口”的表层。他们对 Go 工具链底层的设计哲学、并发调度的本质、内存模型的安全逻辑一无所知。一旦线上的高并发系统出现复杂的性能瓶颈,或是遭遇底层的安全漏洞,往往束手无策,只能靠瞎猜。

如果你渴望突破这种“熟练调包侠”的瓶颈,想要像顶级大厂架构师一样,看透 Go 语言背后的系统级设计思维,建立起坚不可摧的技术护城河——

我的极客时间专栏 Tony Bai·Go语言进阶课 正是为你量身定制。

在这 30+ 讲极其硬核的内容中,我不仅带你剥开语法糖,深挖 Goroutine 调度、Channel 哲学、内存逃逸;更会带你全面吃透 Go 的工程化实践,把构建、依赖管理背后的深层逻辑一次性讲透。

目标只有一个:助你完成从“Go 熟练工”到“能做顶级架构决策的 Go 专家”的蜕变!

扫描下方二维码,加入专栏。不要用战术上的勤奋,掩盖战略上的懒惰。让我们一起用架构师的视角,重新认识 Go 语言。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

为什么你的 AI Agent 总是像个智障?来自 Manus 大佬的 2 年血泪避坑指南

本文永久链接 – https://tonybai.com/2026/03/18/why-ai-agents-act-stupid-manus-expert-pitfall-guide

大家好,我是Tony Bai。

如果你在过去一年里跟风写过 AI Agent(智能体),你大概率经历过这样的绝望时刻:

你兴致勃勃地给大模型挂载了二三十个精心编写的 Function Calling(函数调用)工具,比如 read_file, search_web, execute_python……你期待它能像钢铁侠的贾维斯一样运筹帷幄。

结果呢?面对稍微复杂一点的任务,你的 Agent 瞬间退化成一个“智障”。

它要么在几十个工具里疯狂迷失,选错了参数导致系统报错;要么陷入无限死循环,把你的 Token 烧个精光,最后无辜地吐出一句:“抱歉,我无法完成该任务。”

我们总以为是自己的 Prompt 没写对,或者是大模型还不够聪明。

直到前些日子,一位名叫 MorroHsu 的顶级实战派大佬(在被 Meta 收购前,他是现象级 AI 产品 Manus 的后端技术负责人)在 Reddit 上抛出了一篇长文

在过去两年里,他以后端负责人的身份参与构建了包括 Manus、agent-clip 等在内的多个顶尖 Agent。在被大模型的各种奇葩幻觉折磨了无数遍之后,他得出了一个极其震撼、甚至有些反直觉的血泪结论:

别再瞎折腾繁琐的 Typed Function Calls(类型化函数调用)了!给大模型一堆乱七八糟的 API,就是它变“智障”的罪魁祸首。大模型最需要的,仅仅是 50 年前的 Linux 命令行(CLI)。

今天,我们就来看看这位 Manus 前后端大佬的 2 年避坑心法。看看为什么最前沿的 AI,反而需要最古老的 Unix 哲学来拯救。

为什么给 AI 几百个工具,它反而成了“智障”?

目前主流的 Agent 框架(如 LangChain),都在教我们怎么给大模型塞满工具箱。你塞的工具越多,系统看起来越庞大。

但 MorroHsu 指出了这背后的致命逻辑错误:工具选择的认知过载(Cognitive Load)。

大模型每次行动前,都要在几十个有着不同数据结构(Schemas)的工具中艰难地做选择题:“我到底该用哪一个?参数填什么?” 上下文的注意力被极大地分散了,准确率直线断崖式下跌。

大佬的解法粗暴且优雅:废弃所有花里胡哨的工具,只给大模型提供唯一的一个函数:run(command=”…”)。

为什么?因为大模型天生就是个 Linux 高手!

大模型的训练语料库里,充斥着 GitHub 上数十亿行的代码、README.md 中的安装指南、以及 Stack Overflow 上的报错日志。这些语料中,密密麻麻全是 CLI 命令行。

如果你让它去调用你发明的 read_log_file(path) API,它还要去猜测你的参数定义;但如果你让它去找日志里的错误,它会凭着肌肉记忆毫不犹豫地写出:

run(command=”cat /var/log/app.log | grep ‘ERROR’ | tail -n 20″)

你看,CLI 本身就是大模型最熟悉的母语。不要发明新的轮子去教大模型做事,直接把它最熟悉的世界交给它。

50年前的“管道”魔法,完美解决了 Agent 编排难题

如果只有一个 run 命令,AI 遇到复杂任务怎么办?

这就引出了 50 年前 Unix 操作系统的伟大设计哲学:一切皆文件。

Unix 的先驱们设计了大量只做一件事的小工具(cat, grep, sort),然后通过管道(Pipe |)将它们串联成无比强大的工作流。

而这,完美契合了大模型的核心本质——大模型只能理解文本输入和文本输出!

在传统的 Function Calling 中,为了完成“下载数据 -> 过滤错误 -> 排序前 10 条”这个任务,你的 Agent 可能需要连续调用 3 个不同的自定义函数,经历 3 轮耗时极长的 LLM 推理,中间稍微错一步就满盘皆输。

但在 CLI 模式下,AI 只需要通过一次组合调用就能秒杀:

run(command=”curl -sL $URL | grep ’500′ | sort | head 10″)

这种强大的“组合编排能力(Composition)”,不是什么 AI 领域的最新黑科技,而是 Unix 管道原生自带的降维打击。

把大模型当人看,设计“防智障”导航系统

当然,光把命令行扔给大模型,它依然会因为瞎猜而犯错。MorroHsu 总结了三个极其硬核的实战设计技巧,教你如何打造一个“防智障”的 Agent 导航系统:

绝招 1:渐进式发现(Progressive Discovery)

不要一开始就把所有命令的长篇大论全塞给大模型,那会瞬间撑爆它的上下文窗口。

只要告诉大模型:“你可以运行 run(“command”)。遇到不懂的,运行 command –help”

大模型其实非常懂得自我探索。当它发现报错时,它会自动去查阅说明书。这种“按需发现”的能力,极大地节省了宝贵的 Token。

绝招 2:把报错变成“向导”

这是最具启发性的一点!当大模型敲错命令时,千万别只返回一个冷冰冰的 exit code 127 或者 command not found。大模型无法像人类那样去 Google 搜索错误原因,它只会陷入瞎猜的死循环。

你必须在 stderr(标准错误输出)里加上向导信息。

传统报错:cat: photo.png: binary file

给 AI 的防智障报错:[Error] cat: photo.png is a binary image. Use ‘see photo.png’ instead.

不要试图阻止大模型犯错,而是要让它的每一次犯错,都成为指向正确道路的路标。

绝招 3:双层架构(物理隔离幻觉)

大模型的上下文是极其脆弱的。MorroHsu 分享了一个惨痛的真实案例:

一个用户上传了一张系统架构图,Agent 试图用 cat 命令读取它。结果 182KB 的乱码二进制字节流瞬间冲入了大模型的上下文。大模型当场“失了智”,开始不停地胡言乱语、重试、陷入死循环……足足浪费了 20 次推理的钱。

为了解决这个问题,必须在底层 Unix 执行和大模型展示层之间,建立一道“二进制守卫(Binary Guard)”“截断溢出守卫(Overflow Mode)”

当探测到命令输出超过 200 行,或者包含二进制乱码时,系统绝不把原数据返回给大模型,而是强制拦截并返回提示:

“— 输出已截断。请使用 grep 或 tail 命令进行搜索。—”

这就像给大模型戴上了一副防护眼镜,彻底杜绝了上下文被垃圾数据污染、导致智力下降的可能。

小结:化繁为简,才是架构的最高境界

目前,全网依然在乐此不疲地比拼谁的 Agent 框架更庞大、谁支持的 Tool Call 种类更多。但 原 Manus 大佬的这套“返璞归真”的血泪总结,给我们狠狠敲响了警钟。

最前沿的 AI,其实最需要最古老的系统智慧。

将 Unix 哲学的精髓(文本流、组合管道、小而美)与大模型的文本处理能力完美结合,放弃给 AI 制造复杂的隔离层和几十个脆弱的 API 接口,这才是真正属于“顶级工程师”的架构审美。

正如他在文末所言:“CLI 并非银弹,对于强类型校验和高安全性要求极高的场景,Typed API 依然不可或缺。但在广袤的智能体自主探索宇宙中,命令行,就是大模型所需要的全部。

资料链接:https://www.reddit.com/r/LocalLLaMA/comments/1rrisqn/i_was_backend_lead_at_manus_after_building_agents


今日互动探讨:

你在写 Agent 时,是喜欢用框架提供的一大堆 Tool Calls,还是像这位大神一样,直接让大模型写代码/写命令去执行?在实战中你的 AI 发生过哪些最搞笑的“智障/幻觉”行为?

欢迎在评论区分享你的血泪避坑史!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言进阶课 AI原生开发工作流实战 Go语言精进之路1 Go语言精进之路2 Go语言第一课 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com
这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats