关注公众号回复“漏洞”获取研究环境或工具
引言
最近看到网上有人发表关于BeanValidation JSR 380 EL表达式注入漏洞的分析文章,在历史上爆出的相关漏洞中,比较有名的包括Nexus Repository Manager CVE-2018-16621以及后来的绕过漏洞CVE-2020-10693/CVE-2020-10204等,这几个漏洞网上高质量的分析文章已经很多了,这里再啰嗦一遍意义不大,下面将今年爆出的另一个BeanValidation JSR 380 漏洞分享给大家。
OneDev 是一个国产的类GitLab开源DevOps平台,可以作为GitLab的替代品。在翻阅代码更新时,发现一个BeanValidation JSR 380漏洞信息:
漏洞分析
OneDev采用BeanValidation方式对HTTP请求的参数进行验证。比如在`io.onedev.server.rest.ProjectResource`中:
在GET处理方式中存在`@ValidQueryParams`的装饰器,主要用于对参数进行格式检查:
引入名为`ValidQueryParamsValidator`的验证器,即请求必须通过`ValidQueryParamsValidator`进行格式检查:
提取请求的参数带入`buildConstraintViolationWithTemplate`,按照JSR 380规范,如果参数符合EL表达式格式,将会对其进行插值导致出现EL表达式解析。构造请求进行调试验证:
触发了漏洞。调用栈如下:
修复方式
BeanValidation JSR 380 EL表达式注入漏洞其中一种有效的修复方式是禁止使用EL插值,OneDev官方就是采用的这种方法,补丁对比如下:
显式注册一个`ParameterMessageInterpolator`参数来覆盖默认的EL插值。
参考
https://securitylab.github.com/advisories/GHSL-2020-020-hibernate-validator/
https://beanvalidation.org/2.0/spec/
https://xz.aliyun.com/t/10693
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
关注公众号回复“漏洞”获取研究环境或工具
原文始发于微信公众号(且听安全):【经典回顾系列】BeanValidation JSR 380 EL表达式注入漏洞之OneDev Pre-Auth RCE