Penyebab Log4j2 Vulnerability
Pendahuluan
Untuk pendahuluan mengenai Vulnerability / Kerentanan Log4j2 ini bisa dilihat di artikel sebelumnya. link
Vulnerability Log4j ini bisa mengakibatkan :
- RCE (Remote Code Execution) attack, yaitu peretas akan mudahnya mengambil Code java dari server remote dan dieksekusi menggunakan JNDI.
- Terekspose nya environment variable, konfigurasi server, konfigurasi database, dan konfigurasi yang diset di server/program korban. Informasi ini bisa dimanfaatkan untuk aksi peretasan selanjutnya.
Mengetahui penyebab mengapa Vulnerability ini terjadi, akan sangat membantu kita dalam melakukan mitigasi terhadapnya.
Sebenarnya code bagian mana sih yang menyebabkan log4j vulnerability ini ?
Ok, sekarang kita coba telusuri secara teknikal.
Kita ambil contoh dari code biasa di dalam REST Controller yang menggunakan log4j2, contoh dari link :
|
|
Ketika line 15 diatas dieksekusi, maka library Log4j2 akan melakukan fungsi JNDI Lookup terhadap line 13 => ${jndi:ldap://localhost/a} sebagai bagian dari fitur Property Support nya Log4j.
Fungsi JNDI Lookup ini didelegasikan ke class org.apache.logging.log4j.core.lookup.JndiLookup. Dan class lookup ini berada di library log4j-core-xxxx.jar. Class ini akan melakukan fungsi lookup terhadap JNDI.
Fungsi-fungsi lookup lainnya juga berada di package ini, seperti JavaLookup, EnvironmentLookup, dll.
Coba kita lihat snipped code dari class org.apache.logging.log4j.core.lookup.JndiLookup ini (saya memakai versi log4j-core-2.14.1.jar):
Didalamnya ada fungsi lookup yang akan dipanggil oleh Log4j ketika menemui parameter ${jndi:xxx}.
|
|
Fungsi lookup ini akan memanggil fungsi jndiManager.lookup(jndiName), yang melakukan proses inisiasi JNDI.
dan kalau kita trace sampai terakhir apa yang dilakukan oleh JNDI lookup, bisa kita lihat dari stack trace sbb :
|
|
Secara aktif, untuk case diatas, class JndiLookup ini melakukan inisiasi LDAP connection ke server yang URL nya tertera di parameter ${jndi:xxx}. diatas. Dan selanjutnya menggunakan library nya Java untuk LDAP connection, dst.
Kapan JNDI lookup ini ditambahkan di library log4j ?
Fitur JNDI Lookup ini ditambahkan Juli 2013 pada release 2.0-beta9 , https://issues.apache.org/jira/browse/LOG4J2-313.
Dan semenjak release 2.10.0, ditambahkan property untuk on/off lookup secara global (sumber dari link dan link), sehingga JNDI Lookup dan lookup-lookup yang lainnya bisa dikonfigurasi on/off nya dengan setting : log4j2.formatMsgNoLookups = true