BeanValidation JSR 380 EL表達式注入漏洞之OneDev Pre-Auth RCE
引言
最近看到網上有人發表關于BeanValidation JSR 380 EL表達式注入漏洞的分析文章,在歷史上爆出的相關漏洞中,比較有名的包括Nexus Repository Manager CVE-2018-16621以及后來的繞過漏洞CVE-2020-10693/CVE-2020-10204等,這幾個漏洞網上高質量的分析文章已經很多了,這里再啰嗦一遍意義不大,下面將今年爆出的另一個BeanValidation JSR 380 漏洞分享給大家。
OneDev 是一個國產的類GitLab開源DevOps平臺,可以作為GitLab的替代品。在翻閱代碼更新時,發現一個BeanValidation JSR 380漏洞信息:

漏洞分析
OneDev采用BeanValidation方式對HTTP請求的參數進行驗證。比如在`io.onedev.server.rest.ProjectResource`中:

在GET處理方式中存在`@ValidQueryParams`的裝飾器,主要用于對參數進行格式檢查:

引入名為`ValidQueryParamsValidator`的驗證器,即請求必須通過`ValidQueryParamsValidator`進行格式檢查:

提取請求的參數帶入`buildConstraintViolationWithTemplate`,按照JSR 380規范,如果參數符合EL表達式格式,將會對其進行插值導致出現EL表達式解析。構造請求進行調試驗證:




觸發了漏洞。調用棧如下:

修復方式
BeanValidation JSR 380 EL表達式注入漏洞其中一種有效的修復方式是禁止使用EL插值,OneDev官方就是采用的這種方法,補丁對比如下:

顯式注冊一個`ParameterMessageInterpolator`參數來覆蓋默認的EL插值。