Log4j2 Vulnerability - Framework terdampak
Pendahuluan
Tentang sekilas Log4j2 Vulnerability / Kerentanan Log4j2 . link
Tentang penyebab Log4j2 Vulnerabiltiy / Kerentanan Log4j2 link
Mitigasi Vulnerability Log4j2 / Kerentanan Log4j2 terkait dengan Library nya sendiri. link
Mitigasi Vulnerability Log4j2 / Kerentanan Log4j2 yang tidak terkait dengan Library nya sendiri. link
Sekarang kita akan membahas mengenai Framework aplikasi yang terkenal yang berbasiskan Java.
Apakah terdampak dengan Log4j Vulnerability ini ?
Jadi apa saja yang akan kita bahas ?
1. Android
Android menggunakan banyak library Java. Untuk fasilitas logging di Android SDK sendiri secara default tidak menggunakan Log4j.
Biasanya di Android menggunakan library dari Android sendiri yaitu import android.util.Log;
Dan juga Android OS tidak mengizinkan/tidak mempunyai service JNDI / JNDI protocol.
Jadi dalam hal Log4j2 Vulnerability ini, Android tidak terdampak dan aman.
Kecuali tentunya beda ceritanya kalau aplikasi Android ini melakukan komunikasi REST dengan Java Application Server, maka yang beresiko adalah Java Application Server nya yang bisa jadi memakai Log4j2.
2. Spring Boot
Spring Boot banyak menggunakan library lain dalam paket librarynya.
Termasuk untuk logging.
Dari web offisial nya Spring Boot di sini, implementasi default logging dari Spring Boot adalah Logback.
Spring Boot sebenarnya mengakomodasi secara default 3 jenis implementasi Logging :
- Logback –> implementasi default dari Spring Boot
- Log4j2
- Java Util Logging (JUL) bawaaan dari JDK Java. –> sudah include di JDK nya.
Pemilihan jenis implementasi Logging yang dipilih tentunya dilakukan di level code, atau di level dependency managementnya (seperti pom.xml).
Tetapi sebagaimana yang disampaikan diatas, Implementasi default logging Spring-Boot adalah Logback.
Contoh konfigurasi standard di Spring-Boot, yang otomatis akan include Logback sebagai Logging Frameworknya.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web akan secara otomatis memasukkan spring-boot-starter-logging dalam library nya.
didalam spring-boot-starter-logging akan mempunyai dependency ke library berikut :
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
</dependencies>
Kalau kita lihat di hirarki package nya :
Jadi kelihatan kalau library Logback secara default sudah diload oleh Spring-Boot jika kita tidak menambahkan library logging lain selain dari spring-boot-starter-web
Bagaimana kalau kita mau memakai Log4j2 ?
Untuk bisa include Log4j2 di Spring Boot, kita harus melakukan 2 tahapan berikut :
- exclude spring-boot-starter-logging dari dependency spring-boot-starter, yang dengan artinya juga exclude library logback-classic.
- tambahkan spring-boot-starter-log4j2 sebagai library Log4j2.
Contoh konfigurasinya :
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
hmm, kenapa kita tidak boleh langsung menambahkan library spring-boot-starter-log4j2 tanpa exclude spring-boot-starter-logging ??
karena..eh karenaa..
Bisa saja sih, tapi kita akan menemui warning dari Slf4j
- Spring-Boot menggunakan slf4j (Simple Logging Facade for Java) untuk library abstraksi / facade terhadap pilihan library logging implementasinya. slf4j ini akan mengecek di waktu compile time, apakah Logback atau Log4j2 yang akan dipakai waktu program Java nya dijalankan.
Misalkan kita tidak exclude spring-boot-starter-logging, yang artinya kita masih ngeload library Logback.
Slf4j akan menemukan 2 library yang aktif, maka akan muncul warning kalau ada 2 library yang aktif. Slf4j hanya bisa memilih salah satu saja.
Slf4j akan memilih salah satunya sebagai implementasi dari logging frameworknya, dan pilihannya tetap adalah Logback
Akibatnya akan sia-sia saja kita menambahkan spring-boot-starter-log4j2 saja, tanpa exclude spring-boot-starter-logging nya.
Apakah kalau kita pakai spring-boot-starter-log4j2 akan terdampak Vulnerability ini ?
Ya..tentu saja, pasti akan ada library log4j2-core.jar di dependency anda.
Didalamnya pasti ada JndiLookup.class yang merupakan pusat Vulnerability / Kerentanannya ini.
Caranya ya pakai mitigasi di : Mitigasi Log4j2 - 1 dan di Mitigasi Log4j2 - 2
Jadi kesimpulannya untuk Spring Boot ?
- Spring-Boot aman ketika kita menggunakan konfigurasi standar dari logging di Spring Boot, yaitu spring-boot-starter-web, dan spring-boot-starter-logging.
- Spring-Boot perlu dicek lagi ketika kita mengubah konfigurasi standard dari logging di Spring Boot dari Logback ke Log4j2. Konfigurasi ini misalnya di file .pom , dengan menambahkan spring-boot-starter-log4j2 dan exclude spring-boot-starter-logging.
- Mitigasinya kalau ternyata kita benar memakai log4j2, adalah sama dengan mitigasi di artikel sebelumnya.