項目介紹
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
漏洞複現
- 官方文檔中建構的docker預設使用者是"User" : "nobody:nogroup"是以需要修改使用者權限為root,修改方式為在docker-compose檔案中添加user: "0:0"
- 上傳測試檔案到靜态資源目錄
- 上傳成功
漏洞分析
首先檢視官方更新檔發現修改了多處檔案,其中比較核心的是對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