DataSunrise sponsert AWS re:Invent 2024 in Las Vegas, bitte besuchen Sie uns am Stand #2158 von DataSunrise

Eine Geschichte darüber, wie wir den Vertica JDBC-Treiber für DBeaver repariert haben

Eine Geschichte darüber, wie wir den Vertica JDBC-Treiber für DBeaver repariert haben

Beim Verbinden mit einer Vertica-Datenbank über eine DBeaver-Anwendung wurde ein Problem festgestellt (ce-4.2.2). Wenn Sie einen nicht standardmäßigen Port eingeben, zum Beispiel 55555, versucht das Tool trotzdem, eine Verbindung zum Standardport 5433 herzustellen.

example

Bildschirmfoto 1

Diagnose der Probleme

Unter einer „Ursache“-Zeile können Sie sehen, dass die Verbindung zum Port 5433 fehlgeschlagen ist. Es wurde auch berichtet, dass der Client versucht hat, eine Verbindung zum Port 55555 herzustellen.

Beim Eingeben einer kurzen Zahl (1234) gibt es jedoch kein solches Problem.

example

Bildschirmfoto 2

In diesem Fall schlug die Verbindung am angegebenen Port 1234 fehl.

Debriefing

Zu welchem Port wurde tatsächlich versucht, eine Verbindung herzustellen? Es ist möglich, ein IDA Pro-Tool zu starten und eine Verbindung zu einem DBeaver-Prozess herzustellen.

Zum Konvertieren von Endianness verwenden Anwendungen oft eine Reihe von Funktionen „host to TCP/IP network“ aus einer NetWare-API. Zum Konvertieren einer Zwei-Byte-Zahl (zum Beispiel eines TCP-Ports) können Sie die „htons“ Funktionen verwenden.

Die „WinAPI“-Version der „htons“-Funktion befindet sich in „ws2_32.dll“. Sie müssen einen Import des Moduls „ws2_32.d“ finden und eine Liste der Funktionen öffnen.

example

Bildschirmfoto 3

Dann müssen Sie einen Haltepunkt beim Aufruf der „htons“-Funktion setzen.

example

Bildschirmfoto 4

Wenn Sie den Port 1234 festlegen und auf „Testverbindung“ klicken, stoppt das Debugging am Haltepunkt.

example

Bildschirmfoto 5

Zuerst können Sie sehen, dass die Funktion den Wert über den Stack nimmt.

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

Diese Anweisungen setzen den Wert in ein EAX-Register vom oberen Ende des Stacks über das Offset zu „arg_0“. Bytes „D2“ und „04“ im „Big Endian“-Format sind unsere Zahl 1234. Aber was, wenn wir die Zahl 55555 als Port angeben? Theoretisch sollten sich die Bytes „03“ und „D9“ oben im Stack befinden.

Sie müssen erneut auf „Testverbindung“ klicken, diesmal mit dem Port 55555.

example

Bildschirmfoto 6

Das ist seltsam, aber hier haben wir die Zahl 5433 im Stack (15 und 39 Bytes), was der Standardport des DBMS „Vertica“ ist. Es kann angenommen werden, dass das Programm einmalig einen falschen Port festlegt. Wir müssen herausfinden, wo es passiert. Um mit dem DBMS zu kommunizieren, verwendet DBeaver JDBC und lädt standardmäßig Version 6.1.2.

example

Bildschirmfoto 7

Es ist möglich, zu versuchen, einen Treiber (.jar) zu dekompilieren und zu untersuchen, was vor der Verbindung passiert. Die Software „fernflower“ ist gut für diese Aufgabe geeignet. Sie unterstützt viele Optionen zur Dekompilierung von Java-Anwendungen. Für eine einfache Analyse ist eine Standard-Dekompilierung ohne Flags geeignet.

example

Bildschirmfoto 8

Nach Abschluss gibt es dekompilierte Quelldateien.

Sie müssen die Verwendung des Standardports „HPE Vertica“ in einem Texteditor finden, möglicherweise können Sie das Problem mit der Umwandlung des Ports 55555 in 5433 verstehen.

example

Bildschirmfoto 9

Im „loadPreconnectSettings“ -Methode wird versucht, den Portwert in einen Short-Typ umzuwandeln.

Wenn dies nicht möglich ist, wird der Port 5433 verwendet. Der Short-Typ in Java ist im Bereich -32.768 bis 32.767 begrenzt, daher wird der Wert 55555 eine Ausnahme auslösen. Es stellt sich heraus, dass das Problem im JDBC-Treiber selbst liegt. Versuchen wir, seine Arbeit zu beheben.

Anwendungs-Patching

Für das Patchen von „class“-Dateien ist es möglich, DirtyJOE zu verwenden. Sie müssen „VConnection.class“ aus einem Jar-Archiv öffnen. Es gibt eine Liste der Methoden dieses Objekts im Reiter „Methods“.

example

Bildschirmfoto 10

Durch Doppelklicken auf die Methode „loadPreConnectSettings“ wird der Code-Editor geöffnet.

example

Bildschirmfoto 11

Ein Aufruf der getShort-Methode erfolgt an Position 0000004E, was bedeutet, dass B6 ein Operationscode einer Anweisung ist und 003C ein Operanden-Label ist. Es ist notwendig, eine Anweisung zum Aufruf von getInt für ein Variant-Objekt zu ändern.

example

Bildschirmfoto 12

Es gibt eine Liste der Methoden der Klasse im Constant-Pool-Tab. Die Zahl 0060 ist genau die Nummer der Methode in Dezimal.

example

Bildschirmfoto 13

Eine Methode getInt wurde unten gefunden. Sie müssen zur getShort-Anweisung zurückkehren und den Befehl durch getInt ersetzen.

example

Bildschirmfoto 14

Danach müssen Sie die Klasse speichern und die Originaldatei in einem Jar-Archiv ersetzen. Vor dem Patchen stellte DBeaver eine Verbindung zum Port 55555 wie zum 5433 her.

example

Bildschirmfoto 15

Jetzt verwendet es den richtigen Port für die Verbindung.

Fazit

Wie sich herausstellte, liegt das Problem nicht im DBeaver-Browser selbst, sondern im Treiber, den es zum Kommunizieren mit einer Vertica-Datenbank herunterlädt.

Update 09.19

DBeaver hat das Herunterladen von JDBC im Release 4.3.0 für Vertica entfernt. Das bedeutet, dass die Anwendung standardmäßig nicht die problematische Version dieses Treibers verwenden wird.

Nächste

DataSunrise Datenbanksicherheit im Amazon AWS Big Data Blog

DataSunrise Datenbanksicherheit im Amazon AWS Big Data Blog

Erfahren Sie mehr

Benötigen Sie die Hilfe unseres Support-Teams?

Unsere Experten beantworten gerne Ihre Fragen.

Allgemeine Informationen:
[email protected]
Kundenservice und technischer Support:
support.datasunrise.com
Partnerschafts- und Allianz-Anfragen:
[email protected]