利用范围
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函数直接触发传入的命令,造成命令执行。如下:
完结