CodeQL 是一个语义代码分析引擎,它可以扫描发现代码库中的漏洞。使用 CodeQL,可以像对待数据一样查询代码。用户可以使用 ql 语言编写自定义规则识别软件中的漏洞,也可以使用ql自带的规则进行扫描。GitHub已免费提供CodeQL ,我们可以在GitHub项目中的Action功能来使用CodeQL
登录github之后,先Fork一个项目,然后选择Security-Code scanning alerts-Set up code scanning:
然后选择CodeQL Analysis,如图:
支持的语言:C, C++, C#, Go, Java, JavaScript, TypeScript, Python, and Ruby developers。然后会创建一个Action的模板,一般不用改动,github会自动识别项目的开发语言。
提交commit即可,然后就可以在Action中看见任务了,等待扫描完成会发送邮件。
扫描完成之后在Security-Code scanning alerts就可以看到结果:
查看详情,查看路径:
也提供了漏洞示例,如图:
在github找到个项目,扫描后发现一个任意文件读取:
分析代码,先用node启动一个http服务:
获取url,用?分割,然后判断最后字符串是否以/结尾,所以只需要不以/结尾的url就不会被加上index.html,这里传入/../../aaa为例
判断是否为/live_reload,然后拼接outDistRootDir目录
这个目录定义为空:
在利用path.normalize方法将路径规范化,查看文档:
结果:/abc,如图:
结果:/aaa/abc,如图:
最终的absPath为/aaa,然后调用fs.readFile读取/aaa文件,写入res,最终导 致任意文件读取,如图所示:
总体感觉不错,比较方便,感觉对javascript支持比较好,测试了一些java和C的项目,经常遇到build错误,项目大了也耗时比较久。可以本地化基础到devsecops流程中,也可以用来批量扫一些开源项目,刷CVE等。