项目介绍
Apache Fineract 是一个开源的系统,用于核心银行系统平台化建设。为创业者、金融机构和服务提供商提供了一个可靠、健壮的、可负担得起的金融服务解决方案。
项目地址
https://github.com/apache/fineract
漏洞概述
Apache Fineract 在 1.8.1 之前的版本中由于 FileSystemContentRepository.java 类对用户传入的文件路径名限制不当从而存在路径遍历漏洞,经过身份验证的攻击者可利用此漏洞删除或覆盖系统文件,Fineract 加载攻击者上传的恶意文件时将远程执行恶意代码。
影响版本
apache/fineract@(-∞, 1.8.1)
环境搭建
参考官方文档,使用docker-compose搭建
https://github.com/apache/fineract
漏洞复现
1、 官方文档中构建的docker默认用户是"User" : "nobody:nogroup"因此需要修改用户权限为root,修改方式为在docker-compose文件中添加user: "0:0"
2、上传测试文件到静态资源目录
3.、上传成功
漏洞分析
首先查看官方补丁发现修改了多处文件,其中比较核心的是对FileSystemContentRepository.java的修改,在patch代码中对传入敏感函数的文件路径进行了过滤,这些函数有deleteFileInternal、fetchFile、writeFileToFileSystem
在对上传文件的路径进行校验的同时,也使用白名单的方式检查了上传文件的类型
看完补丁再分析下调用链。Fineract项目的组织方式跟普通spingboot项目不太一样,Fineract的模块都是按目录放到一起的。存在漏洞的模块是documentmanagement,代码组织方式如下:
分析代码发现api入口点如下:
org.apache.fineract.infrastructure.documentmanagement.api.ImagesApiResource#updateClientImage(java.lang.String, java.lang.Long, java.lang.Long, java.io.InputStream, FormDataContentDisposition, FormDataBodyPart)
调用了addNewClientImage方法
忽略不重要步骤,最终上传的文件被writeFileToFileSystem处理,而该函数就是patch修复的函数之一
修复方式
升级到1.8.1版本(包含)以上
参考链接
https://nvd.nist.gov/vuln/detail/CVE-2022-44635
https://github.com/apache/fineract/commit/90f854b68886458a466b048807c26ccf31a6f555