Fastjson ha estado expuesto a una vulnerabilidad grave
Descripción de la vulnerabilidad
Primero, eche un vistazo a la respuesta oficial de Ali, el portal
Mirando el caso de prueba después de que se corrigió la vulnerabilidad en la versión 1.2.60 en Github , puede encontrar la cadena de muerte que causó esta vulnerabilidad {"a": "\ x
A continuación, reproducimos la" cadena de muerte "en la demostración y el entorno real. El error resultante:
public static void main(String[] args) {
try {
String DEATH_STRING = "{\"a\":\"\\x";
Object obj = JSON.parse(DEATH_STRING);
} catch (Exception e) {
e.printStackTrace();
}
}
Excepción lanzada: excepción de tamaño GC + OOM
2. Reproducir en la aplicación
Nuestra aplicación usa el marco SpringMvc, y luego mvc:message-converters
MessageConverter está configurado para usar FastJson com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
para serializar y deserializar la cadena JSON, por lo que esta vulnerabilidad se puede simular directamente a través de solicitudes POST.
- Use HttpClient, abra multi-threading, llame a una interfaz 500 veces
-
private static void testMutiThread() { ExecutorService threadPool = Executors.newFixedThreadPool(8); String url = "http://localhost:8080/pool/getBaseLogById"; String DEATH_STRING = "{\"id\":\"10143\\x"; for (int i = 0; i < 500; i++) { threadPool.submit(() -> { String result = HttpClientUtil.doPost(url, DEATH_STRING, HttpClientUtil.CONTENT_TYPE_JSON); System.out.println("响应报文为:" + result); }); } }
- Use la herramienta Java VisualVM para observar el uso de la memoria y la situación del GC.
3. Use el comando jstat para observar la situación del GC.
Antes de que se completen 500 llamadas, el número de gc completo ha alcanzado aproximadamente 460 veces.
Si está en línea, los atacantes continúan atacando, el aumento de la memoria, el Full GC loco y el agotamiento de la CPU eventualmente harán que su aplicación no brinde servicios normalmente.
Después de actualizar FastJson en la aplicación a 1.2.60, la "cadena de muerte" lanzará directamente una excepción durante la conversión porque no se ajusta al formato json estándar.
El contenido específico corregido en FastJson-1.2.60: Portal
Después de actualizar a 1.2.60, continúe con "use HttpClient, abra el subproceso múltiple, llame a una interfaz 500 veces", las condiciones de la memoria y del GC son las siguientes:
Entre ellos, se realizaron 3 GC completos y 7 GC jóvenes antes de la prueba de presión Existente, que es equivalente a solo un Young GC generado durante la prueba de presión, que es una reacción normal.