360-CERT [360CERT](javascript:void(0) 今天
2020年04月02日, 360CERT监测发现 Sonatype Security Team 官方发布了一则关于
Nexus Repository Manager 3.x 的远程代码执行漏洞通告。在通过认证的情况下,攻击者可以通过JavaEL表达式注入造成远程代码执行。
Nexus Repository 是一个开源的仓库管理系统,在安装、配置、使用简单的基础上提供了更加丰富的功能。
由于官方没有交代任何漏洞细节,于是需要我们diff 3.21.1版本和3.21.2版本,经过diff,
发现利用点(这里只讨论rce相关,不讨论xss)。在org.sonatype.nexus.common.template.EscapeHelper
的stripJavaEl
方法。
这样一看,就是一个CVE-2018-16621
的bypass
了,那么漏洞的构造也比较简单,依照着补丁来构造,就是利用\A
来绕过,这里的A
其实可以是任意字符。
在org.sonatype.nexus.validation.ConstraintViolationFactory$HelperValidator
。
漏洞触发的主要原因是在 org.sonatype.nexus.security.privilege.PrivilegesExistValidator
或 org.sonatype.nexus.security.role.RolesExistValidator
类中,会对不存在的 privilege
或 role
抛出错误,而在错误信息抛出的时候,会存在一个el
表达式的渲染,会提取其中的el
表达式并执行,从而造成el
表达式注入。
来看一看对role
的检测,这里会调用role
的validator
。
在org.sonatype.nexus.security.role.RolesExistValidator
的isValid
方法。
如果当前Manager
不存在该role
,就会抛出错误,首先进行stripJavaEl
的调用。
将不存在的role
add
进missing
这个List
里面,
然后一路return
到
org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree
的
validateConstraints
方法。对validate
进行验证。
messageTemplate
就是missing
里的内容,然后调用interpolate
方法。继续跟进,
this.validatorScopedContext.getMessageInterpolator()
返回ResourceBundleMessageInterpolator
对象,跟进interpolateMessage
。
处理missing
的message
。
跟入interpolateExpression
,这里while
循环处理tokenIterator
。
当token获取到{100*100}
时,跟入interpolate
。
实例化InterpolationTerm
。
调用栈比较复杂,取了部分。
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)...
该漏洞的最终触发是通过给HelperBean
的message
进行el
表达式注入,从而抛出错误
看到
org.sonatype.nexus.repository.golang.rest.GolangGroupRepositoriesApiResource
类,根据request
调用createRepository
。
跟入父类,也就是
org.sonatype.nexus.repository.rest.api.AbstractGroupRepositoriesApiResource
的createRepository
方法。
接着跟入validateGroupMembers
。
在org.sonatype.nexus.validation.ConstraintViolationFactory
。 这里会实例化HelperBean
,message
即为el
注入的内容。 之后会对HelperBean
进行判断,调用isValid
,调用buildConstraintViolationWithTemplate
给messageTemplates
进行赋值,最后执行el表达式方式跟CVE-2020-10204
部分一致。
0x04 产品侧解决方案
360安全大脑的QUAKE资产测绘平台通过资产测绘技术手段,对该类 漏洞/事件 进行监测,请用户联系相关产品区域负责人获取对应产品。
2020-03-31 Sonatype官方发布通告
2020-04-02 360CERT发布预警
2020-04-07 360CERT发布分析
转载自https://mp.weixin.qq.com/s/KP-O38uZCRq7SY7S48L_sw