报告编号: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.EscapeHelper
的stripJavaEl
方法。
这样一看,就是一个
CVE-2018-16621
的bypass
了,那么漏洞的构造也比较简单,依照着补丁来构造,就是利用\A
来绕过,这里的A
可以是任意字符。
CVE-2020-10199
Helper Bean检测增加stripJavaEl方法
在org.sonatype.nexus.validation.ConstraintViolationFactory$HelperValidator
0x03 CVE-2020-10204(需要管理员权限)
漏洞分析
漏洞触发的主要原因是在
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
方法。
在这里对
role
进行检测。
如果当前
Manager
不存在该role
,就会抛出错误,首先进行stripJavaEl
的调用。
el表达式执行
将不存在的role
add
进missing
这个List
里面,然后一路return
到
org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree
的validateConstraints
方法,对validate
进行验证。
跟进
addConstraintFailure
messageTemplate
就是missing
里的内容,然后调用interpolate
方法。
继续跟进,
this.validatorScopedContext.getMessageInterpolator()
返回ResourceBundleMessageInterpolator
对象,跟进interpolateMessage
。
处理
missing
的message
。
跟入
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
该漏洞的最终触发是通过给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
部分一致。
0x05 产品侧解决方案
360城市级网络安全监测服务
360安全大脑的QUAKE资产测绘平台通过资产测绘技术手段,对该类 漏洞/事件 进行监测,请用户联系相关产品区域负责人获取对应产品。
0x06 时间线
2020-03-31 Sonatype官方发布通告
2020-04-02 360CERT发布预警
2020-04-07 360CERT发布分析报告