专栏名称: 狗厂
目录
相关文章推荐
51好读  ›  专栏  ›  狗厂

【漏洞分析】Go语言任意代码执行漏洞 CVE-2018-6574

狗厂  · 掘金  ·  · 2018-04-25 05:56

正文

阅读: 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代码。







请到「今天看啥」查看全文