Fastjson反序列化遠端程式碼執行漏洞產生原因及修復建議

zktq2021發表於2022-06-01

Fastjason是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字串,支援將Java Bean序列化為JSON字串,也可以從JSON字串反序列化到JavaBean。由於其序列化jason檔案速度快且中文文件非常全面,所以為國內廣大開發人員所應用。

fastjson是目前java語言中最快的json庫,比自稱最快的jackson速度要快。

第三方獨立測試結果可參考:

一、漏洞產生原因:

Fastjson使用黑白名單用於防禦反序列化漏洞,並允許使用者在輸入JSON串時透過“@type”鍵對應的value指定任意反序列化類名。在特定條件下可繞過預設autoType關閉限制,攻擊遠端伺服器,風險影響較大(也就是通常所指的“Gadget”)。

二、受影響的版本:

特定依賴存在下影響 ≤1.2.80

三、漏洞等級:

風險評級:高危

四、官方修復方案:

1. 升級到1.2.83版本

從原始碼可以看到:

- 該版本原始碼刪除了很多白名單對應的hash;

- checkAutoType(String typeName, Class<?> expectClass, int features)方法,新增了新的校驗包含mask和autoTypeSupport,用來規避未經驗證的autoType的注入。

2. 原來1.2.68以後到1.2.80的版本:開啟配置safeMode,讓白名單和黑名單都不支援autoType,從而可杜絕反序列化Gadgets類變種攻擊。

在1.2.68版本中,fastjson增加了safeMode的支援。safeMode開啟後,完全禁用autoType。所有的安全修復版本sec10也支援SafeMode配置。

開啟SafeMode功能(1.2.68之後的版本)

有三種配置SafeMode方式,如下:

①在程式碼中配置

ParserConfig.getGlobalInstance().setSafeMode(true);

注意,如果使用new ParserConfig的方式,需要注意單例處理,否則會導致低效能full gc。

②加上JVM啟動引數

-Dfastjson.parser.safeMode=true

如果有多個包名字首,用逗號隔開

③透過fastjson.properties檔案配置。

透過類路徑的fastjson.properties檔案來配置,配置方式如下:

fastjson.parser.safeMode=true

safeMode場景如何做autoType

在1.2.68之後的版本,提供了AutoTypeCheckHandler擴充套件,可以自定義類接管autoType, 透過ParserConfig#addAutoTypeCheckHandler方法註冊。

 

 

怎麼判斷是否用到了autoType

看序列化的程式碼中是否用到了SerializerFeature.WriteClassName

JSON.toJSONString(obj, SerializerFeature.WriteClassName); // 這種使用會產生@type

使用JSONType.autoTypeCheckHandler

在fastjson 1.2.71版本中,提供了透過JSONType配置autoTypeCheckHandler的方法,比如:

 

 

來源:

中科天齊 漏洞治理專家

中科天齊由中科院研究員李煉博士創立,以自主研究成果WuKong靜態軟體安全測試工具為主打產品,團隊憑藉多年在程式分析領域的技術積累,致力打造安全漏洞治理領域新生態的高新技術企業。

WuKong靜態軟體安全測試工具

WuKong是一款國產信創SAST產品,採用自主專利技術的程式分析引擎,多種創新性的靜態分析技術,結合深度學習和人工智慧等多種方法,能夠對軟體程式碼進行全方位的 安全掃描和安全分析。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70000012/viewspace-2898407/,如需轉載,請註明出處,否則將追究法律責任。

相關文章