CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析
2020-04-07 16:57

报告编号:B6-2020-040701

报告来源:360-CERT

报告作者:Hu3sky

更新日期:2020-04-07

0x01 漏洞背景

2020年04月02日, 360CERT监测发现 Sonatype Security Team 官方发布了一则关于 Nexus Repository Manager 3.x 的远程代码执行漏洞通告。在通过认证的情况下,攻击者可以通过JavaEL表达式注入造成远程代码执行。

Nexus Repository 是一个开源的仓库管理系统,在安装、配置、使用简单的基础上提供了更加丰富的功能。

0x02 漏洞定位

由于官方没有交代任何漏洞细节,于是需要我们自行diff 3.21.1版本和3.21.2版本,经过diff,发现利用点(这里只讨论rce,不讨论xss)。 在org.sonatype.nexus.common.template.EscapeHelperstripJavaEl方法。 这样一看,就是一个CVE-2018-16621bypass了,那么漏洞的构造也比较简单,依照着补丁来构造,就是利用\A来绕过,这里的A可以是任意字符。

CVE-2020-10199

Helper Bean检测增加stripJavaEl方法

org.sonatype.nexus.validation.ConstraintViolationFactory$HelperValidator

0x03 CVE-2020-10204(需要管理员权限)

漏洞分析

漏洞触发的主要原因是在 org.sonatype.nexus.security.privilege.PrivilegesExistValidatororg.sonatype.nexus.security.role.RolesExistValidator 类中,会对不存在的 privilegerole 抛出错误,而在错误信息抛出的时候,会存在一个el表达式的渲染,会提取其中的el表达式并执行,从而造成el表达式注入。

来看一看对role的检测,这里会调用rolevalidator。 在org.sonatype.nexus.security.role.RolesExistValidatorisValid方法。 在这里对role进行检测。 如果当前Manager不存在该role,就会抛出错误,首先进行stripJavaEl的调用。

el表达式执行

将不存在的role addmissing这个List里面,然后一路returnorg.hibernate.validator.internal.engine.constraintvalidation.ConstraintTreevalidateConstraints方法,对validate进行验证。 跟进addConstraintFailure messageTemplate就是missing里的内容,然后调用interpolate方法。 继续跟进, this.validatorScopedContext.getMessageInterpolator()返回ResourceBundleMessageInterpolator对象,跟进interpolateMessage 处理missingmessageenter description here enter description here 跟入interpolateExpression,这里while循环处理tokenIterator 当token获取到{100*100}时,跟入interpolate 实例化InterpolationTerm

然后实例化ElTermResolver

最后返回执行结果。

调用栈比较复杂,取了部分。

interpolate:79, ElTermResolver (org.hibernate.validator.internal.engine.messageinterpolation)
interpolate:64, InterpolationTerm (org.hibernate.validator.internal.engine.messageinterpolation)
interpolate:112, ResourceBundleMessageInterpolator (org.hibernate.validator.messageinterpolation)
interpolateExpression:451, AbstractMessageInterpolator (org.hibernate.validator.messageinterpolation)
interpolateMessage:347, AbstractMessageInterpolator (org.hibernate.validator.messageinterpolation)
interpolate:286, AbstractMessageInterpolator (org.hibernate.validator.messageinterpolation)
interpolate:313, AbstractValidationContext (org.hibernate.validator.internal.engine.validationcontext)
addConstraintFailure:230, AbstractValidationContext (org.hibernate.validator.internal.engine.validationcontext)
addConstraintFailure:38, ParameterExecutableValidationContext (org.hibernate.validator.internal.engine.validationcontext)
validateConstraints:79, ConstraintTree (org.hibernate.validator.internal.engine.constraintvalidation)
doValidateConstraint:130, MetaConstraint (org.hibernate.validator.internal.metadata.core)
validateConstraint:123, MetaConstraint (org.hibernate.validator.internal.metadata.core)
validateMetaConstraint:555, ValidatorImpl (org.hibernate.validator.internal.engine)
validateMetaConstraints:537, ValidatorImpl (org.hibernate.validator.internal.engine)
validateConstraintsForNonDefaultGroup:529, ValidatorImpl (org.hibernate.validator.internal.engine)
validateConstraintsForCurrentGroup:447, ValidatorImpl (org.hibernate.validator.internal.engine)
validateInContext:400, ValidatorImpl (org.hibernate.validator.internal.engine)
validateCascadedAnnotatedObjectForCurrentGroup:629, ValidatorImpl (org.hibernate.validator.internal.engine)
validateCascadedConstraints:590, ValidatorImpl (org.hibernate.validator.internal.engine)
validateParametersInContext:880, ValidatorImpl (org.hibernate.validator.internal.engine)
validateParameters:283, ValidatorImpl (org.hibernate.validator.internal.engine)
validateParameters:235, ValidatorImpl (org.hibernate.validator.internal.engine)
validateParameters:65, ValidationInterceptor (org.sonatype.nexus.validation.internal)
invoke:51, ValidationInterceptor (org.sonatype.nexus.validation.internal)
proceed:77, InterceptorStackCallback$InterceptedMethodInvocation (com.google.inject.internal)
proceed:49, AopAllianceMethodInvocationAdapter (org.apache.shiro.guice.aop)
invoke:68, AuthorizingAnnotationMethodInterceptor (org.apache.shiro.authz.aop)
invoke:36, AopAllianceMethodInterceptorAdapter (org.apache.shiro.guice.aop)
proceed:77, InterceptorStackCallback$InterceptedMethodInvocation (com.google.inject.internal)
proceed:49, AopAllianceMethodInvocationAdapter (org.apache.shiro.guice.aop)
invoke:68, AuthorizingAnnotationMethodInterceptor (org.apache.shiro.authz.aop)
invoke:36, AopAllianceMethodInterceptorAdapter (org.apache.shiro.guice.aop)
proceed:77, InterceptorStackCallback$InterceptedMethodInvocation (com.google.inject.internal)
intercept:55, InterceptorStackCallback (com.google.inject.internal)
update:-1, UserComponent$$EnhancerByGuice$$a4c055e (org.sonatype.nexus.coreui)
invoke:-1, GeneratedMethodAccessor615 (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invokeJavaMethod:142, DispatcherBase (com.softwarementors.extjs.djn.router.dispatcher)
invokeMethod:133, DispatcherBase (com.softwarementors.extjs.djn.router.dispatcher)
invokeMethod:82, ExtDirectDispatcher (org.sonatype.nexus.extdirect.internal)
dispatch:63, DispatcherBase (com.softwarementors.extjs.djn.router.dispatcher)
dispatchStandardMethod:73, StandardRequestProcessorBase (com.softwarementors.extjs.djn.router.processor.standard)
processIndividualRequest:502, JsonRequestProcessor (com.softwarementors.extjs.djn.router.processor.standard.json)
processIndividualRequestsInThisThread:150, JsonRequestProcessor (com.softwarementors.extjs.djn.router.processor.standard.json)
process:133, JsonRequestProcessor (com.softwarementors.extjs.djn.router.processor.standard.json)
processJsonRequest:83, RequestRouter (com.softwarementors.extjs.djn.router)
processRequest:632, DirectJNgineServlet (com.softwarementors.extjs.djn.servlet)
...

0x04 CVE-2020-10199

该漏洞的最终触发是通过给HelperBeanmessage进行el表达式注入,从而抛出错误

漏洞利用

普通用户触发。 enter description here

漏洞分析

看到org.sonatype.nexus.repository.golang.rest.GolangGroupRepositoriesApiResource类,根据request调用createRepository

跟入父类,也就是org.sonatype.nexus.repository.rest.api.AbstractGroupRepositoriesApiResourcecreateRepository方法。

接着跟入validateGroupMembers

org.sonatype.nexus.validation.ConstraintViolationFactoryenter description here 这里会实例化HelperBeanmessage即为el注入的内容。 enter description here 之后会对HelperBean进行判断,调用isValid,调用buildConstraintViolationWithTemplatemessageTemplates进行赋值,最后执行el表达式方式跟CVE-2020-10204部分一致。 enter description here

0x05 产品侧解决方案

360城市级网络安全监测服务

360安全大脑的QUAKE资产测绘平台通过资产测绘技术手段,对该类 漏洞/事件 进行监测,请用户联系相关产品区域负责人获取对应产品。

0x06 时间线

2020-03-31 Sonatype官方发布通告

2020-04-02 360CERT发布预警

2020-04-07 360CERT发布分析报告

0x07 参考链接

  1. https://support.sonatype.com/hc/en-us/articles/360044882533
  2. CVE-2020-10199: Nexus Repository Manager代码执行通告