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

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

example

Schermata 1

Diagnosi dei Problemi

Sotto la riga “Ragione” si può vedere che non è riuscito a connettersi alla porta 5433, inoltre c’è un rapporto che il client stava tentando di connettersi alla porta 55555.

Tuttavia, inserendo un numero breve (1234), non si verifica tale problema.

example

Schermata 2

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

Resoconto

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

Per convertire l’Endianness, le applicazioni spesso usano 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 utilizzare le funzioni “htons”.

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

example

Schermata 3

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

example

Schermata 4

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

example

Schermata 5

Per prima cosa, si può notare che la funzione prende il valore tramite lo stack.

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

Queste istruzioni impostano il valore nel registro EAX dalla cima dello stack tramite 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? In teoria, i byte “03” e “D9” dovrebbero essere posizionati in cima allo stack.

È necessario cliccare nuovamente su “Test Connection”, ma con la porta 55555.

example

Schermata 6

È strano, ma qui abbiamo un numero 5433 nello stack (byte 15 e 39), che è la porta predefinita di DBMS “Vertica”. Si può supporre che il programma imposti subito una porta sbagliata. Dobbiamo capire dove avviene. Per comunicare con DBMS DBeaver utilizza JDBS e carica una versione 6.1.2. per predefinito.

example

Schermata 7

È possibile provare a decompilare un driver (.jar) ed 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 è adatta una decompilazione standard senza flag.

example

Schermata 8

Una volta completato, ci saranno file sorgenti decompilati.

È necessario trovare l’uso della porta predefinita “HPE Vertica” in un editor di testo, potrebbe permettere di capire la sostanza del problema con il cambiamento della porta 55555 in 5433.

example

Schermata 9

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

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

Patching dell’Applicazione

Per le patching dei file “class” è possibile utilizzare DirtyJOE. È necessario aprire “VConnection.class” da un archivio jar. C’è un elenco dei metodi di questo oggetto nella scheda “Metodi”.

example

Schermata 10

Doppio clic sul metodo “loadPreConnectSettings” apre CodeEditor.

example

Schermata 11

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

example

Schermata 12

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

example

Schermata 13

È stato trovato un metodo getInt sotto. È necessario tornare a una chiamata getShort e cambiare il comando per getInt.

example

Schermata 14

Dopo ciò, è necessario salvare la classe e sostituire il file originale nell’archivio jar. Prima del patching, DBeaver si connetteva alla porta 55555 come alla 5433.

example

Schermata 15

Ora sta usando la porta giusta per la connessione.

Conclusione

Il problema, come si è scoperto, non è nel browser DBeaver stesso, ma nel driver che scarica per la comunicazione con il database Vertica.

Aggiornamento 09.19

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

Successivo

Sicurezza nel Database su Amazon AWS Big Data Blog

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]