2016-02-29 26 views
9

Sono inciampato di recente su un problema con i processi java in cui è possibile utilizzare uno strumento come http://processhacker.sourceforge.net per ispezionare la memoria dell'applicazione runtime. Lo strumento: rivela la password utilizzata per l'autenticazione nell'applicazione. Ho esaminato il problema e la password sembra azzerata dopo essere stata utilizzata. Ho provato a fare un dump dell'heap usando Java Mission Control (con GC disabilitato) e vedere se riesco a recuperare la passsword. Utilizzo dello strumento di memoria Eclipse mi sono imbattuto semplice query del tipo:Password nella memoria del processo ma non nel dump dell'heap

SELECT * FROM char[] c WHERE toString(c).startsWith("mypasswordsample") 

Ma questo non ha dato alcun risultato, e la password è stata ancora visibile nel l'hacker processo dopo un'ora o giù di lì. Se eseguo il dump dell'heap con il GC attivato, l'hacker di elaborazione sembra non trovare più la password.

Cosa sta facendo JVM dietro le quinte? Perché non riesco a trovare la password negli oggetti live? Posso fare una sorta di scarico per vedere dove è memorizzata questa password, chi l'ha creata e perché non è stata azzerata?

+0

"chi lo ha creato e perché non è stato azzerato" - che è totalmente a carico dell'applicazione. Non sarà possibile trovare risposte a questa domanda in un dump della memoria – f1sh

+0

Hai ragione, ma speravo di trovare il nome dell'attributo o qualcosa che mi aiuti a rintracciare il problema nel codice –

+2

I dati della password potrebbero ancora risiedere nello spazio inattivo di YoungGen, nella memoria nativa o altrove a seconda di h ow è usato e cancellato. Sarà più facile dire se fornisci un codice rilevante. Process Hacker mostra un indirizzo dove trova i dati? – apangin

risposta

1

Questo è troppo specifico per rispondere, ma molte password (in particolare con JAAS) utilizzeranno un array di caratteri anziché una stringa e cancelleranno esplicitamente i caratteri dopo l'uso. Quindi se hai un dump dell'heap mentre stavano effettuando l'accesso potresti vederlo; ma se no, allora non lo faresti. Vedere lo PasswordCallback di JAAS che utilizza questo meccanismo.

(Un array di caratteri viene utilizzato perché un array è mutabile, quindi è possibile passare in seguito e impostare ogni carattere in uno spazio o \0 una volta utilizzato per l'autenticazione. In questo modo anche se il GC non lo pulisce rapidamente, il contenuto della memoria non deve contenere i dati per i processi di snooping