In questo articolo trattiamo la Log Injection, una tipologia di attacco di per sé non grave, ma che può nascondere attacchi ben più importanti.
Il Log Injection (chiamato anche Log Forging) è una attacco in cui l’attaccante riesce a scrivere direttamente all’interno delle informazioni di tracciamento di un applicativo.
All’interno delle applicazioni c’è necessità di tenere traccia degli eventi per risolvere tempestivamente e in maniera efficace i possibili problemi futuri. Le applicazioni in genere utilizzano dei file di testo per memorizzare le informazioni sugli eventi accaduti nel sistema e in caso di problemi, tali log vengono analizzati. L’analisi dei log può essere manuale o automatizzata. L’analisi automatizzata viene utilizzata per filtrare le informazioni “quotidiane” dalle informazioni relativi ad eventi non ordinari o a problemi.
Un attacco di log injection può essere indirizzato al sistema di analisi, tramite l’inserimento di comandi, oppure utilizzato per coprire le tracce lasciate da un attacco precedente, molto più grave.
Spesso chi si occupa della manutenzione tende a creare log che (si spera) permettano di essere un buon supporto nella fase di sviluppo delle correttive. A volte vengono inseriti anche gli input provenienti dai form in cui digita l’input è deciso dall’utente.
Consideriamo l’esempio che segue e che trovate sul sito dell’OWASP.
Esempio
String val = request.getParameter("val");
try {
value = Integer.parseInt(val);
}
catch (NumberFormatException) {
log.info("Failed to parse val = " + val);
}
Il frammento di codice non è poi così raro, tuttavia sottintende la volontà del programmatore di porre rimedio velocemente a eventuali errori di conversione dei valori.
Risoluzione
Inserire direttamente gli input utente nei log è una misura estrema, che bisogna utilizzare con parsimonia.
Pertanto una prima soluzione al problema rimuovere l’istruzione che scrive il contenuto dell’input dell’utente direttamente nel log. Pertanto nel caso specifico il frammento che segue risulterebbe ugualmente valido:
String val = request.getParameter("val");
try {
value = Integer.parseInt(val);
}
catch (NumberFormatException) {
log.info("Failed to parse val");
}
Se è strettamente necessario salvare gli input utenti nei log, tali input vanno verificati. Spesso è più importante scrivere la causa dell’errore, e riferendoci all’esempio potremmo indicare il carattere non consentito che è stato utilizzato.
Fonti:
Owasp, log injection