Forgiatura di tronchi JVM

1. Panoramica

In questo rapido articolo, esploreremo uno dei problemi di sicurezza più comuni nel mondo JVM : Log Forging. Mostreremo anche una tecnica di esempio che può proteggerci da questo problema di sicurezza.

2. Che cos'è la forgiatura dei tronchi?

Secondo OWASP , la forgiatura dei log è una delle tecniche di attacco più comuni.

Le vulnerabilità di forgiatura dei registri si verificano quando i dati entrano in un'applicazione da un'origine non attendibile oppure i dati vengono scritti in un file di registro dell'applicazione / del sistema da un'entità esterna.

Secondo le linee guida OWASP, la forgiatura o l'iniezione dei log è una tecnica per scrivere input utente non convalidato nei file di log in modo che possa consentire a un utente malintenzionato di falsificare le voci di log o iniettare contenuto dannoso nei log.

In poche parole, forgiando i log, un utente malintenzionato tenta di aggiungere / modificare il contenuto dei record esplorando le falle di sicurezza nell'applicazione.

3. Esempio

Considera un esempio in cui un utente invia una richiesta di pagamento dal web. Dal livello dell'applicazione, una volta elaborata questa richiesta, verrà registrata una voce con l'importo:

private final Logger logger = LoggerFactory.getLogger(LogForgingDemo.class); public void addLog( String amount ) { logger.info( "Amount credited = {}" , amount ); } public static void main( String[] args ) { LogForgingDemo demo = new LogForgingDemo(); demo.addLog( "300" ); }

Se guardiamo la console, vedremo qualcosa del genere:

web - 2017-04-12 17:45:29,978 [main] INFO com.baeldung.logforging.LogForgingDemo - Amount credited = 300

Ora, supponiamo che un utente malintenzionato fornisca l'input come "\ n \ nweb - 2017-04-12 17: 47: 08,957 [principale] INFO Importo stornato correttamente", il registro sarà:

web - 2017-04-12 17:52:14,124 [main] INFO com.baeldung.logforging. LogForgingDemo - Amount credited = 300 web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully

Intenzionalmente, l'aggressore è stato in grado di creare una voce contraffatta nel registro dell'applicazione che ha danneggiato il valore dei registri e confonde qualsiasi attività di tipo di controllo in futuro. Questa è l'essenza della forgiatura dei tronchi.

4. Prevenzione

La soluzione più ovvia è non scrivere alcun input dell'utente nei file di registro.

Tuttavia, ciò potrebbe non essere possibile in tutte le circostanze poiché i dati forniti dall'utente sono necessari per il debug o per il controllo dell'attività dell'applicazione in futuro.

Dobbiamo usare qualche altra alternativa per affrontare questo tipo di scenario.

4.1. Introdurre la convalida

Una delle soluzioni più semplici è sempre convalidare l'input prima della registrazione. Un problema con questo approccio è che dovremo convalidare molti dati in fase di esecuzione, il che avrà un impatto sulle prestazioni complessive del sistema.

Inoltre, se la convalida fallisce, i dati non verranno registrati e andranno persi per sempre, il che spesso non è uno scenario accettabile.

4.2. Registrazione database

Un'altra opzione è registrare i dati nel database. Questo è più sicuro dell'altro approccio poiché "\ n" o newline non significa nulla in questo contesto. Tuttavia, ciò solleverà un altro problema di prestazioni poiché verrà utilizzato un numero enorme di connessioni al database per la registrazione dei dati dell'utente.

Inoltre, questa tecnica introduce un'altra vulnerabilità di sicurezza, ovvero SQL Injection . Per risolvere questo problema, potremmo finire per scrivere molte righe di codice extra.

4.3. ESAPI

L'utilizzo di ESAPI è la tecnica più condivisa e consigliabile in questo contesto. Qui, ogni singolo dato utente viene codificato prima di essere scritto nei log. ESAPI è un'API open source disponibile da OWASP :

 org.owasp.esapi esapi 2.1.0.1 

È disponibile nel repository Maven centrale.

Siamo in grado di codificare i dati utilizzando ESAPI s' Encoder Interfaccia:

public String encode(String message) { message = message.replace( '\n' , '_' ).replace( '\r' , '_' ) .replace( '\t' , '_' ); message = ESAPI.encoder().encodeForHTML( message ); return message; }

Qui, abbiamo creato un metodo wrapper che sostituisce tutti i ritorni a capo e gli avanzamenti riga con trattini bassi e codifica il messaggio modificato.

Nell'esempio precedente, se codifichiamo il messaggio utilizzando questa funzione wrapper, il log dovrebbe essere simile a questo:

web - 2017-04-12 18:15:58,528 [main] INFO com.baeldung.logforging. LogForgingDemo - Amount credited = 300 __web - 2017-04-12 17:47:08,957 [main] INFO Amount reversed successfully

Qui, il frammento di stringa danneggiato è codificato e può essere facilmente identificato.

Un punto importante da notare è che per usare ESAPI dobbiamo includere il file ESAPI.properties nel classpath altrimenti l' API ESAPI genererà un'eccezione in fase di esecuzione. È disponibile qui.

5. conclusione

In questo breve tutorial, abbiamo appreso la forgiatura dei log e le tecniche per superare questo problema di sicurezza.

Come sempre, il codice sorgente completo è disponibile su GitHub.