前言
代码审计总是离不开一些神器,笔者常用 Codeql[1] 这款工具辅助挖洞。当我每写一个规则都需要对其它项目手动运行检查一遍,效率很低,再加上 lgtm[2] 的关闭,此项目诞生了 --- 弈(Yi)[3] 。
CVE-2021-43798
这里以 Graana 的任意文件读取漏洞举例说明使用方法(初学 Codeql,如有错误之处,轻点喷)。
该漏洞版本为 8.0.0 - 8.3.0 , 修复版本为 8.3.1, 8.2.7, 8.1.8, 8.0.7。
git clone https://github.com/grafana/grafana
git checkout v8.2.6
这个漏洞发生在 /public/plugins/:pluginId/*
api 中,当输入的 pluginId
存在时,会匹配*
内容,使用filepath.Clean
清理路径中的多余字符后,直接拼接到pluginFilePath
,然后使用os.open(pluginFilePath)
打开该文件,最终回显到页面。而且plugins api
权限为public
,是未授权的,任何人都可以查看。
fmt.Println(filepath.Clean("./.../../../../../../../etc/passwd"))
输出:../../../../../etc/passwd 只清除了前面的./.../../
Codeql分析
生成 codeql 数据库:
codeql database create /Users/yhy/CodeQL/database/go/grafana/v8.2.6 -s ./ --language=go
sink
os.open()
,这个显而易见。
import go
import DataFlow::PathGraph
class Sink extends DataFlow::Node {
Sink() {
exists(
DataFlow::CallNode