DataSunrise Obtient le Statut Compétence DevOps AWS dans AWS DevSecOps et Surveillance, Journalisation, Performance

Une Histoire sur la Façon Dont Nous Avons Réparé le Pilote JDBC de Vertica pour DBeaver

Une Histoire sur la Façon Dont Nous Avons Réparé le Pilote JDBC de Vertica pour DBeaver

Lors de la connexion à une base de données Vertica via l’application DBeaver, un problème a été détecté (ce-4.2.2). Si vous entrez un port non standard, par exemple 55555, l’outil essaie de se connecter de toute façon au port par défaut 5433.

exemple

Écran 1

Diagnostic des problèmes

Sous la ligne “Raison”, vous pouvez voir qu’il n’a pas pu se connecter au port 5433, et il y avait également un rapport indiquant que le client allait se connecter au port 55555.

Cependant, en entrant un numéro court (1234), il n’y a pas un tel problème.

exemple

Écran 2

Dans ce cas, la connexion a échoué sur le port spécifié 1234.

Débriefing

Quel port a-t-il réellement tenté de connecter ? Il est possible d’exécuter un outil IDA Pro et de se connecter à un processus DBeaver.

Pour convertir les endianness, les applications utilisent souvent un ensemble de fonctions “hôte vers réseau TCP/IP” d’une API NetWare. Pour convertir un nombre à deux octets (par exemple, un port TCP), il est possible d’utiliser les fonctions “htons“.

La version “WinAPI” de la fonction “htons” se trouve dans “ws2_32.dll”. Vous devez trouver une importation du module “ws2_32.d” et ouvrir une liste des fonctions.

exemple

Écran 3

Ensuite, vous devez poser un point d’arrêt sur l’appel de la fonction “htons”.

exemple

Écran 4

Si vous définissez le port 1234 et cliquez sur “Tester la connexion”, le débogage s’arrête sur le point d’arrêt.

exemple

Écran 5

Tout d’abord, vous pouvez remarquer que la fonction prend la valeur via la pile.

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

Ces instructions définissent la valeur dans un registre EAX depuis le haut de la pile par décalage vers “arg_0”. Les octets “D2” et “04” au format “Big Endian” sont notre nombre 1234. Mais que se passe-t-il si nous indiquons le nombre 55555 comme port ? En théorie, les octets “03” et “D9” devraient être placés en haut de la pile.

Vous devez cliquer à nouveau sur “Tester la connexion”, mais avec le port 55555.

exemple

Écran 6

C’est étrange, mais ici, nous avons le nombre 5433 dans la pile (15 et 39 octets), qui est un port par défaut de DBMS “Vertica”. On peut supposer que le programme définit directement un mauvais port. Nous devons comprendre où cela se produit. Pour communiquer avec DBMS, Dbeaver utilise JDBS et télécharge par défaut la version 6.1.2.

exemple

Écran 7

Il est possible d’essayer de décompiler un pilote (.jar) et d’explorer ce qui se passe avant la connexion. Un logiciel “fernflower” est bon pour cette tâche. Il prend en charge de nombreuses options pour la décompilation des applications Java. Pour une analyse simple, une décompilation standard sans drapeaux convient.

exemple

Écran 8

Une fois terminé, il y aura des fichiers source décompilés.

Vous devez trouver l’utilisation du port par défaut “HPE Vertica” dans un éditeur de texte, il pourrait être possible de comprendre la substance du problème de conversion du port 55555 en 5433.

exemple

Écran 9

Il y a une tentative de convertir la valeur du port en type Short dans une méthode “loadPreonnectSettings”.

Si cela n’est pas possible, alors le port 5433 sera utilisé. Un type Short en Java est limité par une plage de -32 768 à 32 767, donc la valeur 55555 entraînera une exception. Il s’avère que le problème vient du pilote JDBC lui-même. Essayons de corriger son fonctionnement.

Patch de l’application

Pour patcher des fichiers “class”, il est possible d’utiliser DirtyJOE. Vous devez ouvrir “VConnection.class” depuis une archive jar. Il y a une liste des méthodes de cet objet dans l’onglet “Methods”.

exemple

Écran 10

Un double clic sur la méthode “loadPreConnectSettings” ouvre le CodeEditor.

exemple

Écran 11

Un appel de méthode getShort se produit à la position 0000004E, ce qui signifie que B6 est un code opération de l’instruction, et 003C est une étiquette d’opérande. Il est nécessaire de changer une instruction pour appeler getInt pour un objet Variant.

exemple

Écran 12

Il y a une liste des méthodes de classe dans l’onglet Constant Pool. Le numéro 0060 est exactement le numéro d’une méthode en décimal.

exemple

Écran 13

Une méthode getLnt a été trouvée ci-dessous. Vous devez revenir à un appel get Short et changer la commande par getInt.

exemple

Écran 14

Après cela, vous devez enregistrer la classe et remplacer le fichier original dans une archive jar. Avant le patch, Dbeaver se connectait au port 55555 comme au 5433.

exemple

Écran 15

Maintenant, il utilise le bon port pour se connecter.

Conclusion

Le problème, comme il s’est avéré, n’est pas dans le navigateur Dbeaver lui-même, mais dans le pilote qu’il télécharge pour la communication avec une base de données Vertica.

Mise à jour 09.19

Dbeaver a supprimé le téléchargement de JDBC dans la version 4.3.0 pour Vertica. Cela signifie que l’application n’utilisera pas par défaut la version problématique de ce pilote.

Suivant

Sécurité de Base de Données sur le Blog Big Data d’Amazon AWS

Sécurité de Base de Données sur le Blog Big Data d’Amazon AWS

En savoir plus

Besoin de l'aide de notre équipe de support ?

Nos experts seront ravis de répondre à vos questions.

Informations générales :
[email protected]
Service clientèle et support technique :
support.datasunrise.com
Demandes de partenariat et d'alliance :
[email protected]