最新消息:图 床

Go語言任意代碼執行漏洞 CVE-2018-6574

COOL IAM 154浏览 0评论

作者:綠盟科技
來源: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

0 0 vote
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x