項目介紹
YAML是一種數(shù)據(jù)序列化格式,設計用于人類的可讀性和與腳本語言的交互。
SnakeYaml是一個完整的YAML1.1規(guī)范Processor,支持UTF-8/UTF-16,支持Java對象的序列化/反序列化,支持所有YAML定義的類型。
項目地址
https://github.com/snakeyaml/snakeyaml
漏洞概述
SnakeYaml通常使用方法如下:
new Yaml(new Constructor(TestDataClass.class)).load(yamlContent);
默認情況下,SnakeYaml在解析用戶提供惡意yamlContent時,即使yamlContent不滿足TestDataClass類型,也會執(zhí)行惡意代碼。
影響版本
Snakeyaml 全版本
環(huán)境搭建
導入存在漏洞的Snakeyaml組件并編寫demo測試即可
漏洞復現(xiàn)
下面demo通過反序列化一個惡意類,該惡意類可以請求遠程jar文件并實例化。
?
漏洞分析
該漏洞并不被官方認可,官方認為通過yaml文件反序列化對象是正常功能并不會修復。
?
這里我僅對snakeyaml反序列化的流程進行分析,為了簡潔易懂,下面僅列舉關鍵代碼:
?
上述代碼需要層層展開,簡單說就是根據(jù)snakeyaml的構造器解析yaml文件內(nèi)容并返回對應實例。下面對實例化的關鍵步驟展開介紹:
- 獲取構造器
在下面代碼中根據(jù)節(jié)點獲取對應的類并從yamlClassConstructors中獲得對應的構造器。
?
這里的Constructor有三種類型,分別對應不同的yaml
?
2. 實例化對象
獲得構造器后就是裝配對象。這里僅分析ConstructSequence。在下面代碼中,根據(jù)節(jié)點的不同類型分別進行處理。
?
如果不是上述三種基本類型,那么獲取默認的構造函數(shù)并遞歸構造參數(shù)節(jié)點
?
最后通過反射初始化實例
?
以上梳理了snakeyaml大概的反序列化流程。當yaml可以被攻擊者控制時,通過傳入惡意的yaml內(nèi)容就可以實例化任意對象,從而造成命令執(zhí)行。
修復方式
在參考鏈接中,官方認為snakeyaml的使用場景僅接收可信的數(shù)據(jù)源,因此不認為cve-2022-1471是漏洞,因此目前還沒有修復,后續(xù)可能也不會修復。這里建議開發(fā)人員排查snakeyaml的使用情況,判斷是否接收外部數(shù)據(jù),并加入new SafeConstructor()類進行過濾,如下:
Yaml yaml = new Yaml(new SafeConstructor());
參考鏈接
snakeyaml / snakeyaml / issues / #561 - CVE-2022-1471 (vulnerability in deserialization) — Bitbucket
https://github.com/advisories/GHSA-mjmj-j48q-9wg2文章來源:http://www.zghlxwxcb.cn/news/detail-426548.html
https://nvd.nist.gov/vuln/detail/CVE-2022-1471文章來源地址http://www.zghlxwxcb.cn/news/detail-426548.html
到了這里,關于漏洞深度分析|CVE-2022-1471 SnakeYaml 命令執(zhí)行漏洞的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!