Penempaan Log JVM

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan meneroka salah satu masalah keselamatan yang paling biasa di dunia JVM - Log Forging. Kami juga akan menunjukkan teknik contoh yang dapat melindungi kami dari masalah keselamatan ini.

2. Apakah Penempaan Log?

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

Kerentanan penempaan log berlaku apabila data memasuki aplikasi dari sumber yang tidak dipercaya atau data ditulis ke fail log aplikasi / sistem oleh beberapa entiti luaran.

Sesuai panduan OWASP penempaan log atau suntikan adalah teknik menulis input pengguna yang tidak sah ke fail log sehingga dapat memungkinkan penyerang memalsukan entri log atau menyuntikkan kandungan berbahaya ke dalam log.

Ringkasnya, dengan penempaan log, penyerang cuba menambahkan / mengubah kandungan rekod dengan meneroka celah keselamatan dalam aplikasi.

3. Contoh

Pertimbangkan contoh di mana pengguna mengemukakan permintaan pembayaran dari web. Dari peringkat 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" ); }

Sekiranya kita melihat konsol, kita akan melihat sesuatu seperti ini:

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

Sekarang, anggap penyerang memberikan input sebagai "\ n \ nweb - 2017-04-12 17: 47: 08,957 [main] Jumlah INFO berjaya dibalikkan", maka log akan:

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 telah dapat membuat entri palsu dalam log aplikasi yang merosakkan nilai log dan membingungkan kegiatan jenis audit di masa depan. Ini adalah intipati penempaan log.

4. Pencegahan

Penyelesaian yang paling jelas adalah tidak memasukkan input pengguna ke dalam fail log.

Tetapi, itu mungkin tidak dapat dilakukan dalam semua keadaan kerana pengguna yang diberikan data diperlukan untuk melakukan debug atau mengaudit aktiviti aplikasi di masa depan.

Kita harus menggunakan beberapa alternatif lain untuk menangani senario seperti ini.

4.1. Memperkenalkan Pengesahan

Salah satu penyelesaian yang paling mudah ialah mengesahkan input sebelum masuk. Satu masalah dengan pendekatan ini adalah bahawa kita harus mengesahkan banyak data pada waktu berjalan yang akan mempengaruhi prestasi keseluruhan sistem.

Juga, jika pengesahan gagal, data tidak akan dicatat dan hilang selamanya yang selalunya bukan senario yang boleh diterima.

4.2. Pembalakan Pangkalan Data

Pilihan lain adalah memasukkan data ke dalam pangkalan data. Itu lebih selamat daripada pendekatan lain kerana '\ n' atau garis baru tidak ada makna dalam konteks ini. Walau bagaimanapun, ini akan menimbulkan kebimbangan prestasi yang lain kerana sebilangan besar sambungan pangkalan data akan digunakan untuk mencatat data pengguna.

Terlebih lagi, teknik ini memperkenalkan kelemahan keselamatan lain - iaitu SQL Injection . Untuk mengatasi ini, kita mungkin akhirnya menulis banyak baris kod tambahan.

4.3. ESAPI

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

 org.owasp.esapi esapi 2.1.0.1 

Ia boleh didapati di Central Maven Repository.

Kita boleh mengekod data menggunakan ESAPI 's Encoder muka:

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 kaedah pembungkus yang menggantikan semua pemulangan kereta dan umpan baris dengan garis bawah dan mengekod mesej yang diubah.

Dalam contoh sebelumnya jika kita mengekodkan mesej menggunakan fungsi pembungkus ini, log akan kelihatan 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, serpihan rentetan yang rosak dikodkan dan dapat dikenali dengan mudah.

Perkara penting yang perlu diperhatikan ialah untuk menggunakan ESAPI, kita perlu memasukkan fail ESAPI.properties di jalan kelas yang lain API ESAPI akan memberikan pengecualian pada waktu runtime. Ia ada di sini.

5. Kesimpulan

Dalam tutorial ringkas ini, kami belajar tentang penempaan log dan teknik untuk mengatasi masalah keselamatan ini.

Seperti biasa, kod sumber penuh boleh didapati di GitHub.