DataSunrise Logra el Estado de Competencia en AWS DevOps en AWS DevSecOps y Monitoreo, Registro, Rendimiento

Una Historia Sobre Cómo Arreglamos el Controlador JDBC de Vertica para DBeaver

Una Historia Sobre Cómo Arreglamos el Controlador JDBC de Vertica para DBeaver

Al conectarse a una base de datos Vertica a través de una aplicación DBeaver, se detectó un problema (ce-4.2.2). Si introduces un puerto no estándar, por ejemplo, 55555, la herramienta intenta conectarse al puerto predeterminado 5433 de todas maneras.

example

Pantalla 1

Diagnóstico de los problemas

Bajo una línea de “Razón” puedes ver que no se pudo conectar al puerto 5433, también hubo un informe de que el cliente iba a conectarse al puerto 55555.

Sin embargo, al ingresar un número corto (1234), no hay tal problema.

example

Pantalla 2

En este caso, la conexión falló en el puerto especificado 1234.

Resumen

¿A cuál puerto se intentó conectar, de hecho? Es posible ejecutar una herramienta IDA Pro y conectarse a un proceso de DBeaver.

Para convertir la endianness, las aplicaciones a menudo usan un conjunto de funciones “host to TCP/IP network” de una API de NetWare. Para convertir un número de dos bytes (por ejemplo, un puerto TCP) es posible usar las funciones “htons”.

La versión “WinAPI” de la función “htons” está en “ws2_32.dll”. Necesitas encontrar una importación del módulo “ws2_32.d” y abrir una lista de las funciones.

example

Pantalla 3

Luego, necesitas establecer un punto de interrupción en la llamada a la función “htons”.

example

Pantalla 4

Si configuras el puerto 1234 y haces clic en “Probar conexión”, entonces la depuración se detiene en el punto de interrupción.

example

Pantalla 5

Primero, puedes notar que la función toma el valor a través de la pila.

00401A42 mov ebp, esp
00401A44 mov eax, [ebp + arg_0]

Estas instrucciones establecen el valor en un registro EAX desde la parte superior de la pila por offset a “arg_0”. Los bytes “D2” y “04” en el formato “Big Endian” son nuestro número 1234. Pero, ¿qué pasa si indicamos el número 55555 como puerto? En teoría, los bytes “03” y “D9” deberían colocarse en la parte superior de la pila.

Necesitas hacer clic en “Probar conexión” nuevamente, pero con el puerto 55555.

example

Pantalla 6

Eso es extraño, pero aquí tenemos un número 5433 en la pila (bytes 15 y 39), que es un puerto predeterminado de DBMS “Vertica”. Se puede suponer que el programa establece un puerto incorrecto de una vez. Necesitamos averiguar dónde sucede. Para comunicarse con DBMS, Dbeaver usa JDBC y carga una versión 6.1.2 por defecto.

example

Pantalla 7

Es posible intentar descompilar un controlador (.jar) y explorar lo que sucede antes de la conexión. Un software “fernflower” es bueno para esta tarea. Soporta muchas opciones para descompilar aplicaciones Java. Para un análisis simple, una descompilación estándar sin banderas es adecuada.

example

Pantalla 8

Una vez completado, habrá archivos fuente descompilados.

Necesitas buscar el uso de un puerto predeterminado “HPE Vertica” en un editor de texto, podría ser capaz de entender la esencia del problema con el cambio del puerto 55555 a 5433.

example

Pantalla 9

Hay un intento de convertir el valor del puerto a un tipo Short en un método “loadPreonnectSettings”.

Si no es posible, entonces se usará el puerto 5433. Un tipo Short tipo en Java está limitado por un rango de -32,768 a 32,767, por lo tanto, el valor 55555 será una excepción lanzada. Resulta que el problema está en el controlador JDBC en sí mismo. Intentemos arreglar su funcionamiento.

Parcheo de la aplicación

Para parchear archivos “class” es posible usar DirtyJOE. Necesitas abrir “VConnection.class” desde un archivo jar. Hay una lista de los métodos de este objeto en la pestaña “Methods”.

example

Pantalla 10

Un doble clic en el método “loadPreConnectSettings” abre el CodeEditor.

example

Pantalla 11

Una llamada al método getShort ocurre en la posición 0000004E, lo que significa que B6 es un código de operación de una instrucción, y 003C es una etiqueta de operando. Es necesario cambiar una instrucción para llamar a getInt para un objeto Variant.

example

Pantalla 12

Hay una lista de métodos de clase en la pestaña Constant Pool. El número 0060 es exactamente el número de un método en decimal.

example

Pantalla 13

Se encontró un método getInt abajo. Necesitas volver a la llamada getShort y cambiar el comando por getInt.

example

Pantalla 14

Después de eso, necesitas guardar la clase y reemplazar el archivo original en el archivo jar. Antes de parchear, Dbeaver se conectaba al puerto 55555 como al 5433.

example

Pantalla 15

Ahora está utilizando el puerto correcto para conectarse.

Conclusión

El problema, como resultó ser, no está en el navegador Dbeaver en sí, sino en el controlador que descarga para la comunicación con una base de datos Vertica.

Actualización 09.19

Dbeaver eliminó la descarga de JDBC en la versión 4.3.0 para Vertica. Esto significa que la aplicación no usará la versión problemática de este controlador por defecto.

Siguiente

Seguridad de Bases de Datos en el Blog de Big Data de Amazon AWS

Seguridad de Bases de Datos en el Blog de Big Data de Amazon AWS

Más información

¿Necesita la ayuda de nuestro equipo de soporte?

Nuestros expertos estarán encantados de responder a sus preguntas.

Información general:
[email protected]
Servicio al Cliente y Soporte Técnico:
support.datasunrise.com
Consultas sobre Asociaciones y Alianzas:
[email protected]