近日,Go 官方发布了 Go 1.20.3 和 Go 1.19.8,这是两个小版本,主要涉及 4 个安全更新,具体包括:
go/parser:解析中的无限循环
在包含行号非常大的 //line 指令的 Go 源代码上调用任何 Parse 函数都可能由于整数溢出而导致无限循环。
issue 地址:https://go.dev/issue/59180。
html/template: 反引号不被视为字符串定界符
模板没有正确地将反引号 (`) 视为 Javascript 字符串定界符,因此没有按预期转义它们。从 ES6 开始,反引号用于 JS 模板文字。如果模板在 Javascript 模板文字中包含 Go 模板操作,则操作的内容可用于终止文字,将任意 Javascript 代码注入 Go 模板。
由于 ES6 模板文字相当复杂,并且它们本身可以进行字符串插值,我们决定简单地禁止在其中使用 Go 模板操作(例如“var a = { {.}}”),因为没有明显安全的方法允许这样做行为。这采用与 https://github.com/google/safehtml 相同的方法。Template.Parse 现在会在遇到这样的模板时返回错误,当前未导出的 ErrorCode 值为 12。此 ErrorCode 将在下一个主要版本中导出。
依赖此行为的用户可以使用 GODEBUG 标志 jstmpllitinterp=1 重新启用它,但需要注意的是反引号现在将被转义。这应该谨慎使用。
issue 地址:https://go.dev/issue/59234。
net/http, net/textproto: 内存分配过多导致拒绝服务
HTTP 和 MIME 标头解析可能会分配大量内