亿格云科技发现ZStack高危RCE漏洞 获得ZStack官方致谢

漏洞预警 2年前 (2021) admin
900 0 0

亿格云科技发现ZStack高危RCE漏洞 获得ZStack官方致谢

ZStack是一个开源的基础架构即服务的软件,用于管理数据中心中的计算、网络、存储等资源。
该漏洞影响ZStack 4.2.2,4.3.0之前的所有版本,建议用户升级到最新版本。
在2021年6月8日,ZStack修复了一个由Github Security Team报告的授权RCE漏洞 CVE-2021-32829。
该漏洞是由于ZStack对于其中一个暴露的REST接口中接受的Groovy script的过滤不严格导致的。我们在审计了该漏洞的修复补丁之后,发现了一种新的利用方式。


漏洞分析:

该暴露的REST接口接受用户传入的任意Groovy script脚本,使用了一个Sandbox来防止用户输入恶意的Groovy脚本,其中Sandbox的处理使用了开源的第三方库groovy-sandbox,利用GroovyInterceptor来拦截Groovy脚本整个执行过程中的各个阶段,设置了一个允许的类的白名单。在方法调用的过程中进行检查。
 static class SandBox extends GroovyInterceptor {        static List<Class> RECEIVER_WHITE_LIST = [                Number[].class,                Number.class,                long[].class,                long.class,                int[].class,                int.class,                short[].class,                short.class,                double[].class,                double.class,                float[].class,                float.class,                String[].class,                String.class,                Date[].class,                Date.class,                Map.class,                Collection.class,                Script.class,                Enum[].class,                Enum.class        ]
static void checkReceiver(Object obj) { checkReceiver(obj.getClass()) }
static void checkReceiver(Class clz) { for (Class wclz : RECEIVER_WHITE_LIST) { if (wclz.isAssignableFrom(clz)) { return } }
throw new Exception("invalid operation on class[${clz.name}]") }
static void checkMethod(String method) { if (method == "sleep") { throw new Exception("invalid operation[${method}]") } }
Object onMethodCall(GroovyInterceptor.Invoker invoker, Object receiver, String method, Object... args) throws Throwable { checkReceiver(receiver) checkMethod(method) return super.onMethodCall(invoker, receiver, method, args) }
Object onStaticCall(GroovyInterceptor.Invoker invoker, Class receiver, String method, Object... args) throws Throwable { checkReceiver(receiver) checkMethod(method) return super.onStaticCall(invoker, receiver, method, args) } ....... }
Github Security Team 利用Groovy的AST转换注释@ASTTest进行绕过,由于Groovy-Sandbox的原理是对脚本在编译期进行转换,并没有对注释做任何的处理,所以也无法拦截到在AST处理阶段进行执行的@ASTTest注释。这种攻击思路来源于2019攻击Jekins的利用手法。
官方的修补方案是增加了一个RejectASTTransformsCustomizer,禁用了一些常见的敏感注释如@ASTTest,@Grab,这个修补方案也是之前Jekins的漏洞的修补手段,想要在这个思路上面尝试绕过的难度比较大。
所以我们回到Groovy-Sandbox的原理上,新增一个测试类,把运行过程中受到Groovy-Sandbox保护而生成的Script的类反编译出来。

亿格云科技发现ZStack高危RCE漏洞 获得ZStack官方致谢

可以分析出:Groovy-Sandbox在编译期进行分析,修改掉原始的脚本代码,并插入自己的保护代码。这样在脚本运行的时候就可以防止恶意代码的执行。这个原理和RASP比较类似,但是不同的是,RASP的拦截点不在业务代码本身,而在于底层的JVM级别的,而Groovy-Sandbox的拦截点是取决于编译期间的业务代码,也就是其实他只能防御住最外层的恶意代码执行。
我们再回过头审计ZStack这个类型白名单,发现一个很可疑的类:Script.class,并且可以注意到,在check白名单判断的时候用的是isAssignableFrom方法,这就意味着我们可以使用任意的Script类的子类。结合上面所说的Groovy-Sandbox只能防御住最外层的恶意代码执行,我们只需要找到一个Script的子类进行二次Script执行,就可以绕过所有的过滤。由于Script本身就具有eval脚本的能力,所以这种类型是非常好找的,在测试里用的是groovy.ui.ConsoleView。


修补方案:

官方将Script.class 从白名单中进行了移除


时间线:

2021年9月24日 亿格云科技向ZStack官方报告了该漏洞

2021年10月27日 ZStack官方合并补丁到主分支

2021年11月15日 ZStack官方发布公告,公开致谢亿格云科技


相关链接:

https://securitylab.github.com/advisories/GHSL-2021-065-zstack/

https://github.com/zstackio/zstack/security/advisories/GHSA-99wx-p6w8-3hg8

原文始发于微信公众号(亿格云科技):亿格云科技发现ZStack高危RCE漏洞 获得ZStack官方致谢

版权声明:admin 发表于 2021年11月22日 下午1:09。
转载请注明:亿格云科技发现ZStack高危RCE漏洞 获得ZStack官方致谢 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...