Apache Submarine 信息泄露漏洞
项目介绍
Apache Submarine(简称 Submarine)是一个端到端的机器学习平台,允许数据科学家创建端到端的机器学习工作流。在Submarine上,数据科学家可以完成 ML 模型生命周期的每个阶段,包括数据探索、数据管道创建、模型训练、服务和监控。
项目地址
https://github.com/apache/submarine
https://submarine.apache.org/zh-cn/
漏洞概述
Apache Submarine的submarine-server模块存在未授权访问漏洞,该漏洞源于submarine-server模块全部RestApi未添加认证或授权机制。以/api/sys/user/list接口为例,攻击者无需认证即可通过queryPageList方法获取系统全部用户的md5加密后的密文密码(可破解)、手机号、邮箱等敏感信息。
影响版本
Apache Submarine <= rel/release-0.7.0
环境搭建
源码下载地址:
https://github.com/apache/submarine/tags
官方部署文档:
https://submarine.apache.org/zh-cn/docs/gettingStarted/quickstart
1、准备环境
Centos7 | 8G内存 |
---|---|
Docker | 无版本要求 |
Kubernetes | 1.15.x - 1.21.x |
kubectl | 1.15.x - 1.21.x |
helm | v3 |
minikube | Latest |
2、启动 minikube 集群
minikube start --vm-driver=docker --cpus 8 --memory 4096 --kubernetes-version v1.21.2
3、克隆项目,通过 helm chart 安装 submarine operator 和依赖
①:Clone the project
git clone https://github.com/apache/submarine.git
②:Install the submarine operator and dependencies by helm chart
cd submarine
helm install submarine ./helm-charts/submarine
③:Create a Submarine custom resource and the operator will create the submarine server, database, etc. for us.
kubectl apply -f submarine-cloud-v2/artifacts/examples/example-submarine.yaml
4、使用kubectl查询pod的状态,确保每个pod都成功Running
kubectl get pods
5、暴露submarine的Web服务,并通过浏览器访问Web页面。
kubectl port-forward --address 192.168.108.153 service/submarine-traefik 32080:80
浏览器访问Web页面:http://192.168.108.153:32080
漏洞分析
1、下载Apache Submarine 源代码,使用IDEA打开。
使用maven进行依赖编译。
2、进入submarine-server模块,查看存在未授权访问的API接口。
以/api/sys/user/list接口为例,通过查看源码发现该接口未添加认证机制/权限校验,导致无需认证即可执行queryPageList方法获取系统全部用户的用户实体类信息,包括md5加密后的用户密码(可破解)、手机号、邮箱等。
漏洞复现
无需任何身份认证,浏览器中直接访问 http://192.168.108.153:32080/api/sys/user/list 即可获取系统敏感信息。
Apache Submarine 信息泄露导致任意用户密码重置漏洞
项目介绍
已省略,请参考上文内容。
项目地址
https://github.com/apache/submarine
https://submarine.apache.org/zh-cn/
漏洞概述
Apache Submarine的submarine-server模块存在任意用户密码重置漏洞。该漏洞源于SysUserRestApi的changePassword接口未校验传入用户id值是否属于当前用户,同时未对原始密码进行校验。更严重的是该接口可未授权访问,并且上文中已知api/sys/user/list接口可未授权访问获取系统全部用户的id值字段,导致攻击者无需身份认证即可重置系统任意用户的密码信息。
影响版本
Apache Submarine <= rel/release-0.7.0
环境搭建
已省略,请参考上文内容。
漏洞分析
进入submarine-server模块,定位到存在缺陷的文件。
缺陷文件路径:
submarine-rel-release-0.7.0\submarine-server\server-core\src\main\java\org\apache\submarine\server\rest\workbench\SysUserRestApi.java#changePassword
重置用户密码接口changePassword,参数sysUser可控。
跟进到userService.changePassword
继续跟进到userMapper.changePassword,接着跟进到SysUserMapper.xml。发现整个流程中存在如下缺陷:
①:未判断传入的user是否属于当前用户
②:未校验用户原来的密码,直接将password 的值替换成了新的。
综上两点,证明该方法存在任意用户密码重置漏洞。
漏洞复现
1、访问http://192.168.108.153:32080/user/login登录系统。
Admin用户的初始密码官方文档中没有给出,可通过点击登录页面的
Forgot password——>Already have an account? Sign-In 强行进入系统。
2、进入系统的Manage—>user模块,点击Add User添加1-2个测试用户。
3、打开Burpsuite的抓包代理,重置admin的密码并获取到数据包。
输入您要设置的新密码,例如123456,接下来您就可以使用admin/123456登录系统了,无法再利用第一步中的方法强行登陆。
Burpsuite获取到数据包如下:
Id:用户实体表中的id字段,值固定。
Password:md5加密后的格式,例如e10adc3949ba59abbe56e057f20f883e对应123456
可以看出,重置密码的过程中未校验原始密码。
那么,id的值是否可控呢?结合之前代码审计的成果,已知 /api/sys/user/list接口存在未授权访问漏洞,因此可以零权限拿到系统全部用户的id值。
如下图所示:
Admin的id:e9ca23d68d884d4ebb19d07889727dae
Test的id:d605edfd7c8711ed82b80242ac110009
接下来是漏洞证明:
将上述数据包发送到Burpsuite的Repeater模块,替换id的值为其它用户的,例如test(d605edfd7c8711ed82b80242ac110009)。利用md5生成器生成一个密码,如下图:
构造数据包如下:
尝试test/test123456登录系统,登陆成功,漏洞复现完成。