作者:綠盟科技
來源:http://blog.nsfocus.net/cve-2018-6574/
前不久,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編譯時產生代碼執行。
转载请注明:IAMCOOL » Go語言任意代碼執行漏洞 CVE-2018-6574