CVE-2022-25237 Bonitasoft Platform 從認證繞過到未公開反序列化漏洞發現之旅
漏洞信息
Bonitasoft 從 Dockerhub 下載超過 500 萬次,它是一個業務自動化平臺,可以更輕松地在業務流程中構建、部署和管理自動化應用程序。
CVE-2022-25237 Bonitasoft Platform 存在 Auth AP I認證繞過漏洞,通過精心構造 payload 發送到特殊功能的 API URL,可導致遠程代碼執行。受影響版本如下:
For community(社區版):
- 2022.1-u0 (7.14.0) 以下
For subscription(訂閱版):
- 2022.1-u0 (7.14.0) 以下
- 2021.2-u4 (7.13.4) 以下
- 2021.1-0307 (7.12.11) 以下
- 7.11.7 以下
在分析認證繞過漏洞時,還發現了一處潛藏的未公開反序列化漏洞。下面將完整分析過程共享給大家。
環境準備
使用 docker 運行對應版本鏡像。查看 Java 進程:

添加遠程調試配置:

重啟容器,查看是否開啟 5000 調試端口,開放成功后配置 idea 指定調試端口:

補丁對比
對比 `bonita:7.13.0` 和 `bonita:7.14.0` 版本,發現`bonita:7.14.0` 中刪除了 `AbstractAuthorizationFilter` 類,該文件中包含 `Filter` 權限認證繞過邏輯:

通過補丁對比,在 `web.xml` 中發現還增加了一處認證配置:

這個配置主要是為 `/serverAPI/` 路由添加 `BASIC` 認證。
認證繞過漏洞
補丁分析中講到,最新版的軟件已經將 `AbstractAuthorizationFilter` 刪掉,那么在 `AbstractAuthorizationFilter` 代碼中明確指出了哪些路由不需要 `session`,在漏洞分析的時候主要關注 `isMatched` 賦值為 `true` 的那一行。`requestURL` 為用戶請求的 `URL`, `contains` 只是簡單匹配了路由是否包含 `excludePatterns`:

其中 `excludePatterns` 在配置文件中賦值:


上面3個鑒權 `Filter` 中的 `excludePatterns` 變量,必定包含 `i18ntranslation` 。`web.xml` 文件中配置了路由對應的 `Filter` 鏈,因為 `/API/*` 路由對應了 `RestAPIAuthorizationFilter` ,因此可以選擇 `i18ntranslation` 作為權限繞過關鍵字:


根據上面的分析,我們可以構造多種姿勢的 URL 實現認證繞過:

文件上傳到 RCE
雖然有了 `Filter` 認證繞過,但并不意味著能在核心功能代碼中完全實現認證繞過,從目前公開的 POC 來看,主要利用了管理員的權限上傳惡意組件,核心 `servlet` 為 `FileUploadServlet`,其子類對應兩個 `url` :

通過靜態分析和動態調試, `FileUploadServlet` 在文件處理過程中需要獲取 `session` 中的 `apiSession` 字段:

然而問題是,如果不登陸, `Session` 中的 `apiSession` 就不會被賦值,獲取該字段會拋異常。因此如果要使用該功能必須要配合用戶登錄的 `session` 才行。雖然訪問 `/API/pageUpload` 需要管理員權限,但是結合 `Filter` 認證繞過,在普通用戶下也可以訪問,所以漏洞的準確描述應該為越權漏洞。這個漏洞的邏輯過程比較簡單,這里就不過多敘述了,下面重點分析新發現的反序列漏洞。
反序列化漏洞
進入真正的主題。在分析復現 CVE-2022-25237 的過程中,注意到修復補丁增加了其他一些 `servlet` 的鑒權。根據 `web.xml` 配置信息,可知 `/serverAPI/` 路由對應的是 `HttpAPIServlet` ,關聯的處理類為 `org.bonitasoft.engine.api.internal.servlet.HttpAPIServlet` :


定位 `doPost` 方法,判斷了 `this.enabled` 變量,該變量在 docker 安裝時默認為 `false`:

需要在 docker 啟動時添加環境變量,或者在系統啟動時修改環境變量的默認值。檢查完環境變量后,將調用 `callHttpApi` 函數, 接著進入 `HttpAPIServletCall#doPost` 方法:

函數內部存在很多反序列化操作,主要包括 xstream XML 反序列化和 Java 原生反序列化:

因為 xstream 版本為 v1.4.18,目前公開的利用鏈無法使用。重點關注存在原生反序列化過程的 `deserialize` 函數:

按照代碼處理流程構造數據包成功達到反序列化觸發點:

在項目依賴庫中發現 bonitasoft 使用了 `commons-beanutils-1.9.4.jar`,可以參考公眾號前面提到的不依賴 cc 鏈的 cb 利用鏈新的構造思路,同時結合 Tomcat 命令回顯姿勢,實現反序列化命令執行回顯的效果:

有興趣深入交流的小伙伴,請加入我們的漏洞空間站-致力于打造優質漏洞資源和小伙伴聚集地!
由于傳播、利用此文檔提供的信息而造成任何直接或間接的后果及損害,均由使用本人負責,且聽安全團隊及文章作者不為此承擔任何責任。