利用范围
Spark Core - Apache <=3.0.3
3.1.1 <= Spark Core - Apache <=3.1.2
3.2.0 <= Spark Core - Apache <=3.2.1
环境搭建
修改bin目录下的spark-shell
修改如下,添加调试端口

变动如上

然后启动
./spark-shell --conf spark.acls.enable=true

即可访问到如上页面
漏洞复现
然后输入poc
在url后拼接
?doAs=command
如下命令:
?doAs=`touch /tmp/1.txt`

成功RCE
补丁对比

如上所示,使用命令拼接且没有做任何处理,而在修复的版本中直接删除了ShellBasedGroupsMappingProvider函数中对bash的调用。
远程调试

Apche spark启用了ACL之后,会通过HttpSecurityFilter这个filter进行权限校验
那么我们将断点打在org.apache.spark.ui.HttpSecurityFilter#doFilter函数处
然后我们访问

如下

可以看到代码逻辑,在进入doFilter函数之后,首先会提取参数“doAs”的值,然后赋值给effectiveUser,进入org.apache.spark.SecurityManager#checkUIViewPermissions函数。

继续跟进isUserInACL

user被getCurrentUserGroups调用,进入getCurrentUserGroups中

username被getGroups调用,那么进入getGroups中

username被getUnixGroups调用,那么进入getUnixGroups中

在这里username进行了拼接处理,因为我们传入的username参数可控,便形成了命令注入。后续将通过executeAndGetOutput函数直接触发传入的命令,造成命令执行。如下:

完结
1457

被折叠的 条评论
为什么被折叠?



