DataSunrise Consegue la Certificazione AWS DevOps Competency per AWS DevSecOps e Monitoraggio, Logging e Performance

Una Storia su Come Abbiamo Risolto il Driver JDBC di Vertica per DBeaver

Una Storia su Come Abbiamo Risolto il Driver JDBC di Vertica per DBeaver

Durante la connessione a un database Vertica tramite l’applicazione DBeaver, è stato rilevato un problema (ce-4.2.2). Se si inserisce una porta non standard, per esempio 55555, lo strumento tenta comunque di connettersi alla porta predefinita 5433.

example

Schermata 1

Diagnosi dei problemi

Sotto una linea “Motivo” si può vedere che non è riuscito a connettersi alla porta 5433, inoltre c’era un rapporto che il client stava per connettersi alla porta 55555.

Tuttavia, inserendo un numero corto (1234), non c’è alcun problema.

example

Schermata 2

In questo caso, la connessione non è riuscita sulla porta specificata 1234.

Debriefing

A quale porta è stato tentato di connettersi, realmente? È possibile eseguire uno strumento IDA Pro e connettersi a un processo DBeaver.

Per convertire Endianness, le applicazioni usano spesso un set di funzioni “host to TCP/IP network” da un’API NetWare. Per convertire un numero a due byte (ad esempio, una porta TCP) è possibile usare le funzioni “htons”.

La versione “WinAPI” della funzione “htons” si trova in “ws2_32.dll”. È necessario trovare un’importazione del modulo “ws2_32.dll” e aprire un elenco delle funzioni.

example

Schermata 3

Poi, è necessario impostare un breakpoint sulla chiamata della funzione “htons”.

example

Schermata 4

Se si imposta la porta 1234 e si clicca su “Test connection”, allora il debug si ferma sul breakpoint.

example

Schermata 5

Prima, si può notare che la funzione prende il valore tramite stack.

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

Queste istruzioni impostano il valore in un registro EAX dalla cima dello stack per offset a “arg_0”. I byte “D2” e “04” nel formato “Big Endian” sono il nostro numero 1234. Ma cosa succede se indichiamo il numero 55555 come porta? Teoricamente, i byte “03” e “D9” dovrebbero essere posizionati in cima allo stack.

È necessario cliccare di nuovo “Test Connection”, ma con la porta 55555.

example

Schermata 6

È strano, ma qui abbiamo un numero 5433 nello stack (15 e 39 byte), che è una porta predefinita di DBMS “Vertica”. Si può supporre che il programma imposti subito una porta sbagliata. Bisogna capire dove succede. Per comunicare con DBMS Dbeaver usa JDBC e carica una versione 6.1.2. per impostazione predefinita.

example

Schermata 7

È possibile provare a decompilare un driver (.jar) e esplorare cosa succede prima della connessione. Un software “fernflower” è buono per questo compito. Supporta molte opzioni per la decompilazione di applicazioni Java. Per un’analisi semplice, una decompilazione standard senza flag è adatta.

example

Schermata 8

Una volta completata, ci saranno i file sorgenti decompilati.

È necessario trovare l’uso della porta predefinita “HPE Vertica” in un editor di testo, può essere in grado di capire la sostanza del problema con il cambio della porta 55555 in 5433.

example

Schermata 9

C’è un tentativo di convertire il valore della porta in un tipo Short nel metodo “loadPreonnectSettings”.

Se non è possibile allora verrà utilizzata la porta 5433. Un tipo Short in Java è limitato da un intervallo -32,768 – 32,767, quindi il valore 55555 sarà un’eccezione throw. Si scopre che il problema è nel driver jdbc stesso. Proviamo a risolvere il suo funzionamento.

Patch dell’applicazione

Per patchare i file “class” è possibile usare DirtyJOE. Bisogna aprire “VConnection.class” da un archivio jar. C’è un elenco dei metodi di questo oggetto nella scheda “Methods”.

example

Schermata 10

Fare doppio clic sul metodo “loadPreConnectSettings” apre il CodeEditor.

example

Schermata 11

Una chiamata del metodo getShort avviene in posizione 0000004E, significa che B6 è un codice operativo di un’istruzione, e 003C è un’etichetta di operando. È necessario cambiare un’istruzione per la chiamata getInt per un oggetto Variant.

example

Schermata 12

C’è un elenco di metodi di classe nella scheda Constant Pool. Il numero 0060 è esattamente il numero di un metodo in decimale.

example

Schermata 13

Un metodo getInt è stato trovato in basso. È necessario tornare alla chiamata getShort e cambiare il comando con getInt.

example

Schermata 14

Dopo, è necessario salvare la classe e sostituire il file originale in un archivio jar. Prima di patchare, Dbeaver si connetteva alla porta 55555 come alla 5433.

example

Schermata 15

Ora sta usando la porta giusta per connettersi.

Conclusione

Il problema, come si è scoperto, non è nel browser Dbeaver stesso, ma nel driver che scarica per comunicare con un database Vertica.

Aggiornamento 09.19

Dbeaver ha rimosso il download JDBC nella release 4.3.0 per Vertica. Significa che l’applicazione non userà la versione problematica di questo driver per impostazione predefinita.

Successivo

DataSunrise Sicurezza nel Database su Amazon AWS Big Data Blog

DataSunrise Sicurezza nel Database su Amazon AWS Big Data Blog

Scopri di più

Ha bisogno del nostro team di supporto?

I nostri esperti saranno lieti di rispondere alle Sue domande.

Informazioni generali:
[email protected]
Servizio clienti e supporto tecnico:
support.datasunrise.com
Richieste di collaborazione e alleanza:
[email protected]