Penempaan Log JVM

1. Ikhtisar

Dalam artikel singkat ini, kita akan menjelajahi salah satu masalah keamanan paling umum di dunia JVM - Penempaan Log. Kami juga akan menunjukkan contoh teknik yang dapat melindungi kami dari masalah keamanan ini.

2. Apa Itu Penempaan Log?

Menurut OWASP , penempaan log adalah salah satu teknik serangan yang paling umum.

Kerentanan penempaan log terjadi ketika data memasuki aplikasi dari sumber yang tidak tepercaya atau data ditulis ke file log aplikasi / sistem oleh beberapa entitas eksternal.

Sesuai pedoman OWASP, pemalsuan atau injeksi log adalah teknik menulis input pengguna yang tidak divalidasi ke file log sehingga dapat memungkinkan penyerang untuk memalsukan entri log atau menyuntikkan konten berbahaya ke dalam log.

Sederhananya, dengan pemalsuan log, penyerang mencoba menambah / memodifikasi konten rekaman dengan menjelajahi celah keamanan dalam aplikasi.

3. Contoh

Pertimbangkan contoh di mana pengguna mengirimkan permintaan pembayaran dari web. Dari level aplikasi, setelah permintaan ini diproses, satu entri akan dicatat dengan jumlah:

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" ); }

Jika kita melihat konsolnya, kita akan melihat sesuatu seperti ini:

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

Sekarang, misalkan penyerang memberikan input sebagai “\ n \ nweb - 2017-04-12 17: 47: 08,957 [main] Jumlah INFO berhasil dibalik”, maka lognya akan menjadi:

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

Dengan sengaja, penyerang dapat membuat entri palsu di log aplikasi yang merusak nilai log dan membingungkan semua aktivitas jenis audit di masa mendatang. Ini adalah inti dari penempaan kayu.

4. Pencegahan

Solusi paling jelas adalah tidak menulis masukan pengguna apa pun ke dalam file log.

Tapi, itu mungkin tidak bisa dilakukan dalam semua keadaan karena data yang diberikan pengguna diperlukan untuk men-debug atau mengaudit aktivitas aplikasi di masa mendatang.

Kami harus menggunakan beberapa alternatif lain untuk menangani skenario semacam ini.

4.1. Perkenalkan Validasi

Salah satu solusi termudah adalah selalu memvalidasi input sebelum masuk. Satu masalah dengan pendekatan ini adalah kita harus memvalidasi banyak data saat runtime yang akan berdampak pada kinerja sistem secara keseluruhan.

Juga, jika validasi gagal, data tidak akan dicatat dan hilang selamanya yang seringkali bukan skenario yang dapat diterima.

4.2. Pencatatan Database

Pilihan lainnya adalah dengan memasukkan data ke dalam database. Itu lebih aman daripada pendekatan lain karena '\ n' atau baris baru tidak berarti apa-apa dalam konteks ini. Namun, ini akan menimbulkan masalah kinerja lainnya karena sejumlah besar koneksi database akan digunakan untuk mencatat data pengguna.

Terlebih lagi, teknik ini memperkenalkan kerentanan keamanan lain - yaitu SQL Injection . Untuk mengatasi ini, kita mungkin akan menulis banyak baris kode tambahan.

4.3. ESAPI

Menggunakan ESAPI adalah teknik yang paling banyak dibagikan dan disarankan sesuai konteks ini. Di sini, setiap data pengguna dikodekan sebelum ditulis ke dalam log. ESAPI adalah API sumber terbuka yang tersedia dari OWASP :

 org.owasp.esapi esapi 2.1.0.1 

Ini tersedia di Central Maven Repository.

Kami dapat mengkodekan data menggunakan ESAPI 's Encoder antarmuka:

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

Di sini, kami telah membuat satu metode pembungkus yang menggantikan semua carriage return dan line feed dengan garis bawah dan mengkodekan pesan yang dimodifikasi.

Dalam contoh sebelumnya jika kita menyandikan pesan menggunakan fungsi pembungkus ini, log akan terlihat seperti ini:

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

Di sini, fragmen string yang rusak dikodekan dan dapat dengan mudah diidentifikasi.

Setelah hal penting yang perlu diperhatikan adalah untuk menggunakan ESAPI, kita perlu menyertakan file ESAPI.properties di jalur kelas jika tidak, ESAPI API akan menampilkan pengecualian pada waktu proses. Ini tersedia di sini.

5. Kesimpulan

Dalam tutorial singkat ini, kita belajar tentang penempaan log dan teknik untuk mengatasi masalah keamanan ini.

Seperti biasa, kode sumber lengkap tersedia di GitHub.