如何利用CodeQL挖掘CVE-2020-10199

网友投稿 848 2022-10-17

如何利用CodeQL挖掘CVE-2020-10199

如何利用CodeQL挖掘CVE-2020-10199

前言

挖掘Java漏洞时候存在一个痛点在已知漏洞点的情况下,如何找到可控点,以及确定一条具体的数据流.

前几天看到@Alvaro Muñoz 利用codeql挖掘到[CVE-2020-10199]Nexus Repository Manager远程代码执行漏洞.于是就对codeql产生强烈的好奇心,怼了几天codeql语法和CVE案例。抠出挖掘该CVE的Ql代码

Codeql

对Codeql具体介绍可以参考:​​QL代码编写思路相当于在一个代码数据库中利用编写的逻辑搜索出可能的调用点。重点是确定Souce和Sink搜索逻辑.

漏洞原理简要分析

该漏洞是由于未做过滤造成表达式注入,作者确定漏洞点执行函数 buildConstraintViolationWithTemplate, 其该方法中 bean.getMessage() 返回结果 message 并未使用 stripJavaEl 方法过滤造成表达式注入

最后调用 org.hibernate.validator.internal.engine.messageinterpolation#interpolate ,执行插入操作并解析恶意字符串,造成表达式注入.

HelperBean bean#message

编写Codeql最重要的是先确定数据流的Sink点即污染点字段.这里跟进 org.sonatype.nexus.validation.HelperBean#getMessage 方法.返回message值.该值经由HelperBean方法传入

Ql代码

这里直接给出代码并做简单讲解:搜索出流经 HelperBean 方法中 message 字段的数据流

isSink方法搜索逻辑: 定义参数p,该参数p由被调用的 HelperBean 方法使用且该p参数名为message

isSouce方法搜索逻辑:由于不清楚哪里数据源最终经过该sink,所以直接使用source.asExpr()调用所有可能的表达式作为数据流.

import javaimport semmle.code.java.dataflow.FlowSourcesclass Config extends DataFlow::Configuration{ Config(){ this = "1" } override predicate isSource(DataFlow::Node source){ exists(source.asExpr()) } override predicate isSink(DataFlow::Node sink){ exists( Parameter p | p = sink.asParameter() and p.getCallable().getName() = "HelperBean" and p.getName() = "message"

搜索结果

Run Query

AbstractGroupRepositoriesApiResource#validateGroupMembers

Ql代码

现在就是需要确定 AbstractGroupRepositoriesApiResource#validateGroupMembers() 方法由哪里调用.

isSink方法搜索逻辑:定义参数p,该参数p由被调用的 validateGroupMembers 方法使用且该p参数名为request

isSouce方法搜索逻辑:这里souce原本是用Codeql自带 RemoteFlowSource 获取,但是发现并没有结果。所以这里直接用souce.asExpr()搜索全局表达式。

import javaimport semmle.code.java.dataflow.FlowSourcesclass Config extends DataFlow::Configuration{ Config(){ this = "1" } override predicate isSource(DataFlow::Node source){ exists(source.asExpr()) } override predicate isSink(DataFlow::Node sink){ exists( Parameter p | p = sink.asParameter() and p.getCallable().getName() = "validateGroupMembers" and p.getName() = "request" ) }}// 得到可能可控的函数

搜索结果

Run Query

其中 GolangGroupRepositoriesApiResource 就是该漏洞调用的可控点.

结语

原文有误,还请师傅们斧正。希望师傅们喜欢

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty分布式客户端接入流程初始化源码分析
下一篇:Gnome Shell- Gnome窗口管理程序
相关文章

 发表评论

暂时没有评论,来抢沙发吧~