1. 程式人生 > 其它 >Fastjson反序列化遠端程式碼執行漏洞產生原因及修復建議

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

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

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

第三方獨立測試結果可參考:https://github.com/eishay/jvm-serializers/wiki

一、漏洞產生原因:

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的方法,比如:

 

 

來源:https://github.com/alibaba/fastjson/wiki/fastjson_safemode

WuKong靜態軟體安全測試工具

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