正文
![]()
阅读: 54
前不久,Go官方修复了CVE-2018-6574这个漏洞,这个漏洞又是涉及软件编译环节,和2015年Xcode被污染类似,攻击者可以通过在软件编译环节插入恶意数据从而执行任意代码,虽然原理并不复杂,但有很好的警示意义。
文章目录
什么是Go语言?
Go 是一个Google推出的开源编程语言,它能让构造简单、可靠且高效的软件变得更容易,且有着更高的开发效率和运行性能,因此受到了许多开发者的欢迎。
Go 程序源码 以 *.go 结尾,通过 go build 编译成native代码。
以最简单的hello world程序为例:hello.go
// hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
通过go build编译出可执行程序,再运行 ./hello 。也可以直接通过 go run ./hello.go 直接在/tmp目录下编译生成可执行文件,并运行。
同时Go语言允许与C语言的互操作,即在Go语言中直接使用C代码,因为本身Go在语法等方面和C就很像,其设计者以及其设计目标都与C语言有着千丝万缕的联系。
例如下面的代码,我们可直接在Go源码文件中嵌入了C代码,并用注释包裹起来
package main
/*
#include
#include
void my_print(char *str){
printf("%s\n",str);
}
*/
import "C"
import "unsafe"
import "fmt"
func main() {
fmt.Println("Hello, World!")
s:="hello cgo"
cs:=C.CString(s)
C.my_print(cs)
C.free(unsafe.Pointer(cs))
}
我们依然可以直接通过go build或go run来编译和执行,但实际编译过程中,go调用了名为cgo的工具,cgo会识别和读取Go源文件中的C元素,并将其提取后交给C编译器编译,最后与Go源码编译后的目标文件链接成一个可执行程序。
CVE-2018-6574 漏洞分析
参看CVE公告,这个漏洞是由于在源码编译时,未禁止 “-fplugin=”这类的参数导致在使用gcc/clang编译时产生代码执行。
上面已经说了在Go源码文件中可以嵌入了C代码,同时cgo会识别和读取Go源文件中的C元素,并将其提取后交给C编译器编译。
cgo调用gcc或者clang编译提取出的C代码。