DataSunrise erreicht AWS DevOps Kompetenz Status in AWS DevSecOps und Überwachung, Protokollierung, Performance

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

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

Beim Verbinden mit einer Vertica-Datenbank über eine DBeaver-Anwendung wurde ein Problem festgestellt (ce-4.2.2). Wenn Sie einen nicht standardisierten Port eingeben, beispielsweise 55555, versucht das Tool dennoch, sich mit dem Standardport 5433 zu verbinden.

example

Bildschirm 1

Diagnose der Probleme

Unter einer „Grund“-Zeile sehen Sie, dass die Verbindung mit dem Port 5433 fehlgeschlagen ist, und es gab auch einen Bericht, dass der Client eine Verbindung zum Port 55555 herstellen wollte.

Wenn jedoch eine kürzere Nummer (1234) eingegeben wird, tritt das Problem nicht auf.

example

Bildschirm 2

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

Nachbesprechung

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

Zum Konvertieren von Endianness verwenden Anwendungen häufig eine Reihe von Funktionen „host to TCP/IP network“ aus einer NetWare API. Zum Konvertieren einer Zwei-Byte-Nummer (zum Beispiel eines TCP-Ports) ist es möglich, die Funktionen „htons“ zu 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

Bildschirm 3

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

example

Bildschirm 4

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

example

Bildschirm 5

Zunächst können Sie feststellen, dass die Funktion den Wert über den Stack erhält.

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

Diese Anweisungen setzen den Wert in ein EAX-Register vom oberen Stack durch einen Offset zu „arg_0“. „D2“ und „04“-Bytes im „Big Endian“-Format sind unsere Nummer 1234. Aber was ist, wenn wir die Nummer 55555 als Port angeben? Theoretisch sollten „03“ und „D9“-Bytes oben im Stack platziert werden.

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

example

Bildschirm 6

Das ist seltsam, aber hier haben wir die Nummer 5433 im Stack (15 und 39 Bytes), was der Standardport von DBMS „Vertica“ ist. Es kann angenommen werden, dass das Programm sofort einen falschen Port setzt. Wir müssen herausfinden, wo das passiert. Um sich mit DBMS zu verbinden, verwendet Dbeaver JDBC und lädt standardmäßig Version 6.1.2 herunter.

example

Bildschirm 7

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

example

Bildschirm 8

Nach Abschluss der Dekompilierung werden die Quellcodedateien dekompiliert vorliegen.

Sie müssen die Verwendung eines Standardports „HPE Vertica“ in einem Texteditor finden. Vielleicht können Sie die Substanz des Problems mit der Änderung des Ports 55555 in 5433 nachvollziehen.

example

Bildschirm 9

Es wird versucht, den Portwert zu einem Short-Typ in einer „loadPreonnectSettings“-Methode zu casten.

Falls dies nicht möglich ist, wird der Port 5433 verwendet. Ein Short-Typ in Java ist auf einen Bereich von -32.768 bis 32.767 begrenzt, daher wird der Wert 55555 eine Ausnahme werfen. Es stellt sich heraus, dass das Problem im JDBC-Treiber selbst liegt. Versuchen wir, seine Funktionsweise zu behoben.

Anwendungspatches

Zum Patchen von „class“-Dateien ist es möglich, DirtyJOE zu verwenden. Sie müssen „VConnection.class“ aus einem JAR-Archiv öffnen. Im „Methods“-Tab befindet sich eine Liste der Methoden dieses Objekts.

example

Bildschirm 10

Ein Doppelklick auf die Methode „loadPreConnectSettings“ öffnet den Codeeditor.

example

Bildschirm 11

Ein Aufruf der getShort-Methode tritt an Position 0000004E auf, das bedeutet, dass B6 ein Operationscode einer Anweisung ist und 003C ist eine Operandenmarke. Es ist notwendig, eine Anweisung für den getInt-Aufruf für ein Variant-Objekt zu ändern.

example

Bildschirm 12

Im Tab „Constant Pool“ befindet sich eine Liste der Klassenmethoden. Die Zahl 0060 ist genau die Nummer einer Methode in Dezimal.

example

Bildschirm 13

Eine Methode getInt wurde unten gefunden. Sie müssen zum Aufruf der getShort-Methode zurückkehren und den Befehl durch getInt ändern.

example

Bildschirm 14

Danach müssen Sie die Klasse speichern und die Originaldatei im JAR-Archiv ersetzen. Vor dem Patchen verband sich Dbeaver mit dem Port 55555 wie mit 5433.

example

Bildschirm 15

Jetzt wird der richtige Port für die Verbindung verwendet.

Fazit

Das Problem liegt, wie sich herausstellte, nicht im Dbeaver-Browser selbst, sondern im Treiber, den er für die Kommunikation mit einer Vertica-Datenbank herunterlädt.

Update 09.19

Dbeaver hat in der Version 4.3.0 das Herunterladen des JDBC für Vertica entfernt. Das bedeutet, dass die Anwendung die problematische Version dieses Treibers nicht mehr standardmäßig verwenden wird.

Nächste

Datenbanksicherheit auf dem Amazon AWS Big Data Blog

Datenbanksicherheit auf dem 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]