Ven a ver conmigo lo que está pasando con este gran vacío legal en primavera

¡Acostúmbrate a escribir juntos! Este es el quinto día de mi participación en el "Nuevo plan diario de Nuggets · Desafío de actualización de abril", haga clic para ver los detalles del evento .

Descripción de la vulnerabilidad

¿Dónde puedo ver las lagunas en esta primavera? Vamos directamente a la web oficial de la primavera. Ya en el módulo del blog, puede ver la descripción oficial de la primavera.

iShot2022-04-05 10.18.56

​ El 30 de marzo de 2022, Spring Framework expuso la vulnerabilidad RCE 0day, y la Plataforma Nacional de Intercambio de Vulnerabilidades de Seguridad de la Información (CNVD) incluyó la Vulnerabilidad de Ejecución Remota de Comandos de Spring Framework (CNVD-2022-23942). Spring Framework, la vulnerabilidad está clasificada como peligrosa.

A través de esta vulnerabilidad, puede escribir en el shell web y ejecutar comandos. En la versión JDK9 (y superior) del framework Spring, los atacantes remotos pueden obtener objetos AccessLogValve y valores de campos maliciosos a través de la función de vinculación de parámetros del framework sobre la base del cumplimiento de ciertas condiciones, activando así el mecanismo de canalización y escribiendo rutas arbitrarias. debajo. Algunos amigos no saben qué es este objeto AccessLogValve, de hecho, todos lo usamos a menudo. Simplemente no me di cuenta:

imagen-20220405102829278

En el archivo server.xml de tomcat, AccessLogValve es la clase de procesamiento de registro utilizada para registrar las solicitudes de acceso al contenedor. Valve, el significado original es el significado de la válvula, AccessLogValve es procesar y generar registros de acceso. El principio es modificar dinámicamente el valor del parámetro de este objeto y luego escribir el archivo especificado (como un archivo jsp) en el contenedor y luego escribir el comando de script de shell a través del archivo escrito para su ejecución.

Condición de vulnerabilidad

imagen-20220405104013384

  1. Apache Tomcat como contenedor de Servlet;

  2. Use el marco Spring MVC de JDK9 y superior;

  3. El marco Spring y el marco derivado spring-beans-*.jar archivos o CachedIntrospectionResults.class existen

Esfera de influencia

jdk

JDK 9+

Primavera

​ 5.3.0 a 5.3.17

​ 5.2.0 a 5.2.19

versión anterior

tratar de reproducir

Primero intentemos ver si se puede reproducir y luego hablemos sobre cómo resolverlo:

  1. mira el entorno

imagen-20220405104622455

imagen-20220405104738339

  1. 构建一个基于maven的web项目,框架用的spring-mvc,就是常规的工程没有什么特殊的。主要是要注意maven打包为war包。并独立部署外部tomcat中,不要直接在idea中进行部署启动。

imagen-20220405104855123

主要注意协议对应spring的版本:

				<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.10</version>
        </dependency>
复制代码

定义一个简单的controller

@Controller
public class IndexController {
    @RequestMapping("/test1")
    @ResponseBody
    public String index(User user) {
        user = new User();
        user.setAddress("123");
        return user.getAddress();
    }

}
复制代码
  1. 访问对应的路径,注意加上下面的参数。

imagen-20220405105338542

说明一下以上的参数的含义

class.module.classLoader.resources.context.parent.pipeline.first.pattern=构建文件的内容
class.module.classLoader.resources.context.parent.pipeline.first.suffix=修改tomcat日志文件后缀
class.module.classLoader.resources.context.parent.pipeline.first.directory=写入文件所在的网站根目录
class.module.classLoader.resources.context.parent.pipeline.first.prefix=写入文件名称
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=文件日期格式(实际构造为空值即可)
复制代码
  1. 结果在root根目录就会生成你要写入的jsp文件。

imagen-20220405105852739

这个文件在root目录下,当然就可以在外面直接进行访问。之后就可以通过这个文件进行写入各种shell命令。

自查漏洞

  1. 排查是否使用了Spring框架(包括但不限于以下方法)

(1) 排查项目中是否使用了Spring框架指定版本:

可遍历项目文件查找是否包含spring-beans-*.jar

(2) 排查war包中是否存在Spring框架:

检查war包内是否存在spring-beans-*.jar文件,若存在则表示使用spring开发框架;若不存在,则进一步确认是否存在CachedIntrospectionResults.class文件,若存在则表示使用Spring开发框架或衍生框架。

  1. 排查包含Spring框架的项目使用的JDK版本,如果JDK版本>=9则存在风险。

漏洞修复

spring官方建议最好通过升级spring版本来解决,不过也提供了其他集中修复的方法

imagen-20220405110311888

  1. 将spring版本升级到5.3.18和5.2.20或者以上版本
  2. 升级tomcat
  3. 降低jdk版本
  4. 禁止请求时带指定参数

咱们说一下最后一种方案:需要增加controller拦截

@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
         String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
         dataBinder.setDisallowedFields(denylist);
    }

}
复制代码

不过spring官方墙裂建议升级spring版本,因为目前版本还可能存在未知的问题。

La respuesta preferida es actualizar a Spring Framework 5.3.18 y 5.2.20 o superior. Si ha hecho esto, entonces no se necesitan soluciones alternativas. Sin embargo, algunos pueden estar en una posición en la que no es posible actualizar rápidamente. Por esa razón, hemos proporcionado algunas soluciones a continuación.

Estado de vulnerabilidad

En la actualidad, el oficial de primavera ha solucionado la vulnerabilidad, y ahora extrae el último paquete de jar de primavera y prueba los resultados a través de mis pasos de reproducción anteriores:

imagen-20220405112912657

Bienvenido a prestar atención a la "Pila de tecnología de TI" para compartir la búsqueda de empleo, el trabajo y los productos secos técnicos.

Supongo que te gusta

Origin juejin.im/post/7082958114240069669
Recomendado
Clasificación