漏洞描述
Atlassian Jira是澳大利亚Atlassian公司的一套缺陷跟踪管理系统。该系统主要用于对工作中各类问题、缺陷进行跟踪管理。
Atlassian Jira Server和Jira Data Center存在服务端模板注入漏洞,成功利用此漏洞的攻击者可在运行受影响版本的Jira Server或Jira Data Center系统上执行任意命令。
目前PoC已放出,建议受影响的客户尽快升级或采用临时缓解措施。
- 第一种情况,Jira服务端已配置好SMTP服务器,且“联系管理员表单”功能已开启(默认配置不开启);
- 第二种情况,Jira服务端已配置好SMTP服务器,且攻击者具有”JIRA管理员”的访问权限。
在第一种情况下,“联系管理员表单”功能开启的情况下,攻击者可以未经任何认证,通过向/secure/ContactAdministrators.jspa
发起请求利用此漏洞。
在第二种情况下,攻击者具有”JIRA 管理员”的访问权限下可通过/secure/admin/SendBulkMail!default.jspa
利用此漏洞。
漏洞简析
第二种利用场景前提是拿到Jira管理员的权限,利用条件较难满足,这里主要分析第一种情况。原因在于atlassian-jira/WEB-INF/classes/com/atlassian/jira/web/action/user/ContactAdministrators
未对Subject(邮件主题)处进行过滤,用户传入的邮件主题被当作template(模板)指令执行。
在任何一种情况下,成功利用此漏洞的攻击者都可在运行受影响版本的Jira Server或Jira Data Center的系统上执行任意命令。
第一种,未授权代码执行利用条件:
Jira已配置好SMTP服务器,且需开启“联系网站管理员表单”功能。(从WEB界面设计上看,实际上如果没配置SMTP服务器,无法开启此功能)
代码追踪
以Jira Server 7.13.0版本为例。
HTTP请求中的payload如何传入到服务端的subject对象中?
在com.atlassian.jira.config.webwork.JiraActionFactory$SafeParameterSettingActionFactoryProxy#getActionImpl
中调用setActionParameters
方法,通过
|
拿到HTTP请求的各个参数。
参考:https://docs.atlassian.com/DAC/javadoc/opensymphony-webwork/1.4-atlassian-17/reference/webwork/action/ActionContext.html
通过反射调用com.atlassian.jira.web.action.user.ContactAdministrators
对象的setSubject(java.lang.String)
方法,并将HTTP请求中的Subject参数传入进去。
设置完之后,com.atlassian.jira.web.action.user.ContactAdministrators
对象的subject属性已被设置成我们的payload。
payload如何传入到邮件对象的Subject中被Velocity模板引擎解析?
部分调用过程为:
|
看具体代码
|
在send方法中,遍历系统所有管理员账号,看是否存在已激活的管理员,若至少有一个(administrator.isActive()
),则传入该管理员对象,调用:this.sendTo(administrator)
。
|
在sendTo中,
|
com.atlassian.jira.mail.builder.EmailBuilder
对象
通过withSubject(this.subject)
方法传入用户指定的模板(template)命令,作为Subject(主题),
这里的payload是subjectTemplate,一个TemplateSource$Fragment
对象。
然后调用renderLater()
,在atlassian-jira/WEB-INF/classes/com/atlassian/jira/mail/builder/EmailBuilder
中,
|
将payload传入,得到一个com.atlassian.jira.mail.builder.EmailRenderer
对象,然后把这个EmailRender对象作为参数构造com.atlassian.jira.mail.builder.Email.RenderingMailQueueItem
对象。
而RenderingMailQueueItem继承了com.atlassian.mail.queue.SingleMailQueueItem
类。
在其构造器中,调用父类构造器
SingleMailQueueItem 又继承了AbstractMailQueueItem类。
至此,一个RenderingMailQueueItem
对象已经构造完成,
得到了一个com.atlassian.mail.queue.MailQueueItem
(这是一个接口)对象,然后将该对象加入到邮件发送队列com.atlassian.mail.queue.MailQueue
中。轮到这个对象对应的邮件发送时,才会渲染这个待发邮件的Subject(主题),所以可能会有一定的延迟。
邮件发送线程
在启动邮件队列的线程中,调用栈如下:
|
主要看前面三个,
|
在RenderingMailQueueItem
的send方法中,调用了EmailRender的render
方法
在atlassian-jira/WEB-INF/classes/com/atlassian/jira/mail/builder/EmailRenderer
中:
|
使用默认的模板引擎对payload(Velocity模板)进行解析。
注:我们的payload对象
subjectTemplate
是一个com.atlassian.jira.template.TemplateSource$Fragment
对象,通过之前的EmailRender的withSubject(this.subject)
方法传入。而EmailRender的subject私有成员变量是通过反射调用ContactAdministrators
的setSubject()
方法从HTTP请求中传入(前面已分析)。
先是getTemplatingEngine()
得到一个com.atlassian.jira.template.velocity.DefaultVelocityTemplatingEngine
对象,然后调用render()
方法:
调用applying
生成一个org.apache.velocity.VelocityContext
对象。
调用
|
其中fragment.getContent()就是我们的payload,传入进writeEncodedBodyForContent方法的第二个参数
再作为VelocityEngine#evaluate()的第四个参数,在操作系统上成功执行命令。
具体到Velocity的API调用栈可以在catalina日志里看到。
下图显示启动的计算器进程为Jira的子进程。
漏洞修复
下载7.13.5版本代码,对比atlassian-jira/WEB-INF/classes/com/atlassian/jira/web/action/user/ContactAdministrators.java
文件:
虽然用户输入的Subject为恶意payload,作为参数传进了atlassian-jira/WEB-INF/classes/com/atlassian/jira/web/action/user/ContactAdministrators
对象,
但是其subjectTemplate为硬编码的模板$subject
,并没有将用户传入的payload直接传入这里的withSubject方法。
于是无法在这里触发。
Demo
无需认证触发
实际触发时间可能为几秒到几十秒(终于录屏到一个快的作为演示…)
后台管理员权限触发
缓解措施
若无法及时升级Jira,可采取以下缓解措施:
- 1、禁用”联系网站管理员“功能。
设置=> 系统=> 编辑设置=> 联系管理员表单处选择“关”,然后点击最下面的“更新”保存设置。具体操作方式参考:https://confluence.atlassian.com/adminjiraserver/configuring-the-administrator-contact-form-974375905.html#Configuringtheadministratorcontactform-DisablingtheContactAdministratorsForm
验证生效方法:访问/secure/ContactAdministrators!default.jspa
出现:“您的Jira管理员尚未配置此联系表。”或“Your Jira administrator has not yet configured this contact form”。
- 2、并且,禁止对
/secure/admin/SendBulkMail!default.jspa
的访问。
参考
- https://confluence.atlassian.com/jira/jira-security-advisory-2019-07-10-973486595.html
- https://jira.atlassian.com/browse/JRASERVER-69532