前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2021年1月19日 Go生态洞察:Go命令行路径安全性的提升

2021年1月19日 Go生态洞察:Go命令行路径安全性的提升

作者头像
猫头虎
发布2024-04-09 15:35:18
750
发布2024-04-09 15:35:18
举报

2021年1月19日 Go生态洞察:Go命令行路径安全性的提升

📚 摘要

大家好,猫头虎博主带你深入探索Go的世界!今天的主题是关于最近Go安全更新所解决的关键问题:在不受信任的目录中进行PATH查找,这可能在执行go get命令时导致远程执行。这篇博客将详细介绍这个漏洞,Go团队是如何修复它的,以及你如何确定自己的程序是否也存在类似的安全隐患。

🌟 引言

在软件开发中,安全永远是首要任务。Go的最新安全更新解决了一个关于PATH查找的重要问题,这个问题可能导致在某些条件下执行远程代码。理解这个问题的本质,以及它如何影响Go程序,对于每个Go开发者来说都是至关重要的。

🚀 正文内容

🛡️ Go命令与远程执行的问题

Go命令的一个设计目标是大多数命令(包括go buildgo docgo getgo installgo list)不运行从互联网下载的任意代码。但go rungo testgo generate显然是个例外。所以,当go get被欺骗执行任意代码时,我们认为这是一个安全漏洞。

🌐 命令、PATH和Go

所有操作系统都有一个可执行路径的概念(Unix上的$PATH,Windows上的%PATH%),这是一个目录列表。当你在shell提示符下输入一个命令时,shell会依次在列表中的每个目录中查找具有你输入的名称的可执行文件。它运行找到的第一个文件,或者打印出如“command not found”之类的信息。

🐛 漏洞的细节

go get下载并构建包含import "C"的包时,它运行名为cgo的程序来准备相关C代码的Go等价物。go命令在包含包源代码的目录中运行cgo。一旦cgo生成了其Go输出文件,go命令本身调用Go编译器处理生成的Go文件,并调用主机C编译器(如gccclang)来构建与包一起提供的任何C源文件。但问题在于go命令如何找到主机C编译器?它在PATH中查找。

🛠️ 修复措施

为了解决这个问题,Go团队采取了两步策略。首先,go命令现在会向cgo传递完整的主机C编译器路径。其次,cgogo和Go发行版中的其他所有命令现在使用os/exec包的一个变体,该变体会报告错误,如果以前会使用来自当前目录(dot)的可执行文件。

🛡️ 如何确定自己的程序是否受影响

如果你在自己的程序中使用exec.LookPathexec.Command,只有在运行程序的目录包含不受信任内容时才需要担心。在这种情况下,子进程可能会使用来自当前目录而不是系统目录的可执行文件启动。

🔄 通过golang.org/x/sys/execabs保护你的程序

如果你担心自己的程序可能受到类似的影响,可以使用[golang.org/x/sys/execabs](https://

pkg.go.dev/golang.org/x/sys/execabs)包来增加安全性。你只需要在程序中将

代码语言:javascript
复制
import "os/exec"

替换为

代码语言:javascript
复制
import exec "golang.org/x/sys/execabs"

并重新编译程序。

📈 总结知识要点

要点

说明

Go命令与安全问题

go get被欺骗执行任意代码被视为安全漏洞

PATH查找问题

漏洞涉及Go和其他程序如何找到可执行文件

解决方案

go命令现在向cgo传递完整的C编译器路径,并修改os/exec包

检查自己的程序

使用golang.org/x/sys/execabs来增强安全性

默认保护os/exec

讨论更改Windows上exec.Command和exec.LookPath的默认行为

🎓 总结

这篇文章已被猫头虎的Go生态洞察专栏收录,详情点击这里

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2021年1月19日 Go生态洞察:Go命令行路径安全性的提升
    • 📚 摘要
      • 🌟 引言
        • 🚀 正文内容
          • 🛡️ Go命令与远程执行的问题
          • 🌐 命令、PATH和Go
          • 🐛 漏洞的细节
          • 🛠️ 修复措施
          • 🛡️ 如何确定自己的程序是否受影响
          • 🔄 通过golang.org/x/sys/execabs保护你的程序
        • 📈 总结知识要点
          • 🎓 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档