Appearance
gokart是github上一个比较受欢迎的开源的go语言的静态分析工具. 它基于golang专有的ir进行分析.
golang的SSA 功能比较复杂,相对于soot这种只有十五条语句的IR,这个IR,要复杂不少,主要是他直接把go语言自身的很多特性直接放在了IR中,比如make, defer等.
这是一个典型的基于IR的数据流分析工具,相比基于ast的肯定要简单不少,可以认为他是一个通用的数据流分析引擎,其最核心的代码是util/taint.go中的ContainsTaint,其核心思路是从sink递归倒推,看看能不能遇到source,如果能就认为有问题,否则ok. 其他代码都是围绕这个思想而设计的.
内置了常见的几种漏洞:
- ssrf
- sql注入
- 命令行注入
- rsa弱密码
- 路径穿越
还支持自定义的source,sink.
说说缺点吧:
- 不够通用,虽然有自定义的source,sink,但是如果不是上面的几种漏洞,是你关注的其他楼栋,就要写代码来实现.
- 正如作者说的,想低误报,所以不少都没尝试,比如就没有处理interface.
一个失败的例子
go
type getPather interface {
getFilePhi(temp string) string
}
type S2 struct {
}
func (S2) getFilePhi(temp string) string {
reader := bufio.NewReader(os.Stdin)
hiddenMessage, _ := reader.ReadString('\n')
return temp + hiddenMessage
}
func DirTraversalPhi() {
safe := "hello"
folderPath := "./list1/images/"
var g getPather = S2{}
f, _ := os.Create(folderPath + g.getFilePhi(safe))
f.Close()
}
如果把第16行的getPather去掉,就能找到漏洞,否则就找不到.
可能因为服务端的漏洞本来就比较少,相比之下,越权之类的反而是多数,因此可以通过数据流分析直接扫描的漏洞数量是比较少的.