CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析

360-CERT [360CERT](javascript:void(0) 今天

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第1张图片

0x00 漏洞背景

2020年04月02日, 360CERT监测发现 Sonatype Security Team 官方发布了一则关于

Nexus Repository Manager 3.x 的远程代码执行漏洞通告。在通过认证的情况下,攻击者可以通过JavaEL表达式注入造成远程代码执行。

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

0x01 漏洞定位

由于官方没有交代任何漏洞细节,于是需要我们diff 3.21.1版本和3.21.2版本,经过diff,

发现利用点(这里只讨论rce相关,不讨论xss)。在org.sonatype.nexus.common.template.EscapeHelperstripJavaEl方法。

img这样一看,就是一个CVE-2018-16621bypass了,那么漏洞的构造也比较简单,依照着补丁来构造,就是利用\A来绕过,这里的A其实可以是任意字符。

CVE-2020-10199

Helper Bean检测增加stripJavaEl方法

org.sonatype.nexus.validation.ConstraintViolationFactory$HelperValidator
CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第2张图片

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

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第3张图片

漏洞分析

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

来看一看对role的检测,这里会调用rolevalidator

org.sonatype.nexus.security.role.RolesExistValidatorisValid方法。

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第4张图片在这里对role进行检测。

img如果当前Manager不存在该role,就会抛出错误,首先进行stripJavaEl的调用。
img将不存在的role addmissing这个List里面,

然后一路return

org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree

validateConstraints方法。对validate进行验证。

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第5张图片跟进addConstraintFailure方法。

imgmessageTemplate就是missing里的内容,然后调用interpolate方法。继续跟进,
CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第6张图片
this.validatorScopedContext.getMessageInterpolator()返回ResourceBundleMessageInterpolator对象,跟进interpolateMessage
CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第7张图片处理missingmessage
CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第8张图片CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第9张图片跟入interpolateExpression,这里while循环处理tokenIterator

img当token获取到{100*100}时,跟入interpolate
img实例化InterpolationTerm

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第10张图片然后实例化ElTermResolver

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第11张图片最后返回执行结果。
img

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

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)...

0x03 CVE-2020-10199

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

漏洞利用

普通用户触发。 CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第12张图片

漏洞分析

看到

org.sonatype.nexus.repository.golang.rest.GolangGroupRepositoriesApiResource类,根据request调用createRepositoryCVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第13张图片

跟入父类,也就是

org.sonatype.nexus.repository.rest.api.AbstractGroupRepositoriesApiResourcecreateRepository方法。

img

接着跟入validateGroupMembers

CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第14张图片

org.sonatype.nexus.validation.ConstraintViolationFactoryimg 这里会实例化HelperBeanmessage即为el注入的内容。 img之后会对HelperBean进行判断,调用isValid,调用buildConstraintViolationWithTemplatemessageTemplates进行赋值,最后执行el表达式方式跟CVE-2020-10204部分一致。 CVE-2020-10204/CVE-2020-10199: Nexus Repository Manager3 分析_第15张图片

0x04 产品侧解决方案

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 [https://support.sonatype.com/hc/en-us/articles/360044882533]
  2. CVE-2020-10199: Nexus Repository Manager代码执行通告 [https://cert.360.cn/warning/detail?id=8b0bd22d31e831fc8f9fb6ec245c21e7]

转载自https://mp.weixin.qq.com/s/KP-O38uZCRq7SY7S48L_sw

你可能感兴趣的:(cve漏洞分析精选)