不安全的 cgo 编译参数
恶意 cgo 包可利用 --sysroot 或 -target 等编译或链接参数在构建时执行代码。
Go 1.27.4 和 1.26.11 修复 12 项漏洞。恶意构建输入可触发代码执行。另一处竞态可使使用 MaxBytesReader 或 MaxBytesHandler 并并发读取请求体与写入响应头的 HTTP/1 服务崩溃。
Go 于 11 月 10 日发布 1.27.4 和 1.26.11。其中 11 项修复涉及 cgo 指令、原生对象文件、编译或链接参数等构建输入。构建恶意包时,部分漏洞可让攻击者以构建用户身份执行代码。具体路径取决于输入和工具链,例如 GCC specs 文件、Apple 链接器插件或特制 .syso 对象。排查会编译不可信贡献或新引入依赖、同时可访问凭据或发布权限的 CI 作业。
另一项 net/http 漏洞影响使用 MaxBytesReader 或 MaxBytesHandler 的 HTTP/1 处理器。请求体超限时,并发读取请求体和写入响应头可能触发 panic 并使服务崩溃。升级用于生成部署产物的工具链并重新构建受影响服务。只更新构建机,已有二进制文件仍包含旧代码。
恶意 cgo 包可利用 --sysroot 或 -target 等编译或链接参数在构建时执行代码。
使用 GCC 时,恶意 cgo 包可借特定链接选项加载由包控制的 specs 文件并执行命令。
恶意 cgo 包可借 Clang -gen-* 或 GCC -gnat* 参数执行代码或向任意目录写文件。
在 Darwin 上,恶意 cgo 包可让 Apple 链接器合并 -l 和 to_library 来加载包指定的插件。
恶意 cgo 包可利用分离的 -Wl, 参数及 GNU ld.bfd 接受的部分选项传入可执行代码的链接器脚本。
特制 .syso 文件或 cgo 链接输入可在链接时注入参数或执行代码。
恶意包可通过 #cgo pkg-config: 指令加载不可信 .pc 文件或传入未经校验的编译和链接参数。
包可将 Go 对象文件伪装成 .syso,借此注入 cgo 链接指令。
在 ELF 平台上,恶意包可利用特制 //go:cgo_* 指令向外部链接器注入任意参数。
恶意包可通过 //go:cgo_import_dynamic 或 Windows 上的特制 PE 对象传入不安全的库参数。
恶意 cgo 包可借 //go:cgo_ldflag 中的转义引号在构建时执行代码,或使 go 命令触发 panic。
HTTP/1 服务的处理器使用 MaxBytesReader 或 MaxBytesHandler,并在请求体超限时并发读取请求体和写入响应头,可能导致服务崩溃。
在每台机器上运行 go version,然后输入版本号,或者点一个最接近的。
| 分支 | 安全版本 | 状态 |
|---|---|---|
| Go 1.27 | 1.27.4 | 受支持 |
| Go 1.26 | 1.26.11 | 受支持 |
| 更早的 Go 版本 | none | 升级到受支持分支 |
11月10日 17:14 UTC
Go 发布 1.27.4 和 1.26.11
公告说明了 11 项工具链修复和 1 项 net/http 修复。
11月11日 02:51 UTC
Go 发布漏洞记录
12 条记录给出了受影响范围和两个修复版本。
我们列出每条说法和它的出处,并标出一手来源(厂商、研究人员、软件仓库)。各方说法不一致时,按最坏的可信情况定级。