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產品,採用自主專利技術的程式分析引擎,多種創新性的靜態分析技術,結合深度學習和人工智慧等多種方法,能夠對軟體程式碼進行全方位的 安全掃描和安全分析。