Este artículo trata sobre Spring4Shell, una vulnerabilidad de tipo RCE (ejecución remota de código) descubierta en tecnologías Java Spring.
Spring4Shell: un término clave para definir una serie de vulnerabilidades que afectan a las tecnologías relacionadas con Java Spring
El 29 de marzo de 2022, VMWare anunció una vulnerabilidad referenciada como CVE-2022-22963 en el producto Spring Cloud Function (tecnología que permite implementar servicios bajo un modelo serverless).
Ese mismo día, se declaró una segunda vulnerabilidad de tipo ejecución remota de código en el producto Spring Framework (un framework que facilita el desarrollo de proyectos Java).
El 31/03/2022, tras numerosos debates en foros de discusión, esta segunda vulnerabilidad recibió el código CVE-2022-22965.
Ambas vulnerabilidades se mencionan en las redes sociales bajo el nombre de Spring4Shell, debido a su relación con las tecnologías de Spring, y al hecho de que estas tecnologías suelen ser bibliotecas Java que se despliegan de forma similar a Log4J (la biblioteca Java que fue objetivo de Log4Shell en diciembre de 2021).
En el momento de redactar este artículo, el NVD aún no ha creado una ficha oficial sobre estas vulnerabilidades.
Por su parte, la Agencia Nacional de Seguridad de los Sistemas de Información (ANSSI) ha publicado el aviso CERTFR-2022-AVI-297.
Spring4Shell describe la vulnerabilidad CVE-2022-22965
La comunidad ha utilizado el nombre Spring4Shell para describir el conjunto, a veces con cierta confusión, en recuerdo de la vulnerabilidad Log4Shell.
No obstante, el consenso es que Spring4Shell está vinculado más específicamente a la CVE-2022-22965, cuyo impacto es mucho menos grave que el de la vulnerabilidad Log4Shell.
De hecho, Log4J era una tecnología integrada en muchísimos componentes, cuya configuración predeterminada permitía muy a menudo la explotación de la vulnerabilidad CVE-2021-44228.
En este caso, Spring Framework cuenta con una configuración predeterminada que limita considerablemente las capacidades de explotación de la CVE-2022-22965.
Por ello, Cyberwatch recomienda actualizar las tecnologías vulnerables lo antes posible, pero sin necesidad de movilizar equipos de crisis si no hay pruebas evidentes de un ataque.
¿Cuáles son las configuraciones vulnerables?
La CVE-2022-22963 afecta a los componentes de Spring Cloud Function hasta las versiones 3.1.6 y 3.2.2
La vulnerabilidad CVE-2022-22963 afecta a la biblioteca Spring Cloud Function en las siguientes versiones:
- Cualquier versión hasta la 3.1.6 incluida;
- Cualquier versión 3.2.X hasta la 3.2.2 incluida.
La CVE-2022-22965 afecta a los componentes de Spring Framework y Spring Boot hasta las versiones 5.2.19 y 5.3.17
La vulnerabilidad CVE-2022-22965 afecta a las bibliotecas de Spring Framework en las siguientes versiones sobre Java 9 o superior:
- Cualquier versión 5.0.X, 5.1.X, 5.2.X, hasta la 5.2.19 inclusive;
- Cualquier versión 5.3.X hasta la 5.3.17 inclusive.
También afecta a los componentes que la integran, como la biblioteca Spring Boot en las siguientes versiones sobre Java 9 o superior:
- Cualquier versión 2.0.X, 2.1.X, 2.2.X, 2.3.X, 2.4.X, hasta la 2.5.11;
- Cualquier versión 2.6.X hasta la 2.6.5 inclusive.
Según el editor, los despliegues vulnerables son exclusivamente aquellos que cumplen con las siguientes especificaciones:
- despliegue de la aplicación Java en formato de archivo WAR;
- ejecución de la aplicación Java con Apache Tomcat;
- presencia de una de las dependencias spring-webmvc o spring-webflux.
Es por ello que esta CVE es más difícil de explotar que Log4Shell y, por consiguiente, mucho menos grave.
¿Cómo detectar la presencia de Spring4Shell en mi sistema de información?
Existen dos enfoques para buscar Spring4Shell en su sistema de información: mediante escaneo del disco duro o mediante intentos de inyección en las aplicaciones web.
Enfoque mediante escaneo del disco duro
Un enfoque mediante escaneo del disco duro permite identificar las bibliotecas JAR / WAR / EAR y buscar en ellas la presencia de bibliotecas Spring Boot o Spring Framework.
Hay dos ejemplos básicos disponibles para Linux y Windows, puestos a disposición de la comunidad bajo licencia GPLv3.
Ejemplo de script de búsqueda para Linux
#!/bin/bash
###################################################################################
# ======================== Scripts de escaneo para Spring4Shell ==========================
#
# VERSIÓN 1.0.0
#
# AUTOR Cyberwatch SAS
#
# URL DEL PROYECTO https://cyberwatch.fr
#
# DESCRIPCIÓN
# Escanea el sistema de archivos en busca de archivos war que contengan la biblioteca Spring core.
# Proporciona la lista de archivos encontrados en formato CPE para Cyberwatch.
#
# SINOPSIS
# Encuentra archivos de Spring y proporciona los resultados en formato CPE para los escaneos de Cyberwatch.
###################################################################################
toplevel='/'
sudo=''
sudo -n find -version > /dev/null && sudo='sudo -n'
python='python'
if command -v python3 > /dev/null ; then
python='python3'
elif command -v python2 > /dev/null ; then
python='python2'
fi
pyscript=$(mktemp --tmpdir cyberwatch-XXXXXX.py)
cat > "$pyscript" <<PYTHON
import io
import os.path
import re
import sys
import zipfile
spring_re = re.compile('^spring-core.*-(?P<version>[0-9][0-9.]*[0-9]).*jar$')
def process_archive(archive_file, archive_path):
try:
with zipfile.ZipFile(archive_file) as archive:
for member_path in archive.namelist():
full_path = os.path.join(archive_path, member_path)
m = spring_re.match(os.path.basename(archive_path))
if m:
print('# Archivo WAR encontrado con librería vulnerable de Spring Framework')
print('# ' + full_path)
print('CPE:cpe:2.3:a:vmware:spring_framework:' + m.group('version') + ':*:*:*:*:*:*:*')
return
if os.path.splitext(member_path)[1].lower() in ['.jar', '.war', '.ear', '.zip']:
process_archive(io.BytesIO(archive.read(member_path)), full_path)
except Exception as e:
print("# Error al leer " + archive_path + ": " + str(e))
for line in sys.stdin:
path = line.rstrip()
process_archive(path, path)
PYTHON
$sudo find "$toplevel" -xdev -type f \( -iname '*.war' \) |
$sudo $python -- "$pyscript"
rm -- "$pyscript"
Ejemplo de script de búsqueda para Windows
<#PSScriptInfo
.VERSION 1.0.0
.GUID cee16958-1b73-41c0-a6f2-a94e4ef5295b
.AUTHOR Cyberwatch SAS
.PROJECTURI https://cyberwatch.fr
.Descripción
Analiza el sistema de archivos en busca de archivos war que contengan la biblioteca principal de Spring.
Proporciona la lista de archivos encontrados en formato CPE para Cyberwatch.
ADVERTENCIA: ¡Este script requiere PowerShell v3 o superior!
.SINOPSIS
Busca archivos de Spring Framework y proporciona los resultados en formato CPE para el análisis de Cyberwatch.
#>
Add-Type -Assembly 'System.IO.Compression'
function Invoke-Archive {
param (
[System.IO.Stream] $archiveStream,
[string] $archivePath
)
try {
$archive = New-Object System.IO.Compression.ZipArchive $archiveStream
} catch {
"# Advertencia: No se pudo abrir el archivo $($archivePath): $($_.FullyQualifiedErrorID)"
return
}
foreach ($entry in $archive.Entries) {
$fullPath = "$archivePath/$($entry.FullName)"
if ([System.IO.Path]::GetFileName($archivePath) -match '^spring-core.*-(\d[\d.]*\d).*jar$') {
'# Archivo WAR encontrado con librería vulnerable de Spring Framework'
"# $fullPath"
"CPE:cpe:2.3:a:vmware:spring_framework:$($Matches.1):*:*:*:*:*:*:*"
return
}
if ([System.IO.Path]::GetExtension($entry.Name) -in ".jar", ".war", ".ear", ".zip") {
$subarchive = $entry.Open()
Invoke-Archive $subarchive $fullPath
}
}
}
foreach ($drive in Get-PSDrive -PSProvider FileSystem) {
"# Explorando $($drive.Root)"
foreach ($path in Get-ChildItem -Path $drive.Root -File -Recurse -Include "*.war" -ErrorAction SilentlyContinue -ErrorVariable UnscannablePaths) {
$file = [System.IO.File]::OpenRead($path)
Invoke-Archive $file $path
}
foreach ($Exception in $UnscannablePaths) {
"# Advertencia: No se pudo analizar $($Exception.TargetObject): $($Exception.FullyQualifiedErrorID)"
}
""
}
# FIN
Obtendrá una línea por cada archivo WAR que contenga una biblioteca vulnerable, junto con las versiones instaladas. Compararlas con las versiones indicadas en este artículo le permitirá verificar si su sistema es vulnerable o no.
Enfoque mediante intentos de inyección
La inyección se realiza mediante la creación de solicitudes web específicas que utilizan encabezados y datos POST especialmente diseñados para activar la vulnerabilidad.
Puede encontrar un ejemplo de script de ataque en un proyecto de GitHub de Lunasec.
La ejecución de este script en el objetivo a probar le permitirá verificar si es vulnerable o no.
Cyberwatch también pone a disposición de la comunidad un módulo gratuito de escaneo de sitios web a través de su escáner de código abierto Wapiti y la PR 275.
¿Cómo corregir las vulnerabilidades Spring4Shell CVE-2022-22963 y CVE-2022-22965?
El enfoque más seguro consiste en actualizar las bibliotecas vulnerables, de acuerdo con la lista a continuación.
Recomendaciones para corregir CVE-2022-22963
- Instalar Spring Cloud Function versión 3.1.7 para las ramas 3.1.X o inferiores;
- Instale Spring Cloud Function versión 3.2.3 para la rama 3.2.X.
Recomendaciones para corregir la CVE-2022-22965 Spring4Shell
Caso de Spring Boot:
- Instale Spring Boot versión 2.5.12 para las ramas 2.5.X o inferiores;
- Instale Spring Boot versión 2.6.6 para la rama 2.6.X.
Caso de Spring Core:
- Instale Spring Framework 5.2.20 para las ramas 5.2.X o inferiores;
- Instale Spring Framework 5.3.18 para la rama 5.3.X.
Además, Apache Tomcat ha lanzado actualizaciones que permiten neutralizar la CVE:
- Instale Apache Tomcat 8.5.78 para las ramas 8.X o inferiores;
- Instale Apache Tomcat 9.0.62 para las ramas 9.0.X;
- Instale Apache Tomcat 10.0.20 para las ramas 10.0.X.
Descubra también Cyberwatch Vulnerability Manager, nuestra solución de gestión de vulnerabilidades
Cyberwatch Vulnerability Manager es una solución de gestión de vulnerabilidades que incluye detección, priorización y corrección.
Cyberwatch Vulnerability Manager es capaz de detectar Spring4Shell en su sistema de información mediante análisis locales o web, ayudándole a tomar las decisiones correctas.
No dude en solicitar una demostración a través del formulario dedicado.
Historial de actualizaciones de este artículo
31/03/2022 18:40: redacción inicial del artículo tras la publicación de la CVE-2022-22965.
31/03/2022 21:22: actualización de los scripts gratuitos para dirigirse únicamente a las configuraciones con WAR.
01/04/2022 16:55: adición de las recomendaciones relacionadas con los parches de Apache Tomcat.
