这是一个需要身份验证的 Atlassian Confluence 远程代码执行漏洞(详情请见:nvd.nist.gov/vuln/detail…
快速分析:
为了快速定位问题,我下载了两个版本的 Confluence 进行代码比对,并迅速找到了关键的变更点:
在 RhinoLanguageParser
类中,Context.initStandardObjects
被修改为了 Context.initSafeStandardObjects
。
通过简单的搜索,我了解到如果 RhinoLanguageParser
使用 initStandardObjects
方法,并且我们能够控制 cx.evaluateString
调用中的 script
变量(类似于 ScriptEngine),就可能导致远程代码执行:
cx.evaluateString(scope, script, "ParserScript", 0, (Object)null);
经过追踪,我找到了漏洞的源头(source)和汇聚点(sink):
- 源头 (Source):
com.atlassian.confluence.ext.code.config.ConfigureNewcodeAction#addLanguage
com.atlassian.confluence.ext.code.languages.impl.RegisteredLanguageInstallerImpl#installLanguage
- 过程:
com.atlassian.confluence.ext.code.languages.impl.RhinoLanguageParser#parseRegisteredLanguage
- 汇聚点 (Sink):
com.atlassian.confluence.ext.code.languages.impl.RhinoLanguageParser#parseLanguage
关键在于,script
变量的内容是可控的!
PoC(概念验证):
我这里提供一个简单的 PoC 思路,具体的实现就留给各位读者自行探索了。
总结:
这个漏洞的根本原因在于,Confluence 在处理自定义语言时,使用了不安全的 Rhino 脚本引擎,并且允许经过身份验证的用户控制脚本内容。攻击者可以利用这个漏洞,在 Confluence 服务器上执行任意代码,从而完全控制服务器。
希望这个分析对大家有所帮助!请务必尽快修复此漏洞,以避免潜在的风险。