Proceso de minería Apache Dubbo CVE-2021-36162

01 Vulnerabilidad Antecedentes

La razón para descubrir esta vulnerabilidad es que al analizar el parche de inyección de script de CVE-2021-30181, descubrí accidentalmente varias
vulnerabilidades de deserialización de yaml que se han solucionado. Pensé que era un Nday no revelado. Después de consultar, descubrí que en realidad corresponde para corregir el código de la vulnerabilidad CVE-2021-30180. Al mirar el parche, podemos saber que
todas las llamadas yaml.load en el módulo del enrutador usan el filtro de lista blanca de SafeConstructor, que no se puede usar normalmente.

"Para obtener información sobre la deserialización de SnakeYaml en este artículo, puede consultar el tweet enviado antes de la cuenta oficial: "
Análisis de deserialización de Java SnakeYaml"
".

[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-7FScAdFj-1690358271307) (https://image.3001.net/images/ 20220415/1649992906_6258e4caa0ed5214712f1.png!pequeño?1649992909028)]1649992914_6258e4d2bf8a321eff10b.png!pequeño?1649992918403

Busque la llamada de yaml.load en el código y descubra que hay otro módulo llamado y no se utilizan las medidas de reparación como SafeConstructor.La ubicación del código vulnerable es la siguiente: public class MigrationRule {private static final String DUBBO_SERVICEDISCOVERY_MIGRATION_KEY = "dubbo.application.service -discovery.migration"; String final estática pública DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP = "MIGRATION"; String final estática pública RULE_KEY = ApplicationModel.getName() + ".migration"; configuración DynamicConfiguration estática privada = null; String privada key;priv ate MigrationStep step;...public static MigrationRule parse(String rawRule) {if (null == configuración) {return getMigrationRule((String)null);} else if (!StringUtils.isBlank(rawRule) && !“ INIT”.equals(rawRule)) {Constructor constructor = new Constructor(MigrationRule.class);Yaml yaml = new Yaml(constructor);return (MigrationRule)yaml.load(rawRule);} else {String step = (String)configuration .getInternalProperty(“dubbo.application.service-discovery.migration”);return getMigrationRule(paso);}}…}

Por lo tanto, el PoC de CVE-2021-30180 también se puede explotar aquí.La cadena de explotación de deserialización específica ha sido publicada por Github Security Lab. Los estudiantes interesados ​​pueden consultar la
cadena de explotación para modificar la vulnerabilidad CVE-2021-36162.

## 02 Disparador de vulnerabilidad

Con la cadena de exploits de deserialización de yaml, el siguiente paso es ver cómo desencadenar esta vulnerabilidad. Haciendo referencia al método anterior de activación de vulnerabilidades, es necesario agregar
nodos en ZooKeeper (en adelante abreviado como ZK) para almacenar datos maliciosos para completar la activación, por lo que hay dos problemas a resolver:

1. ¿En qué nodo de ZK agregar datos yaml maliciosos?

2. ¿Cómo permitir que los consumidores lean y analicen estos datos yaml?

Pregunta uno

Al buscar la función Migation, puede encontrar los siguientes documentos. Dubbo usa esta función para controlar a los consumidores para implementar diferentes estrategias de selección de ubicación. Según el contenido, se puede determinar aproximadamente que los datos maliciosos se pueden controlar a través del centro de configuración global ZK
.

1649992949_6258e4f579c6822d051cf.png!pequeño?1649992952920

Ejecute el consumidor y el servidor normalmente y capture paquetes, puede encontrar que contiene ZK Path relacionado con la migración, intente crear nodos relacionados e inserte datos arbitrarios en las siguientes rutas:

1649992957_6258e4fd2fcc37f3725af.png!pequeño?1649992958650

pregunta dos

Después de completar la inserción de datos arbitrarios, vuelva a ejecutar el consumidor y encuentre el mensaje de error de la siguiente excepción de análisis , que prueba que los datos insertados surtieron efecto e ingresaron con éxito el código vulnerable.

1649992968_6258e5081b38047244c48.png!pequeño?1649992969760

Intente insertar el PoC construido en la ruta anterior. Aquí encontrará que hay muchos espacios, símbolos especiales y otros caracteres en el PoC. Insertar el PoC directamente a través de ZKCli.sh causará varios problemas, lo que provocará que la vulnerabilidad no se active. normalmente
. , por lo que es necesario agregar datos a ZK llamando a un paquete de terceros a través de Java. El código específico es el siguiente:

• Use el siguiente código para insertar datos Yaml maliciosos // Inserte la lógica implementada por usted mismo antes de ver el código de inserción oficial de github public class RegisterYaml {public static void main(String[] args) throws Exception {String path = “/dubbo/config/ MIGRACIÓN /consumer-of-helloworld-app.migration”;String poc = “…”;RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);CuratorFramework client = CuratorFrameworkFactory.newClient(“127.0.0.1:2181”, retryPolicy);cliente .start();Stat stat = client.checkExists().forPath(path);if (stat != null) {client.delete().forPath(path);}client.create().forPath(path, poc .getBytes());}}

Simplemente prepare el archivo de configuración de SPI necesario para desencadenar la vulnerabilidad y el archivo de código de bytes de clase que se ejecutará. La estructura de directorio de archivos específica es la siguiente: ├── META-INF│ └── services│ └── javax.script .ScriptEngineFactory└ ── cc└── m01n└── SnakeYaml└── AwesomeScriptEngineFactory.class

Inicie el servidor HTTP con Python en el mismo directorio que META-INF.

• python3 -m http.servidor 8000

Inicie primero el código del servidor y luego ejecute el código del consumidor para desencadenar la vulnerabilidad:

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-6uUpwYcf-1690358271309) (https://image.3001.net/images/ 20220415/1649993058_6258e562e93d68aeeff06.png!small ?1649993060762)][Falló la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-CXiC7wLf-1690358271309)(https: //imagen.3001.net/images/20220415/1649993066_6258e56a40b553f9e16 29 .png!pequeño?1649993068623)]

## 03 Análisis de vulnerabilidad

Establezca un punto de interrupción en la clase MigrationRuleListener, que llamará a this.configuration.getConfig para obtener los datos yaml de ZK
en el atributo rawRule, y podrá ver que se eliminan los datos yaml maliciosos que escribimos.

1649993081_6258e5797f7d4a9141ce3.png!pequeño?1649993083568

Continúe con el seguimiento y descubra que la instancia de MigrationRuleListener se crea a través del SPI ExtensionLoader#createExtension personalizado.

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-zdwBAnWl-1690358271310) (https://image.3001.net/images/ 20220415/1649993089_6258e58188c3902dfb023.png!pequeño?1649993091407)]

Más tarde, se llamará al método onRefer en la instancia de MigrationRuleListener para activar la operación de análisis de datos yaml subsiguiente.

Al ingresar al punto de interrupción y realizar el seguimiento, puede ver que los datos de yaml en rawRule se pasarán al método yaml.load, lo que resultará en una vulnerabilidad de deserialización.

1649993096_6258e588002972bef7bc9.png!pequeño?1649993097679

## 04 Corrección de errores

Esta vulnerabilidad ha sido reparada en la versión 2.7.13, el método de reparación
es el mismo que CVE-2021-30180, y se utiliza SafeConstructor para repararla, el parche de reparación específico es el siguiente:

https://github.com/apache/dubbo/commit/bfa4b3bb6660d404c0715f54f8743dda45b46909

1649993106_6258e5925c86d831f932d.png!pequeño?1649993109426

b3bb6660d404c0715f54f8743dda45b46909

[Transferencia de imagen de enlace externo...(img-NbK0tKMS-1690358271310)]

Ruta de aprendizaje de nivel empresarial de ingeniero de seguridad de redes

En este momento, por supuesto que necesita una ruta de aprendizaje sistemática

Si la imagen es demasiado grande y está comprimida por la plataforma, puede descargarla al final del artículo (sin cargo), y también pueden aprender y comunicarse juntos.

Parte de mi colección de manuales de autoaprendizaje sobre seguridad cibernética

Algunos buenos tutoriales en video que obtuve gratis:

La información anterior [haga clic en la tarjeta a continuación] se puede recibir, gratis para compartir

Supongo que te gusta

Origin blog.csdn.net/weixin_53312997/article/details/131941284
Recomendado
Clasificación